从图像的 GLCM 计算熵
回答问题
我使用skimage库进行大部分图像分析工作。
我有一个 RGB 图像,我打算从图像中提取texture特征,如entropy、energy、homogeneity和contrast。
以下是我正在执行的步骤:
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(纹理特征)中提取的熵特征相同?
如果不是,从图像中提取所有纹理特征的正确方法是什么?
注:我已经提到过:
熵 - skimage
GLCM - 纹理特征
Answers
从灰度图像(直接)计算的熵是否与从 GLCM 提取的熵特征(纹理特征)相同?
不,这两个熵是完全不同的:
1.skimage.filters.rank.entropy(grayImg, disk(5))产生一个与grayImg大小相同的数组,其中包含在圆盘上计算的图像的局部熵,圆盘以相应像素为中心,半径为 5 个像素。看一下Entropy (信息论) 了解如何计算熵。此数组中的值对于分割很有用(请关注此链接以查看基于熵的对象检测的示例)。如果您的目标是通过单个(标量)值来描述图像的熵,您可以使用skimage.measure.shannon_entropy(grayImg)。此函数基本上将以下公式应用于完整图像:

在哪里
是灰度级数(8 位图像为 256),
是像素具有灰度的概率
和
是对数函数的底。什么时候
设置为 2,返回值以 bits 为单位。
- 灰度共生矩阵 (GLCM) 是图像上给定偏移处的共生灰度值的直方图。为了描述图像的纹理,通常从针对不同偏移量计算的几个共现矩阵中提取特征,例如熵、能量、对比度、相关性等。在这种情况下,熵定义如下:

在哪里
和
再次分别是灰度级数和对数函数的底,并且
代表由指定偏移量分隔的两个像素具有强度的概率
和
。不幸的是熵不是您可以通过 scikit-image 计算的 GLCM 的属性之一*。如果你想计算这个特性,你需要将 GLCM 传递给skimage.measure.shannon_entropy。
*在本文最后一次编辑时,scikit-image 的最新版本是 0.13.1。
如果不是,从图像中提取所有纹理特征的正确方法是什么?
有各种各样的特征来描述图像的纹理,例如局部二进制模式、Gabor 滤波器、小波、劳斯掩码等等。 Haralick 的GLCM是最流行的纹理描述符之一。通过 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://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/f27d3b297c_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]
更多推荐

所有评论(0)