从图像的GLCM计算熵

时间:2016-12-01 20:38:22

标签: python numpy entropy scikit-image glcm

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

我有一个RGB图像,我打算从图像中提取textureentropyenergyhomogeneitycontrast个功能。

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

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(纹理特征)中提取的熵特征相同?

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

注意:我已经提到过:

Entropy - skimage

GLCM - Texture features

2 个答案:

答案 0 :(得分:16)

  

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

不,这两个熵相当不同:

  1. skimage.filters.rank.entropy(grayImg, disk(5))生成一个与grayImg大小相同的数组,其中包含在圆盘上计算的图像上的局部熵,其中心位于相应的像素,半径为5像素。查看Entropy (information theory)以了解如何计算熵。此数组中的值对于分段很有用(按照this link查看基于熵的对象检测的示例)。如果您的目标是通过单个(标量)值描述图像的熵,则可以使用skimage.measure.shannon_entropy(grayImg)。此功能基本上将以下公式应用于完整图像:
    entropy
    其中n是灰度级数(8位图像为256),probability是像素具有灰度级intensity的概率,base是基数对数函数。当base设置为2时,返回的值将以
  2. 衡量
  3. 灰度级共生矩阵(GLCM)是在图像上的给定偏移处的共同出现的灰度值的直方图。为了描述图像的纹理,通常从针对不同偏移计算的若干共现矩阵中提取诸如熵,能量,对比度,相关性等的特征。在这种情况下,熵定义如下:
    entropy of GLCM
    其中nbase分别是灰度级的数量和对数函数的基数,而GLCM element代表两个像素由具有强度的指定偏移量分开的概率{ {3}}和intensity。不幸的是,熵不是您可以通过scikit-image * 计算的GLCM的属性之一。如果您希望计算此功能,则需要将GLCM传递给j
  4. * 在本文最后一次编辑时,最新版本的scikit-image为0.13.1。

      

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

    描述图像纹理的功能有很多种,例如局部二进制图案,Gabor滤波器,小波,Laws'面具和许多其他人。 Haralick的skimage.measure.shannon_entropy是最流行的纹理描述符之一。通过GLCM特征描述图像纹理的一种可能方法包括计算不同偏移的GLCM(每个偏移通过距离和角度定义),并从每个GLCM中提取不同的属性。

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

    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])
    

    使用此图片获得的结果:

    24

    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]
    

答案 1 :(得分:0)

from skimage.feature import greycomatrix, greycoprops

    dis = (greycoprops(glcm, 'dissimilarity'))
    plt.hist(dis.ravel(), normed=True, bins=256, range=(0, 30),facecolor='0.5');plt.show()