Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么遮罩图像和裁剪图像时会得到不同的GLCM_Python_Image Processing_Mask_Scikit Image_Glcm - Fatal编程技术网

Python 为什么遮罩图像和裁剪图像时会得到不同的GLCM

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[:,:

我正试图建立一个基于从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

将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(),谢谢你,这是精辟的解释。