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的属性之一,您可以通过scikit图像计算。如果您希望计算此功能,则需要将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]