对非矩形图像区域使用skimage

时间:2017-06-08 20:24:31

标签: feature-extraction scikit-image image-masking glcm

让我们说我关心的是我想要计算GLCM的图像的一部分,而不是矩形。我该怎么办呢?我做了一个掩盖程序,将我不关心的部分图像归零,我只是不知道如何采取这个"蒙面的"图像没有考虑图像的归零部分...

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

如果您能够将零强度值分配给背景像素,则只需丢弃整个图像的GLCM的第一行和第一列,即可获得感兴趣区域的GLCM。这实际上等于摆脱那些涉及背景像素的共现。

演示

以下代码段演示了如何从黑色背景上的圆形对象的GLCM中提取几个Haralick特征:

circular object

In [25]: import numpy as np

In [26]: from skimage import io

In [27]: from skimage.feature import greycomatrix, greycoprops

In [28]: img = io.imread('https://i.stack.imgur.com/6ESoP.png')

In [29]: glcm = greycomatrix(img, 
    ...:                     distances=[1, 2], 
    ...:                     angles=[0, np.pi/4, np.pi/2, 3*np.pi/4],
    ...:                     symmetric=True,
    ...:                     normed=False)
    ...: 

In [30]: glcm_br = glcm[1:, 1:, :, :]

In [31]: glcm_br_norm = np.true_divide(glcm_br, glcm_br.sum(axis=(0, 1)))

In [32]: np.set_printoptions(threshold=1000, precision=4)

In [33]: props = ['energy', 'homogeneity']

In [34]: feats_br = np.hstack([greycoprops(glcm_br_norm, p).ravel() for p in props])

In [35]: feats_br
Out[35]: 
array([ 0.0193,  0.0156,  0.0173,  0.0166,  0.0151,  0.0156,  0.0136,
        0.0166,  0.1255,  0.0788,  0.0978,  0.0929,  0.0782,  0.0788,
        0.0545,  0.0929])

请注意,在删除完整图像的第一行和GLCM的第一列后,必须对GLCM进行标准化。

注意:后缀_br代表背景已移除