峰度:峰度是衡量一组数据分布曲线的陡峭程度。定义公式如下,但一般使用时不会使用定义式:
其中μ为均值, σ为标准差, μ4为四阶中心距。实际应用一般使用如下公式:
若峰度大于0,则说明该组数据的分布曲线相较于正态分布更加陡峭;若峰度小于0,则说明该组数据的分布曲线相较于正态分布更加平缓。换言之,峰度越大,则数据在靠近均值的部分分布得越多,在距离均值较远的部分分布得较少。
import cv2 as cv
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import os,time
from functools import wraps
def timeCount(func):
'''
函数耗时计时装饰器
'''
@wraps(func)
def wrapper(*args, **kwargs):
timeA = time.time()
result = func(*args, **kwargs)
print('耗时:{:6.3} 秒, {}'.format(time.time()-timeA, func.__name__))
return result
return wrapper
#1.通过pandas实现
y=[]
s=pd.Series(y) #转为series
print('峰度:',s.kurt())
#2.依据公式手动实现
def GetHist_kurt(hist):
'''
计算灰度直方图峰度方法
等价于pandas:pd.Series(data).kurt()
'''
m4,m2= 0,0
n = len(hist)
avg = np.mean(hist)
Func1 = n*(n+1)*(n-1)/(n-2)/(n-3)
Func2 = 3*(n-1)**2/(n-2)/(n-3)
for i in hist:
m4+=(i-avg)**4
m2+=(i-avg)**2
kurt_Value=Func1*m4/m2**2-Func2
return kurt_Value
#运用
@timeCount
def Hist_Kurt(src,name):
'''
src:原图
name:图片名称
该函数作用:求图像直方图的峰度,判断高亮度的图像被遮挡程度.
'''
if len(src.shape) == 2:
gray = src
else:
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
#获取直方图
hist = cv.calcHist([gray], [0], None, [256], [0,256]).ravel()
x = np.arange(0,256,1)
y = hist[:]
s=pd.Series(y) #list转为series
KurtValue = s.kurt()
plt.plot(x,y,'-',label = 'original values')
plt.xlabel('hist')
plt.ylabel('count')
plt.title('Hist-View')
plt.show()
if abs(255-KurtValue) < 2:
print('无遮挡')
return False,name
else:
print('有遮挡')
return True,name
结果如下:被黑色遮挡的图片都被识别出来。
原理是:对应未被遮挡的高亮度图片,其灰度直方图的峰度接近255.也就是说,没被遮挡的情况下,直方图瘦高,峰度也高。
当随着被遮挡的部分越来越大,直方图也越来越矮肥,峰度值也随之减小。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)