我正在尝试基于从GLCM中提取的特征构建图像分类模型。 我想掩盖一些图像以改善模型,当然我不希望GLCM考虑这些像素。基于以下post,我已经实施并进行了测试,以确保GLCM对于遮罩图像可以正常工作:
2)将图像转换为int32类型,并执行以下操作:
{{1}}
因此,在此测试中,如果GLCM不受蒙版像素的影响,我希望对于蒙版和裁切图像,它都是相同的矩阵。但实际上,矩阵是不同的。
我对GLCM如何工作的理解正确吗?从理论上讲,这两个矩阵应该相等吗?
答案 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))