Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从图像的灰度共生矩阵计算熵_Python_Numpy_Entropy_Scikit Image_Glcm - Fatal编程技术网

Python 从图像的灰度共生矩阵计算熵

Python 从图像的灰度共生矩阵计算熵,python,numpy,entropy,scikit-image,glcm,Python,Numpy,Entropy,Scikit Image,Glcm,我正在使用skimage库进行大多数图像分析工作 我有一张RGB图像,我打算从图像中提取纹理特征,如熵、能量、同质性和对比度 以下是我正在执行的步骤: from skimage import io, color, feature from skimage.filters import rank rgbImg = io.imread(imgFlNm) grayImg = color.rgb2gray(rgbImg) print(grayImg.shape) # (667,1000), a 2 d

我正在使用
skimage
库进行大多数图像分析工作

我有一张RGB图像,我打算从图像中提取
纹理
特征,如
能量
同质性
对比度

以下是我正在执行的步骤:

from skimage import io, color, feature
from skimage.filters import rank
rgbImg = io.imread(imgFlNm)
grayImg = color.rgb2gray(rgbImg)
print(grayImg.shape)  # (667,1000), a 2 dimensional grayscale image

glcm = feature.greycomatrix(grayImg, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4])
print(glcm.shape) # (256, 256, 1, 4)

rank.entropy(glcm, disk(5)) # throws an error since entropy expects a 2-D array in its arguments

rank.entropy(grayImg, disk(5)) # given an output.
我的问题是,从灰度图像(直接)计算的熵是否与从GLCM(纹理特征)提取的熵特征相同

如果没有,从图像中提取所有纹理特征的正确方法是什么

注:我已提及:

从灰度图像(直接)计算的熵是否与从GLCM(纹理特征)提取的熵特征相同

不,这两种熵是完全不同的:

  • skimage.filters.rank.entropy(grayImg,disk(5))
    生成一个与
    grayImg
    大小相同的数组,该数组包含在圆心位于相应像素、半径为5像素的圆盘上计算的图像的局部熵。看一看,找出熵是如何计算的。该数组中的值对于分割非常有用(下面是一个基于熵的对象检测示例)。如果您的目标是通过单个(标量)值描述图像的熵,则可以使用
    skimage.measure.shannon\u熵(grayImg)
    。此函数基本上将以下公式应用于完整图像:

    其中是灰度数(8位图像为256),是像素具有灰度的概率,是对数函数的基。当设置为2时,返回值以位测量
  • 灰度共生矩阵(GLCM)是图像上给定偏移量处共生灰度值的直方图。为了描述图像的纹理,通常从为不同偏移量计算的多个共生矩阵中提取诸如熵、能量、对比度、相关性等特征。在这种情况下,熵的定义如下:

    其中和再次分别是灰度级的数量和对数函数的底,并表示由指定偏移量分隔的两个像素具有强度和的概率。不幸的是,熵不是GLCM的属性之一,您可以通过scikit图像计算。如果您希望计算此功能,则需要将GLCM传递给
  • *在这篇文章最后一次编辑时,scikit图像的最新版本是0.13.1

    如果没有,从图像中提取所有纹理特征的正确方法是什么

    有各种各样的特征来描述图像的纹理,例如局部二值模式、Gabor滤波器、小波、Laws的遮罩和许多其他特征。Haralick是最流行的纹理描述符之一。通过GLCM特征描述图像纹理的一种可能方法包括计算不同偏移的GLCM(每个偏移通过距离和角度定义),并从每个GLCM中提取不同的属性

    让我们考虑例如三个距离(1, 2和3像素),四个角度(0, 45, 90和135度)和两个属性(能量和均匀性)。这将导致偏移量(因此为12个GLCM)和尺寸特征向量。代码如下:

    import numpy as np
    from skimage import io, color, img_as_ubyte
    from skimage.feature import greycomatrix, greycoprops
    from sklearn.metrics.cluster import entropy
    
    rgbImg = io.imread('https://i.stack.imgur.com/1xDvJ.jpg')
    grayImg = img_as_ubyte(color.rgb2gray(rgbImg))
    
    distances = [1, 2, 3]
    angles = [0, np.pi/4, np.pi/2, 3*np.pi/4]
    properties = ['energy', 'homogeneity']
    
    glcm = greycomatrix(grayImg, 
                        distances=distances, 
                        angles=angles,
                        symmetric=True,
                        normed=True)
    
    feats = np.hstack([greycoprops(glcm, prop).ravel() for prop in properties])
    
    使用此图像获得的结果:

    :


    你能详细说明你的答案吗?解释您试图绘制的内容?我想知道当设置了
    normed=True
    时,将
    glcm
    传递给
    skimage.measure.shannon_entropy()
    是否正确?我们为什么不使用
    normed=False
    ?要使熵公式成立,p(·)必须是一个概率,即GLCM项目的总和必须是1。这就是为什么参数
    normed
    必须设置为
    True
    import numpy as np
    from skimage import io, color, img_as_ubyte
    from skimage.feature import greycomatrix, greycoprops
    from sklearn.metrics.cluster import entropy
    
    rgbImg = io.imread('https://i.stack.imgur.com/1xDvJ.jpg')
    grayImg = img_as_ubyte(color.rgb2gray(rgbImg))
    
    distances = [1, 2, 3]
    angles = [0, np.pi/4, np.pi/2, 3*np.pi/4]
    properties = ['energy', 'homogeneity']
    
    glcm = greycomatrix(grayImg, 
                        distances=distances, 
                        angles=angles,
                        symmetric=True,
                        normed=True)
    
    feats = np.hstack([greycoprops(glcm, prop).ravel() for prop in properties])
    
    In [56]: entropy(grayImg)
    Out[56]: 5.3864158185167534
    
    In [57]: np.set_printoptions(precision=4)
    
    In [58]: print(feats)
    [ 0.026   0.0207  0.0237  0.0206  0.0201  0.0207  0.018   0.0206  0.0173
      0.016   0.0157  0.016   0.3185  0.2433  0.2977  0.2389  0.2219  0.2433
      0.1926  0.2389  0.1751  0.1598  0.1491  0.1565]