我有此代码:
import cv2
from scipy.stats import kurtosis, skew
def main():
img1 = 'lenna.jpg'
gray_img = cv2.imread(img1, cv2.IMREAD_GRAYSCALE)
print(f'Kurtosis: {kurtosis(gray_img)}')
我想计算给定图像的峰度,但是当我运行此代码时,它显示如下:
返回所有这些值是否正确?在我看来,它应该返回单个值,因为当我在matlab中运行峰度时,它返回1.8561
答案 0 :(得分:5)
默认情况下,您正在kurtosis
上调用axis=0
(see docs),但似乎您正在尝试在整个数组上运行它。因此,您可以尝试axis=None
:
kurtosis(gray_img, axis=None)
示例:
im = np.random.randint(0,256,(5,5))
>>> im
array([[104, 125, 26, 194, 47],
[198, 46, 105, 38, 241],
[211, 115, 62, 196, 169],
[ 92, 184, 212, 100, 117],
[212, 35, 208, 52, 3]])
>>> kurtosis(im)
array([-1.78890733, -1.32154862, -1.66900354, -1.74522902, -1.30434102])
>>> kurtosis(im, axis=None)
-1.3968689968948007
[编辑] :根据您的评论,您正在尝试计算偏斜度,而不是峰度。为此,请使用:
from scipy.stats import kurtosis,skew
skew(gray_img, axis=None)
在matlab中,在上面的数组上,您的代码(直接从您的注释中获取)给出:
im =
104 125 26 194 47
198 46 105 38 241
211 115 62 196 169
92 184 212 100 117
212 35 208 52 3
>> I2 = im2double(im);
>> s=skewness(I2(:))
s =
0.0118
在scipy
中,它给出:
>>> skew(im,axis=None)
0.011819746815198935
[编辑#2] :似乎MATLAB
的默认峰度定义为Pearson's
,而Scipy
的默认峰度定义为Fisher's
。 +1 scipy
比MATLAB
更灵活!因此,您可以使用:
kurtosis(im, None, fisher=False)
要获得相同的结果:
# Scipy:
>>> kurtosis(im,None, fisher=False)
1.6031310031051993
# Matlab:
>> s=kurtosis(I2(:))
s =
1.6031