1 回答
TA贡献1846条经验 获得超7个赞
让我们慢慢浏览代码。首先我们导入必要的模块,加载图像类型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))
添加回答
举报