簡體   English   中英

MATLAB中的相鄰灰度依賴矩陣(NGLDM)

[英]Neighboring gray-level dependence matrix (NGLDM) in MATLAB

我想計算幾個紋理特征(即:小/大數強調,數字非均勻性,第二矩和熵)。 這些可以從相鄰灰度級依賴矩陣計算。 我正在努力理解/實施這個。 關於此方法的信息非常少(公開可用)。

根據這篇論文

該矩陣采用二維陣列Q的形式 ,其中Q(i,j)可以被認為是處理圖像的灰度變化的頻率計數。 它具有與圖像的直方圖類似的含義。 該陣列是N g ×N r ,其中N g是可能的灰度級的數量,N r是圖像中像素的可能鄰居的數量。

如果圖像函數f(i,j)是離散的,那么通過計算f(i,j)中每個元素與其之間的差異的次數,很容易計算Q矩陣(對於正整數d,a )。鄰居是在一定的距離d等於或小於

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

輸入(圖像)矩陣和輸出矩陣Q

輸入(圖像)矩陣在此輸入圖像描述

我一直在看這個例子幾個小時,但仍然無法弄清楚他們是如何得到那個Q矩陣的。 任何人?

該方法最初是由C. Sun和W. Wee創建的,並在一篇名為“ 鄰近灰度級依賴矩陣進行紋理分類 ”的論文中進行了描述,我可以訪問該文章但無法下載(按下后頁面重新加載和而已)。

在您提供的示例中, d=1a=0 d=1 ,我們考慮8像素鄰域中的像素。 a=0 ,這意味着我們尋找與鄰域中心具有相同值的像素。

基本算法如下:

  1. 將NGLDM矩陣初始化為全零。 總行數對應於圖像中可能的強度/值的總數。 總列數對應於您的鄰域中有多少像素加1.因此,對於d=1 ,我們有一個8像素的鄰域,因此8 + 1 = 9.因為有4種可能的強度(0,1,2,3) ,因此我們有一個4 x 9矩陣。 我們稱之為矩陣M
  2. 對於矩陣中的每個像素,請記下此像素。 這是在Ng行。
  3. 寫出多少有效的鄰居那里是圍繞這個像素。
  4. 計算您在步驟#1中看到與該像素匹配的相鄰像素的次數。 這是你的Nr專欄。
  5. 找到步驟1和步驟2中的數字后,將此位置增加1。

這是一個輕微的問題: 他們忽略邊界位置 因此,您不對第一行,最后一行,第一列或最后一列執行此過程。 我的猜測是他們希望確保你有一個8像素的鄰居。 這也由距離d=1 d=1必須能夠獲取給定中心位置的每個有效像素。 如果d=2 ,那么你必須確保鄰域中心的每個像素都有一個25像素的鄰域,依此類推。

讓我們從這個矩陣的第二行,第二列位置開始。 我們來看看這些步驟:

  1. 當位置為1時, Ng = 1 1。
  2. 有效鄰-在這附近左上角像素開始,並掃描從左到右省略中心,我們有: 1, 1, 2, 0, 1, 0, 2, 2
  3. 有多少個值等於1 三次。 因此Nr = 3
  4. M(Ng,Nr) += 1 訪問行Ng = 1 ,訪問行Nr = 3 ,並將此點增加1。

想知道我怎么想他們不算邊界? 讓我們做左下角的像素。 那個位置是0 ,所以Ng = 0 如果你重復我剛剛說過的算法,你會期望Ng = 0Nr = 1 ,所以你期望矩陣中該位置至少有一個條目......但是你沒有! 如果你在圖像的邊界周圍做類似的檢查,你會看到應該在那里的條目......不是。 看看第三行,第五列。 你會認為Ng = 1Nr = 1 ,但我們在矩陣中沒有看到。


還有一個例子。 為什么M(Ng,Nr) = 4, Ng = 2, Nr = 4 好吧,看一下里面有2像素。 我們可以成功捕獲8像素鄰域的唯一有效位置是row=2, col=4row=3, col=3row=3, col=4row=4, col=3row=4, col=4 通過應用我們看到的相同算法,您將看到每個位置的Nr = 4 因此,我們看到的這個組合Ng = 2, Nr = 4 四次 ,這就是為什么位置設置為4。然而,在row=3, col=4 ,這其實是Nr = 5 ,因為有在該中心附近的2s。 這就是為什么你看到Ng = 2, Nr = 5, M(Ng,Nr) = 1

舉個例子,讓我們做一個位置。 讓我們在矩陣中間進行2擊打( row=3, col=3 ):

  1. Ng = 2
  2. 什么是有效的鄰近像素? 1, 1, 2, 0, 2, 3, 2, 2 (省略中心)
  3. 計算等於2的像素數。其中有四個,因此Nr = 4
  4. M(Ng,Nr) += 1 Ng = 2Nr = 4並將此點增加1。

如果對具有2的其他有效位置執行此操作,則每次都會看到Nr = 4 ,但第三行和第四列除外,其中Nr = 5


那么我們如何在MATLAB中實現呢? 你可以做的是使用im2col將每個有效的鄰域轉換成列。 我還要做的是提取每個社區的中心 這實際上是矩陣的中間行。 然后我們將計算出每個鄰域中有多少像素等於中心,將它們相加,這將決定我們的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匹配。


獎金

如果您希望能夠適應一般的算法,在指定da ,我們可以簡單地遵循文本的准則。 對於每個鄰域,您可以找到中心像素與所有其他像素之間的差異。 您可以計算任何正整數d像素數<= a 請注意,這將創建一個我們需要檢查的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

我們可以通過以下示例重新創建上面顯示的場景:

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];
Q = calculateGrayDepMatrix(A, 0, 1);

Q :因此:

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

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM