从图像计算峰度

asd*_*das 2 python numpy scipy python-3.x

我有这个代码:

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)}')
Run Code Online (Sandbox Code Playgroud)

我想计算给定图像的峰度,但是当我运行此代码时,它显示如下:

在此输入图像描述

归还所有这些价值观是否正确?在我的想法中它应该返回一个值,因为当我在matlab中运行kurtosis时,它会返回1.8561

sac*_*cuL 5

您所呼叫kurtosisaxis=0默认(参见文档),但似乎你想整个阵列上运行它.所以你可以尝试axis=None:

kurtosis(gray_img, axis=None)
Run Code Online (Sandbox Code Playgroud)

示例:

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
Run Code Online (Sandbox Code Playgroud)

[编辑]:根据你的评论,你试图计算偏度,而不是峰度.为此,请使用:

from scipy.stats import kurtosis,skew
skew(gray_img, axis=None)
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

scipy,它给出:

>>> skew(im,axis=None)
0.011819746815198935
Run Code Online (Sandbox Code Playgroud)

[编辑#2]:似乎MATLAB默认的峰度定义是Pearson's,而Scipys是Fisher's.+1 scipy比更灵活MATLAB!所以你可以使用:

kurtosis(im, None, fisher=False)
Run Code Online (Sandbox Code Playgroud)

要获得相同的结果:

# Scipy:
>>> kurtosis(im,None, fisher=False)
1.6031310031051993
# Matlab:
>>  s=kurtosis(I2(:))

s =

    1.6031
Run Code Online (Sandbox Code Playgroud)