[英]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=1
且a=0
。 當d=1
,我們考慮8像素鄰域中的像素。 當a=0
,這意味着我們尋找與鄰域中心具有相同值的像素。
基本算法如下:
d=1
,我們有一個8像素的鄰域,因此8 + 1 = 9.因為有4種可能的強度(0,1,2,3)
,因此我們有一個4 x 9矩陣。 我們稱之為矩陣M
Ng
行。 Nr
專欄。 這是一個輕微的問題: 他們忽略邊界位置 。 因此,您不對第一行,最后一行,第一列或最后一列執行此過程。 我的猜測是他們希望確保你有一個8像素的鄰居。 這也由距離d=1
。 在d=1
您必須能夠獲取給定中心位置的每個有效像素。 如果d=2
,那么你必須確保鄰域中心的每個像素都有一個25像素的鄰域,依此類推。
讓我們從這個矩陣的第二行,第二列位置開始。 我們來看看這些步驟:
Ng = 1
1。 1, 1, 2, 0, 1, 0, 2, 2
。 1
? 三次。 因此Nr = 3
M(Ng,Nr) += 1
。 訪問行Ng = 1
,訪問行Nr = 3
,並將此點增加1。 想知道我怎么想他們不算邊界? 讓我們做左下角的像素。 那個位置是0
,所以Ng = 0
。 如果你重復我剛剛說過的算法,你會期望Ng = 0
, Nr = 1
,所以你期望矩陣中該位置至少有一個條目......但是你沒有! 如果你在圖像的邊界周圍做類似的檢查,你會看到應該在那里的條目......不是。 看看第三行,第五列。 你會認為Ng = 1
且Nr = 1
,但我們在矩陣中沒有看到。
還有一個例子。 為什么M(Ng,Nr) = 4, Ng = 2, Nr = 4
? 好吧,看一下里面有2
像素。 我們可以成功捕獲8像素鄰域的唯一有效位置是row=2, col=4
, row=3, col=3
, row=3, col=4
, row=4, col=3
, row=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
):
Ng = 2
1, 1, 2, 0, 2, 3, 2, 2
(省略中心) Nr = 4
M(Ng,Nr) += 1
。 取Ng = 2
, Nr = 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
匹配。
如果您希望能夠適應一般的算法,在指定d
和a
,我們可以簡單地遵循文本的准則。 對於每個鄰域,您可以找到中心像素與所有其他像素之間的差異。 您可以計算任何正整數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.