问题是您必须将整数数组传递给greycomatrix
,但np.nan
具有类型float
(有关详细信息,请查看此线程)。因此,您无法将 ROI 之外的像素编码为NaN
.
处理非矩形 ROI 的近似解决方法是将 ROI 之外的像素设置为0
并使用mahotas库中的函数haralick
。此函数返回从四个不同 GLCM 中提取的 13 个 Haralick 特征,对应于四个二维方向和距离参数的特定值。
从文档中:
ignore_zeros
可用于让函数忽略任何零值像素(作为背景)。
总之,您需要屏蔽那些落在 ROI 之外的像素,并ignore_zeros
在True
调用haralick
.
演示
首先,让我们生成一些模拟数据:
In [213]: import numpy as np
In [214]: shape = (3, 4)
In [215]: levels = 8
In [216]: np.random.seed(2017)
In [217]: x = np.random.randint(0, levels, size=shape)
In [218]: x
Out[218]:
array([[3, 1, 6, 5],
[2, 0, 2, 2],
[3, 7, 7, 7]])
然后我们必须从图像中删除所有零,因为在这种方法中,零强度级别是为 ROI 之外的像素保留的。值得指出的是,将强度合并0
为1
单一强度1
会导致结果不准确。
In [219]: x[x == 0] = 1
In [220]: x
Out[220]:
array([[3, 1, 6, 5],
[2, 1, 2, 2],
[3, 7, 7, 7]])
下一步包括为 ROI 之外的像素定义掩码(在这个玩具示例中,图像的四个角)并将这些像素设置为0
.
In [221]: non_roi = np.zeros(shape=shape, dtype=np.bool)
In [222]: non_roi[np.ix_([0, -1], [0, -1])] = True
In [223]: non_roi
Out[223]:
array([[ True, False, False, True],
[False, False, False, False],
[ True, False, False, True]], dtype=bool)
In [224]: x[non_roi] = 0
In [225]: x
Out[225]:
array([[0, 1, 6, 0],
[2, 1, 2, 2],
[0, 7, 7, 0]])
我们现在可以从非矩形 ROI 的 GLCM 中执行特征提取:
In [226]: import mahotas.features.texture as mht
In [227]: features = mht.haralick(x, ignore_zeros=True)
In [228]: features.size
Out[228]: 52
In [229]: features.ravel()
Out[229]: array([ 0.18 , 5.4 , 0.5254833 , ..., 0.81127812,
-0.68810414, 0.96300727])
检查共现矩阵的外观可能很有用。例如,“右侧像素”GLCM 将是:
In [230]: mht.cooccurence(x, 0)
Out[230]:
array([[0, 1, 0, ..., 0, 1, 2],
[1, 0, 2, ..., 0, 1, 0],
[0, 2, 2, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[1, 1, 0, ..., 0, 0, 0],
[2, 0, 0, ..., 0, 0, 2]])