GLCM结果中的黑线

时间:2015-12-19 00:30:02

标签: matlab image-processing feature-extraction glcm

这是GLCM矩阵的结果。 GLCM图像中黑色水平线和垂直线的含义是什么?他们是个问题吗?

N = numel(unique(img)); % img is uint8
glcm = graycomatrix(img, 'NumLevels', N);
imshow(glcm)

GLCM matrix

3 个答案:

答案 0 :(得分:1)

我怀疑这是问题所在:对于函数graycomatrix,您提供了一个'NumLevels'参数,该参数大于图像中唯一灰度级的数量。例如,256级(8位)图像将只有256个灰度级。在输出中要求1000个级别意味着744级别将没有数据!即是的,这是一个问题。您可以使用numel(unique(I))检查图片的格式级别。

P.S。将来,请附上用于生成问题的代码。

答案 1 :(得分:1)

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]);

来自documentation(强调我的):

  

[glcms,SI] = graycomatrix(___)返回用于计算灰度级共生矩阵的缩放图像SISI中的值介于1NumLevels之间。

如果您将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', []);

通过这样做,img_mappedimg_lut完全相同,并且GLCM中没有黑线。请注意,通过为GrayLimits参数指定空括号,graycomatrix会将输入图像中的最小和最大灰度值用作限制。

答案 2 :(得分:0)

我在自己的 GLCM 实现下看到了相同的行为。 问题是我在给定多个灰度级的情况下实施直方图均衡。

我先计算图像的离散化,然后再进行分割,然后输入查看是否有任何行或列仅给出零值。