python取非_Python:取非矩形区域的GLCM

问题是您必须向greycomatrix传递一个整数数组,但是np.nan的类型是float(有关详细信息,请查看this thread)。因此,您不能将ROI之外的像素编码为NaN。在

处理非矩形ROI的一个近似解决方法是将ROI之外的像素设置为0,并使用mahotas库中的函数haralick。此函数返回从四个不同的GLCM中提取的13个Haralick特征,对应于四个二维方向和距离参数的特定值。在

根据文件:ignore_zeros can be used to have the function ignore any zero-valued

pixels (as background).

总之,您需要遮罩那些不在ROI范围内的像素,并在对haralick的调用中将ignore_zeros设置为True。在

演示

首先,让我们生成一些模拟数据: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会导致结果不准确。在

^{pr2}$

下一步是为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]])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值