灰度共生矩陣GLCM及其matlab實現

Inside_Zhang發表於2015-11-18

Prerequisites

概念

計算方式

對於精度要求高且紋理細密的紋理分佈,我們取畫素間距為d=1

d = 1
,以下是方向的說明:

我們來看,matlab內建工具箱中的灰度共生矩陣的生成函式graycomatrix(gray-level co-occurrence matrix)對方向的說明:


這裡寫圖片描述

如上圖所示,方向是在每一個畫素點(pixel of interest)的鄰域(當然,邊界點除外)中獲得的,只不過這裡的座標系變為了:


這裡寫圖片描述

  • δ=(0,±1)
    \delta=(0, \pm 1)
    為水平方向掃描,也即θ=0orθ=180
    \theta = 0^\circ or \theta = 180^\circ
  • δ=(±1,0)
    \delta=(\pm 1, 0)
    為垂直掃描(θ=90orθ=90
    \theta = 90^\circ or \theta = -90^\circ
    );
  • δ=(1,1),δ=(1,1)
    \delta = (1, -1), \delta = (-1, 1)
    45
    -45^\circ
    135
    135^\circ
    掃描;
  • δ=(1,1),δ=(1,1)
    \delta = (1, 1), \delta = (-1, -1)
    45
    45^\circ
    掃描。

一旦畫素間距離d

d
以及畫素間空間位置關係δ
\delta
確定,即可生成灰度共生矩陣。

GLCM所表示的是紋理影象的某些統計特性,所謂統計,通俗地講就是累計某種情況出現的次數,用這一次數除以總的情況數,即可得其統計意義上的概率。

我們來統計灰度級2與2在-45度和135度方向上(也即δ=(1,1)

\delta = (1, -1)
或者δ=(1,1)
\delta=(-1, 1)
)出現的次數,如圖所示,共出現九次,在兩個方向上即是18次。


這裡寫圖片描述


這裡寫圖片描述

matlab

matlab相關工具箱函式

使用灰度共生矩陣(GLCM)描述和提取影象紋理特徵,是一個強大且流行的工具,自然matlab工具箱會提供相應的函式——graycomatrix

給出一個影象矩陣,設定一些引數,得到其灰度共生矩陣,這就是函式的基本用法:

[glcm, SI] = graycomatrix(I, ...)

主要的引數有二個,分別是

  1. NumLevels(灰度級數)

最終glcm的size是NumLevels*NumLevels

  1. Offset(方向[0, 1; -1, 1; -1, 0; -1, -1]):

[0, 1]中的1表示的偏移數(offset),當然也可以取2或者更多,如上文所說,對於精度要求高且影象紋理本身即很豐富的影象來說,為了更精細地刻畫,我們取偏移量(offset)為1

我們將原始I轉換為SI,對SI計算GLCM,SI中元素的值介於[1, NumLevels]之間。

I = [ 
    1 1 5 6 8 8; 
    2 3 5 7 0 2; 
    0 2 3 5 6 7
    ];

[glcm, SI] = graycomatrix(I, 'NumLevels', 9, 'G', [])
% 'Offset'的default值為`[0, 1]`
glcm =

     0     0     2     0     0     0     0     0     0
     0     1     0     0     0     1     0     0     0
     0     0     0     2     0     0     0     0     0
     0     0     0     0     0     2     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     2     1     0
     0     0     0     0     0     0     0     1     1
     1     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     1

SI =

     2     2     6     7     9     9
     3     4     6     8     1     3
     1     3     4     6     7     8

demo

這裡先寫一個demo,稍微有點難懂的地方在於灰度共生矩陣的計算方式,然後是一些程式設計上的迴圈判斷。其他方向的情況還未考慮(在第三和第四層迴圈的地方可能會略有不同),以及將其封裝成一個函式的操作還是留待以後吧:

clear, clc
P = [ 0 1 2 0 1 2 
   1 2 0 1 2 0
   2 0 1 2 0 1
   0 1 2 0 1 2
   1 2 0 1 2 0
   2 0 1 2 0 1];
[r, c] = size(P);
P_u = unique(P);        % 去重,得到所有的灰度級
n = length(P_u);        % 不同灰度級的個數
G = zeros(n, n);        % 初始化灰度共生矩陣為全0矩陣,

%% 四層迴圈,最外層的兩層迴圈用來為GLCM的各個位置賦值
% 內層的兩層迴圈時遍歷原始影象矩陣,累計符合某一對應關係的的情況出現的次數

for p = 1:n,
    for q = 1:n,

        cnt = 0;            % GLCM刻畫的是灰度影象畫素的統計特性,在matlab中通過次數的統計計算得到
        for i = 1:r,
            for j = 1:c,
                if  (j+1) <= c && ((P(i, j) == p && P(i, j+1) == q) || P(i, j) == q && P(i, j+1) == p),
                    cnt = cnt + 1;
                end
            end
        end
        G(p, q) = cnt;
    end
end
G   

References

[1] <影象特徵提取——灰度共生矩陣(GLCM)>

相關文章