【问题标题】:Black line in GLCM resultGLCM 结果中的黑线
【发布时间】:2016-03-25 18:32:48
【问题描述】:

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

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

【问题讨论】:

    标签: matlab image-processing feature-extraction glcm


    【解决方案1】:

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

    附言以后请附上你用来产生问题的代码。

    【讨论】:

    • 谢谢,但我使用 N = numel(unique(img));它没有被纠正!线条还在!如何选择最佳 NumLevels?
    • 有趣。你试过plot(unique(img)) - 也许灰度分布不均匀(如果是的话,情节将是一条完美的直线)。如果不是,则可能仍有空箱,因为NumLevels 均匀分布在图像范围内 - 产生黑线。此外,当您调整 GLCM 图的大小时,黑线的位置是否会改变?这可能是渲染问题。
    【解决方案2】:

    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(___) 返回缩放图像SI,用于计算灰度共生矩阵。 SI 中的值介于 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 使用输入图像中的最小和最大灰度值作为限制。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】: