为什么在屏蔽图像和裁剪图像时会得到不同的 glcms
Why do I get different glcms when masking an image and when cropping it
我正在尝试基于从 GLCM 中提取的特征构建图像分类模型。
我想屏蔽一些图像以改进模型,当然 我不希望 GLCM 考虑这些像素。基于以下 我已经实施并进行了 测试以确保 GLCM 对蒙版图像正确工作:
1) 拍摄图像并创建裁剪版本和遮罩版本(使用与裁剪相同的像素)。
2) 将图像转换为 int32 类型并执行以下操作:
#adding 1 to all pixels and setting masked pixels as zero.
mask_img+=1
crop_img+=1
mask_img[:,:,2][:,int(img.shape[1]/2):int(img.shape[1])] = 0
glcm_crop = greycomatrix(crop_img[:,:,2],
levels=257,
distances=1,
angles=0,
symmetric=True,
normed=True)
glcm_masked = greycomatrix(mask_img[:,:,2],
levels=257,
distances=1,
angles=0,
symmetric=True,
normed=True)
#discarding the first row and column that represent zero value pixels
glcm_masked =glcm_masked[1:, 1:, :, :]
glcm_crop = glcm_crop[1:, 1:, :, :]
所以在这个测试中,如果 GLCM 不受蒙版像素的影响,我预计蒙版和裁剪图像的矩阵都是相同的。但实际上矩阵是不同的。
我对 GLCM 工作原理的理解正确吗?这两个矩阵应该相等在理论上有意义吗?
让我们慢慢看代码。首先我们导入必要的模块,加载类型 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))
我正在尝试基于从 GLCM 中提取的特征构建图像分类模型。
我想屏蔽一些图像以改进模型,当然 我不希望 GLCM 考虑这些像素。基于以下
1) 拍摄图像并创建裁剪版本和遮罩版本(使用与裁剪相同的像素)。
2) 将图像转换为 int32 类型并执行以下操作:
#adding 1 to all pixels and setting masked pixels as zero.
mask_img+=1
crop_img+=1
mask_img[:,:,2][:,int(img.shape[1]/2):int(img.shape[1])] = 0
glcm_crop = greycomatrix(crop_img[:,:,2],
levels=257,
distances=1,
angles=0,
symmetric=True,
normed=True)
glcm_masked = greycomatrix(mask_img[:,:,2],
levels=257,
distances=1,
angles=0,
symmetric=True,
normed=True)
#discarding the first row and column that represent zero value pixels
glcm_masked =glcm_masked[1:, 1:, :, :]
glcm_crop = glcm_crop[1:, 1:, :, :]
所以在这个测试中,如果 GLCM 不受蒙版像素的影响,我预计蒙版和裁剪图像的矩阵都是相同的。但实际上矩阵是不同的。
我对 GLCM 工作原理的理解正确吗?这两个矩阵应该相等在理论上有意义吗?
让我们慢慢看代码。首先我们导入必要的模块,加载类型 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))