它是 GLCM 矩阵的结果。GLCM图像中的黑色水平和垂直线是什么意思?他们有问题吗?
N = numel(unique(img)); % img is uint8
glcm = graycomatrix(img, 'NumLevels', N);
imshow(glcm)
它是 GLCM 矩阵的结果。GLCM图像中的黑色水平和垂直线是什么意思?他们有问题吗?
N = numel(unique(img)); % img is uint8
glcm = graycomatrix(img, 'NumLevels', N);
imshow(glcm)
graycomatrix
从图像的缩放版本计算 GLCM。由于缩放过程中的舍入误差,缩放图像中不同强度级别的数量可能少于原始图像中不同强度级别的数量。
考虑以下示例图像:
img = uint8([ 48 161 209 64 133 240 166 227;
184 54 181 33 107 252 242 255
217 191 125 112 204 252 135 201
163 222 66 125 229 140 38 97
252 214 201 191 10 102 242 74
191 74 77 8 163 51 189 186]);
从文档(强调我的):
[glcms,SI] = graycomatrix(___)
返回缩放后的图像 ,SI
用于计算灰度共生矩阵。中的值SI
介于1
和之间NumLevels
。
如果您设置NumLevels
不同强度级别的数量(在本例中为39
)
N = numel(unique(img))
[glcm_scaled, img_scaled] = graycomatrix(img, 'NumLevels', N);
返回的 GLCM 包含39*39
元素。问题是缩放后的图像只有28
不同的强度级别:
>> img_scaled
img_scaled =
8 25 32 10 21 37 26 35
29 9 28 6 17 39 38 39
34 30 20 18 32 39 21 31
25 34 11 20 36 22 6 15
39 33 31 30 2 16 38 12
30 12 12 2 25 8 29 29
>> numel(unique(img_scaled))
ans =
28
因此,GLCM 将有 11 行和 11 列,其中所有条目都为零(黑线)。
如果您不希望这种情况发生,您可以通过查找表映射强度级别:
levels = unique(img);
N = numel(levels);
lut = zeros(256, 1);
for i=1:N;
index = uint16(levels(i)) + 1;
lut(index) = i;
end
img_lut = lut(uint16(img) + 1);
[glcm_mapped, img_mapped] = graycomatrix(img_lut, 'NumLevels', N, 'GrayLimits', []);
通过这样做,与 GLCM 中没有黑线img_mapped
完全相同。请注意,通过为参数img_lut
指定空括号,使用输入图像中的最小和最大灰度值作为限制。GrayLimits
graycomatrix
我怀疑这是问题所在:对于函数graycomatrix
,您提供的'NumLevels'
参数大于图像中唯一灰度的数量。例如,一个 256 级(8 位)的图像将只有 256 个灰度级。在输出中要求 1000 个级别意味着 744 个级别将没有数据!即是的,这是一个问题。您可以使用 . 检查您的图像有多少灰度级numel(unique(I))
。
ps 以后请附上你用来产生问题的代码。
我在自己的 GLCM 实现下看到了相同的行为。问题是我在给定多个灰度级的情况下实现直方图均衡。
我在首先划分之前计算图像的离散化,然后输入以查看是否有任何行或列仅给出零值。