我一直在使用滑雪图像的SLIC实现来分割超像素中的图像 . 我想使用GLCM从这些超像素中提取其他特征以解决分类问题 . 这些超像素不是矩形 . 在MATLAB中,您可以将像素设置为NaN,算法将忽略它们(link) . 我可以使用它在超像素周围制作边界框,然后将未使用的像素设置为NaN .
但是,skimage中的greycomatrix函数与MATLAB实现完全不同 . 将像素设置为NaN时,函数会在断言时失败,以检查所有值是否都大于0 .
是否有可用于非矩形ROI的Python实现?
我一直在使用滑雪图像的SLIC实现来分割超像素中的图像 . 我想使用GLCM从这些超像素中提取其他特征以解决分类问题 . 这些超像素不是矩形 . 在MATLAB中,您可以将像素设置为NaN,算法将忽略它们(link) . 我可以使用它在超像素周围制作边界框,然后将未使用的像素设置为NaN .
但是,skimage中的greycomatrix函数与MATLAB实现完全不同 . 将像素设置为NaN时,函数会在断言时失败,以检查所有值是否都大于0 .
是否有可用于非矩形ROI的Python实现?
2 回答
虽然
mahotas
也是一个优秀的计算机视觉库,但是没有必要停止使用skimage
来做到这一点 .正如@Tonechas指出的那样,必要的是将那些NaN值设置为整数,因为
np.nan
的类型为float
,greycomatrix
函数需要一个整数数组 .最简单的选择是将那些
NaN
's to zero but, if you already have zero values in your pixels and don'想要混合它们,你可以选择任何其他常量 . 之后,您所要做的就是从GLCM中过滤出所选择的值(再次,通常为零) .要理解这意味着什么,让我们看看
skimage
告诉我们greycomatrix function的输出:换句话说,数组的前两个维度定义了一个矩阵,告诉我们两个不同的值有多少次相隔一定距离 . 请注意,GLCM确保 not 保持输入数组的形状 . 那些行和列告诉我们值是如何相关的 .
知道了这一点,很容易过滤掉ROI之外的值(想象我们将NaN设置为零):
现在,您可以轻松计算过滤后的GLCM的Haralick属性 . 例如:
问题是您必须将整数数组传递给
greycomatrix
,但np.nan
的类型为float
(有关详细信息,请查看this thread) . 因此,您无法将ROI外的像素编码为NaN
.处理非矩形ROI的近似解决方法是将ROI外的像素设置为
0
并使用mahotas库中的函数haralick
. 此函数返回从四个不同GLCM中提取的13个Haralick特征,对应于四个2-D方向和距离参数的特定值 .从文档:
总之,您需要屏蔽那些超出ROI的像素,并在调用
haralick
时将ignore_zeros
设置为True
.DEMO
首先,让我们生成一些模拟数据:
然后我们必须从图像中移除所有零,因为在该方法中,零强度级别被保留用于ROI之外的像素 . 值得指出的是,将强度
0
和1
合并为单一强度1
会在结果中引入不准确性 .下一步包括为ROI外部的像素定义遮罩(在此玩具示例中,图像的四个角)并将这些像素设置为
0
.我们现在可以从GLCM的非矩形ROI中执行特征提取:
检查共生矩阵的外观可能很有用 . 例如,“像素到右边”GLCM将是: