【问题标题】:Why do I get different glcms when masking an image and when cropping it为什么在屏蔽图像和裁剪图像时会得到不同的 glcms
【发布时间】:2020-09-23 17:39:10
【问题描述】:

我正在尝试基于从 GLCM 提取的特征构建图像分类模型。 我想屏蔽一些图像以改进模型,当然我不希望 GLCM 考虑这些像素。基于以下post,我已经实现并进行了测试以确保 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 工作原理的理解是否正确?这两个矩阵应该相等在理论上有意义吗?

【问题讨论】:

  • 你是如何定义mask_imgcrop_img的?
  • Tonechas crop_img = img[0:img.shape[0],0:int(img.shape[1]/2)] 和 mask_img 只是 img 的一个副本。并且屏蔽是在我之前发布的代码中完成的: mask_img[:,:,2][:,int(img.shape[1]/2):int(img.shape[1])]=0
  • 您是如何制作副本的?喜欢这个mask_copy = img.copy()(深拷贝)?喜欢这个mask_copy = img[:](浅拷贝)?或者像这样mask_copy = img(只是一个新别名,根本没有副本)`?
  • @Tonechas 我确实使用了 mask_copy = img.copy()

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


【解决方案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))

如果你运行上面所有的 sn-ps,你会得到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))

【讨论】:

  • 谢谢你,这解释得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2023-03-24
  • 1970-01-01
  • 2018-09-23
相关资源
最近更新 更多