为什么在遮罩图像和裁剪图像时出现不同的glcms

时间:2020-06-04 16:30:37

标签: python image-processing mask scikit-image glcm

我正在尝试基于从GLCM中提取的特征构建图像分类模型。 我想掩盖一些图像以改善模型,当然我不希望GLCM考虑这些像素。基于以下post,我已经实施并进行了测试,以确保GLCM对于遮罩图像可以正常工作

1)拍摄图像并创建裁剪的版本和蒙版(以与裁剪相同的像素)。
2
3 4

2)将图像转换为int32类型,并执行以下操作:

{{1}}

因此,在此测试中,如果GLCM不受蒙版像素的影响,我希望对于蒙版和裁切图像,它都是相同的矩阵。但实际上,矩阵是不同的。

我对GLCM如何工作的理解正确吗?从理论上讲,这两个矩阵应该相等吗?

1 个答案:

答案 0 :(得分:1)

让我们慢慢看一下代码。首先,我们导入必要的模块,加载类型为np.int32的图像,并将图像中所有像素的像素强度增加1

import numpy as np
from skimage import data
from skimage.feature import greycomatrix

img = data.astronaut().astype(np.int32) + 1

然后我们定义图像的形状和强度级别的数量:

rows, cols, _ = img.shape
levels = 256

现在,我们裁剪图像的蓝色通道,以便仅保留左半部分:

crop_img = img[:, :cols//2, 2]

图像蓝色通道的右半部分被这样屏蔽:

mask_img = img[:, :, 2].copy()
mask_img[:, cols//2:] = 0

对于此示例,包装GLCM计算很方便:

def glcm_wrapper(arr):
    glcm = greycomatrix(arr, levels=levels+1, distances=[1], angles=[0])
    return np.squeeze(glcm)[1:, 1:]

我们准备检查通过两种方法获得的GLCM是否相同:

glcm_crop = glcm_wrapper(crop_img)
glcm_mask = glcm_wrapper(mask_img)

print(np.array_equal(glcm_crop, glcm_mask))

如果运行以上所有代码段,您将得到True

请务必注意,如果将参数normed=True传递给greycomatrix,则生成的GLCM会有所不同。如果要对矩阵进行归一化,则必须在删除第一行和第一列后对GLCM进行归一化。试试这个说服自己:

glcm_crop = glcm_crop/glcm_crop.sum()
glcm_mask = glcm_mask/glcm_mask.sum()
print(np.allclose(glcm_crop, glcm_mask))