Hab*_*bba 2 python image-processing scikit-image mahotas glcm
我一直在使用 skimage 的 SLIC 实现来以超像素分割图像。我想使用 GLCM 从这些超像素中提取附加特征来解决分类问题。这些超像素不是矩形的。在 MATLAB 中,您可以将像素设置为 NaN,它们将被算法忽略(链接)。我可以用它来在超像素周围制作边界框,然后将未使用的像素设置为 NaN。
然而,skimage 中的greycomatrix函数的工作方式与 MATLAB 实现并不完全相同。将像素设置为 NaN 时,该函数无法断言检查所有值是否大于 0。
是否有可用的 Python 实现能够处理非矩形 ROI?
虽然mahotas它也是一个优秀的计算机视觉库,但没有必要停止使用skimage来做到这一点。
正如@Tonechas 所指出的,必要的是将这些 NaN 值设置为整数,因为有np.nan类型float并且greycomatrix函数需要整数数组。
最简单的选择是将这些设置NaN为零,但是,如果您的像素中已经有零值并且不想混合它们,则可以选择任何其他常数。之后,您所要做的就是从 GLCM 中过滤掉所选值(通常为零)。
为了理解这意味着什么,让我们看看函数skimage的输出告诉我们什么:greycomatrix
4-D ndarray
[...] 值 P[i,j,d,theta] 是灰度级 j 出现在距灰度级 i 距离 d 且与灰度级 i 成角度 θ 处的次数。如果normed为False,则输出为uint32类型,否则为float64。尺寸为:层数 x 层数 x 距离数 x 角度数。
换句话说,数组的前两个维度定义了一个矩阵,该矩阵告诉我们两个不同值相距一定距离的次数。请注意,GLCM 不会保留输入数组的形状。这些行和列告诉我们这些值是如何关联的。
知道了这一点,就可以很容易地过滤掉 ROI 之外的值(想象一下我们将这些 NaN 设置为零):
glcm = greycomatrix(img, [1], [0])  # Calculate the GLCM "one pixel to the right"
filt_glcm = glcm[1:, 1:, :, :]           # Filter out the first row and column
现在您可以轻松计算过滤后的 GLCM 的 Haralick 属性。例如:
greycoprops(filt_glcm, prop='contrast')