Python 为什么遮罩图像和裁剪图像时会得到不同的GLCM
我正试图建立一个基于从GLCM中提取的特征的图像分类模型。 我想屏蔽一些图像以改进模型,当然我不希望GLCM考虑这些像素。基于以下内容,我实施并执行了测试,以确保GLCM对遮罩图像正常工作: 1) 拍摄图像并创建裁剪版本和遮罩版本(与裁剪的像素相同)。Python 为什么遮罩图像和裁剪图像时会得到不同的GLCM,python,image-processing,mask,scikit-image,glcm,Python,Image Processing,Mask,Scikit Image,Glcm,我正试图建立一个基于从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) 将图像转换为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
:
将numpy导入为np
从浏览导入数据
从skimage.feature导入灰色矩阵
img=data.automotor().astype(np.int32)+1
然后我们定义图像的形状和强度级别的数量:
行、列、\ug=img.shape
级别=256
现在我们裁剪图像的蓝色通道,以便只保留左半部分:
crop_img = img[:, :cols//2, 2]
图像蓝色通道的右半部分被遮罩如下:
mask_img=img[:,:,2].copy()
mask_img[:,cols//2:]=0
出于本示例的考虑,可以方便地包装GLCM计算:
def glcm_包装器(arr):
glcm=灰色矩阵(arr,标高=标高+1,距离=[1],角度=[0])
返回np.挤压(glcm)[1:,1:]
我们准备检查通过两种方法获得的GLCM是否相同:
glcm\U crop=glcm\U包装(crop\U img)
glcm_掩码=glcm_包装(掩码img)
打印(np.array_equal(glcm_裁剪,glcm_遮罩))
如果运行以上所有代码段,您将得到True
需要注意的是,如果将参数normed=True
传递给greycomatrix
,则得到的GLCM是不同的。如果您希望对矩阵进行规范化,则必须在删除第一行和第一列后对GLCM进行规范化。试着说服自己:
glcm\u-crop=glcm\u-crop/glcm\u-crop.sum()
glcm_mask=glcm_mask/glcm_mask.sum()
打印(np.allclose(glcm\U裁剪、glcm\U遮罩))
您是如何定义mask\u img
和crop\u img
?Tonechas crop\u img=img[0:img.shape[0],0:int(img.shape[1]/2]),mask\u img只是img的一个副本。屏蔽是在我之前发布的代码中完成的:mask_img[:,:,2][:,int(img.shape[1]/2):int(img.shape[1])]=0您是如何制作副本的?像这样的mask\u copy=img.copy()
(深度复制)?像这样的mask\u copy=img[:]
(浅拷贝)?或者像这样的mask\u copy=img
(只是一个新的别名,根本没有副本)`@Tonechas我确实使用了mask\u copy=img.copy(),谢谢你,这是精辟的解释。