MATLAB中的相邻灰度依赖矩阵(NGLDM)

时间:2014-07-29 16:02:45

标签: algorithm matlab image-processing matrix feature-extraction

我想计算几个纹理特征(即:小/大数强调,数字非均匀性,第二矩和熵)。这些可以从相邻灰度级依赖矩阵计算。我正在努力理解/实施这个。关于这种方法的信息非常少(可公开获得)。

根据this paper

  

此矩阵采用二维数组 Q 的形式,其中 Q(i,j)可视为已处理图像的灰度变化的频率计数。它具有与图像的直方图类似的含义。该数组是N g ×N r 其中N g 是可能的灰度级数,N r 是图像中像素的可能邻居数。

     

如果图像函数 f(i,j)是离散的,那么很容易计算 Q 矩阵(对于正整数 d,a < / em>)通过计算 f(i,j)中的每个元素与其邻居之间的差异等于或小于某个距离 a 的次数< EM> d

以下是同一篇论文的例子( d = 1,a = 0 ):

输入(图像)矩阵和输出矩阵 Q

Input (image) matrix enter image description here

我一直在看这个例子几个小时,但仍然无法弄清楚他们是如何得到 Q 矩阵的。任何人吗?

该方法最初由C. Sun和W. Wee创建,并在一篇名为“Neighboring gray level dependence matrix for texture classification”的论文中进行了描述,我可以访问该文章,但无法下载(按下后页面重新加载,就是这样。)

1 个答案:

答案 0 :(得分:4)

在您提供的示例中,d=1a=0。当d=1时,我们会考虑8像素邻域中的像素。当a=0时,这意味着我们会查找与邻域中心具有相同值的像素。

基本算法如下:

  1. 将您的NGLDM矩阵初始化为全零。总行数对应于图像中可能的强度/值的总数。列的总数对应于您的邻域中有多少像素加1.对于d=1,我们有一个8像素的邻域,因此8 + 1 = 9.因为有4种可能的强度{{1因此,我们有一个4 x 9矩阵。我们将此矩阵称为(0,1,2,3)
  2. 对于矩阵中的每个像素,请记下此像素。这是M行。
  3. 写出有多少有效邻居围绕此像素。
  4. 计算在步骤#1中看到与该像素匹配的相邻像素的次数。这是您的Ng列。
  5. 在步骤1和步骤2中找出数字后,将此位置增加1。

  6. 这里有一个轻微的问题:他们忽略了边境位置。因此,您不必对第一行,最后一行,第一列或最后一列执行此过程。我的猜测是他们希望确保你有一个8像素的邻居。这也取决于距离Nr。您必须才能获取d=1处中心位置的每个有效像素。如果d=1,那么您必须确保邻域中心的每个像素都有一个25像素的邻域,依此类推。

    让我们从该矩阵的第二行,第二列位置开始。让我们完成以下步骤:

    1. d=2因为位置为1。
    2. 有效的邻居 - 从此邻域的左上角像素开始,从左向右扫描并省略中心,我们有:Ng = 1
    3. 有多少值等于1, 1, 2, 0, 1, 0, 2, 2?三次。因此1
    4. Nr = 3。访问行M(Ng,Nr) += 1,然后访问行Ng = 1,并将此点增加1。

    5. 想知道我怎么知道他们不算边界?让我们做左下角的像素。该位置为Nr = 3,因此0。如果你重复我刚刚说过的算法,你会期望Ng = 0Ng = 0,所以你期望矩阵中该位置至少有一个条目......但是你不要!如果你在图像的边界周围进行类似的检查,你会看到应该在那里的条目......不是。看看第三行,第五列。您会认为Nr = 1Ng = 1,但我们在矩阵中看不到。


      又一个例子。为什么Nr = 1?好吧,看一下其中有M(Ng,Nr) = 4, Ng = 2, Nr = 4的每个像素。我们可以成功捕获8像素邻域的唯一有效位置是2row=2, col=4row=3, col=3row=3, col=4row=4, col=3。通过应用我们看到的相同算法,您会看到每个位置row=4, col=4。因此,我们看到Nr = 4 四次次的这种组合,以及该位置设置为4的原因。但是,在Ng = 2, Nr = 4中,这实际上是{ {1}},因为该中心附近有五个 2。这就是你看row=3, col=4的原因。

      举个例子,让我们做其中一个地点。让我们在矩阵(Nr = 5)的中间进行Ng = 2, Nr = 5, M(Ng,Nr) = 1轻击:

      1. 2
      2. 什么是有效的邻近像素? row=3, col=3(省略中心)
      3. 计算等于2的像素数。其中有四个,因此Ng = 2
      4. 1, 1, 2, 0, 2, 3, 2, 2。取Nr = 4M(Ng,Nr) += 1并将此点增加1.
      5. 如果您使用Ng = 2的其他有效位置执行此操作,则每次都会看到Nr = 4,但第三行和第四列除外,其中2 }。


        那么我们如何在MATLAB中实现呢?您可以做的是使用im2col将每个有效的邻域转换为列。我还要做的是提取每个社区的中心。这实际上是矩阵的中间行。然后我们将计算出每个邻域中有多少像素等于中心,将它们相加,这将决定我们的Nr = 4值。 Nr = 5值将是中间行值本身。一旦我们这样做,我们就可以根据这些值计算直方图,就像算法如何获得矩阵一样。换句话说,尝试这样做:

        Nr

        ......这是我们的矩阵:

        Ng

        如果您选中此项,则会看到此匹配项与% // Your example A = [1 1 2 3 1; 0 1 1 2 2; 0 0 2 2 1; 3 3 2 2 1; 0 0 2 0 1]; B = im2col(A, [3 3]); %//Convert neighbourhoods to columns - 3 x 3 means d = 1 C = bsxfun(@eq, B, B(5,:)); %//Figure out a logical matrix where each column tells %//you how many elements equals the one in each centre D = sum(C, 1) - 1; %// Must subtract by 1 to discount centre pixel Ng = B(5,:).' + 1; % // We must make this into a column vector, and we also must % // offset by 1 as MATLAB starts indexing by 1. %// Column vector is for accumarray input Nr = D.' + 1; %// Do the same for Nr. We could have simply left out the + 1 here and %// took out the subtraction of -1 for D, but I want to explicitly show %// the steps Q = accumarray([Ng Nr], 1, [4 9]); %// 4 unique intensities, 9 possible locations (0-8)


        加成

        如果您希望能够适应一般的算法,指定Q = 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 4 1 0 0 0 0 1 0 0 0 0 0 0 0 Q的位置,我们只需遵循您的文字指南即可。对于每个邻域,您可以找到中心像素与所有其他像素之间的差异。您可以计算任何正整数d的{​​{1}}像素数。请注意,这将创建一个我们需要检查的a邻域。我们也可以将它变成一个函数。没有进一步的麻烦:

        <= a

        我们可以通过以下示例重新创建上面显示的场景:

        d
        因此

        2*d + 1 x 2*d + 1

        %// Set A up yourself, then use a and d as inputs
        %// Precondition - a and d are both integers. a can be 0 and d is positive!
        function [Q] = calculateGrayDepMatrix(A, a, d)
            neigh = 2*d + 1; % //Calculate rows/columns of neighbourhood
            numTotalNeigh = neigh*neigh; % //Calculate total number of pixels in neighbourhood
            middleRow = ceil(numTotalNeigh / 2); %// Figure out which index the middle row is
            B = im2col(A, [neigh neigh]);  %// Make into columns
            Cdiff = abs(bsxfun(@minus, B, B(middleRow,:))); %// For each neighbourhood, subtract with its centre
            C = Cdiff <= a; %// For each neighbourhood, figure out which differences are <= a
            D = sum(C, 1) - 1; % //For each neighbourhood, add them up
            Ng = B(middleRow,:).' + 1; % // Determine Ng and Nr, and find Q
            Nr = D.' + 1; 
            Q = accumarray([Ng Nr], 1, [max(Ng) numTotalNeigh]); 
        end
        

        希望这有帮助!