【无标题】Python 峰度计算,以及峰度在图像处理中的刁钻运用。

1.什么是峰度?

峰度:峰度是衡量一组数据分布曲线的陡峭程度。定义公式如下,但一般使用时不会使用定义式:
在这里插入图片描述
其中μ为均值, σ为标准差, μ4为四阶中心距。实际应用一般使用如下公式:
在这里插入图片描述
若峰度大于0,则说明该组数据的分布曲线相较于正态分布更加陡峭;若峰度小于0,则说明该组数据的分布曲线相较于正态分布更加平缓。换言之,峰度越大,则数据在靠近均值的部分分布得越多,在距离均值较远的部分分布得较少。

2.python 如何计算峰度?

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.也就是说,没被遮挡的情况下,直方图瘦高,峰度也高。
当随着被遮挡的部分越来越大,直方图也越来越矮肥,峰度值也随之减小。
【无标题】Python 峰度计算,以及峰度在图像处理中的刁钻运用。_第1张图片

你可能感兴趣的:(opencv,opencv)