本博客借鑒:https://blog.csdn.net/Zhwers/article/details/105625160#%E4%BA%8C%E3%80%81%E7%89%B9%E5%BE%81%E9%87%8F
一、基本理論
1、背景
20世紀70年代,R.Haralick等人提出了用灰度共生矩陣(Gray-level Co-occurrence Matrix,GLCM)來描述紋理特征。
2、概念
灰度共生矩陣(GLDM)的統計方法是20世紀70年代初由R.Haralick等人提出的,它是在假定圖像中各像素間的空間分布關系包含了圖像紋理信息的前提下,提出的具有廣泛性的紋理分析方法。[^1]
灰度共生矩陣是像素距離和角度的矩陣函數,它通過計算圖像中一定距離和一定方向的兩點灰度之間的相關性,來反映圖像在方向、間隔、變化幅度以及快慢上的綜合信息。
3、含義
灰度共生矩陣實質上是一幅圖像中兩個像素灰度級的聯合直方圖,是一種二階統計量。
普通的灰度直方圖是對圖像上單個像素具有某個灰度進行統計的結果,而灰度共生矩陣是對圖像上保持某距離的兩像素分別具有某灰度的狀況進行統計得到的。
取圖像(N×N)中任意一點 (x,y)及偏離它的另一點 (x+a,y+b),設該點對的灰度值為 (g1,g2)。令點(x,y) 在整個圖像上移動,則會得到各種 (g1,g2)值,設該灰度圖像的灰度值級數為 k,則(g1,g2) 的組合共有 k² 種。對於整個圖像矩陣,統計出每一種 (g1,g2)值出現的次數,然后排列成一個方陣,再用(g1,g2) 出現的總次數將它們歸一化為出現的概率P(g1,g2) ,這樣的方陣稱為灰度共生矩陣。[^2]
4、例證
下面以圖示解釋如何灰度共生矩陣的生成方法,下例中以GLCM表中的(1,1)點為例,GLCM(1,1)即為在左邊的整個圖像灰度矩陣I中尋找“兩灰度值均為1且兩像素點水平相鄰的像素點對”的數量,例中GLCM(1,1)=1,即只有一對水平相鄰的像素點對滿足兩灰度值均為1。同理可得GLCM(1,2)=2。
GLCM表其實是所有像素點可能的排列方式以及每一種排列方式存在於該幅圖像中的數量。也就是,在圖像矩陣I中,像素灰度值為i和像素灰度值為j的兩個像素點組成的點對(i,j)的數量,就是GLCM(i,j)的值。如果對GLCM表進行歸一化之后,表中的每個值代表的就是每一種排列方式存在於該幅圖像中的概率。
在這里,有一個特殊的知識點,我們可以認為其實圖像中任意兩個像素點都是在某種條件下的相鄰點。即,點f(x,y)與點f(x+a,y+b)相鄰,構成這個相鄰的條件就是,兩個像素點在x方向上相隔a個單位,且在y方向上相隔b個單位。像是上例中所說的G(1,1)=1,就是表示在灰度矩陣I中,存在兩個灰度值為1的點在a=1且b=0的條件下滿足相鄰而構成的點對只有一對。
概括來說,點A與點B存在以下四種條件下的“相鄰”:
①當a=1且b=0時,點B在點A的右邊,AB連線與x軸正方向構成0°夾角,稱為“水平相鄰”;
②當a=1且b=1時,點B在點A的右上角,AB連線與x方向構成45°夾角,稱為“對角相鄰”;
③當a=0,b=1時,AB連線與x軸正方向構成90°夾角;
④當a=-1,b=1時,AB連線與x軸正方向構成135°夾角。
為什么要講這個特殊的相鄰呢?因為我們在計算一幅灰度圖像的灰度共生矩陣的時候,我們可能需要依據實際情況更改計算的粒度,對於紋理變化緩慢的圖像我們可能不必要計算到a=1或者b=1這么細致的程度,這時候我們就可以適當擴大a或b的數量,依照上述概念,被計算到的兩個像素點還可以看作是“相鄰”的,不過它們之間的間隔變大了而已。
5、規律
對於一幅圖像的灰度共生矩陣,原圖像的紋理變換越緩慢,則灰度共生矩陣的對角線上的數值就會比較大;而紋理變換越快,則對角線上的數值就會越小,而對角線兩側的數值會增大。
二、特征量
盡管一幅圖像的灰度共生矩陣能夠反映出圖像灰度關於方向、相鄰間隔、變化幅度等方面的綜合信息,但由於灰度共生矩陣的數據量通常比較大,所以一般不會直接對矩陣進行操作,而是提取出它的一些特征量來描繪原圖像的特征信息,如能量、熵、對比度、均勻性、相關性、方差、差平均、差方差等。因為項目需要沒有研究太多特征量,下面選擇部分名詞進行解釋[^3]
1、對比度(contrast)
對比度是一個常見的度量名詞,可以用於反映圖像的清晰度和紋理的溝紋深淺,它實際上度量的是圖像灰度矩陣的值是如何分布以及圖像中局部變化的程度的。紋理的溝紋越深,反差越大,圖像局部越清晰。
P(i,j)是指歸一化后的灰度共生矩陣
2、角二階矩(Angular Second Moment, ASM)
又稱為能量,能量變化反映了圖像灰度分布均勻程度和紋理的粗細度。若灰度共生矩陣的元素值相近,則能量較小,表示圖像紋理較為細致;若如果其中一些值大而其他值笑,則能量值會比較大。能量值大表示一種較為均勻、變化比較規則的紋理模式。

3、熵(entropy)
圖像會包含信息量的隨機性度量。當共生矩陣中所有值均相等或者原圖像矩陣的像素值表現出最大隨機性時,熵最大。因此,熵值表明了圖像灰度分布的復雜程度,熵值越大則圖像越復雜。

4、逆差矩(Inverse Different Moment, IDM)
逆方差反映了圖像紋理局部變化的大小,若圖像紋理的不同區域之減較為均勻,變化緩慢,那么逆方差的值會比較小。

5、相關性(correlation)
相關性反映了圖像紋理的一致性.如果圖像中有水平方向的紋理,則0°灰度共生矩陣的COR會大於其他幾個角度方向的灰度共生矩陣的COR值
三、MATLAB自帶函數
MATLAB作為一個臃腫龐大但極為強大的數據處理軟件,這種計算灰度共生矩陣的函數自然也是有的,
1、函數名
graycomatrix()
2、功能
創建灰度共生矩陣
3、基本用法及描述
使用方法:
①glcm=graycomatrix(I)
②glcms=graycomatrix(I,param1,val1,param2,val2,...)
③[glcms,SI]=graycomatrix(...)
描述[^4] :
函數graycomatrix(I)產生圖像I的灰度共生矩陣GLCM,它是通過計算兩灰度值i,j在圖像I中水平相鄰的次數得到的。上面的用法①就是最基本的用法,使用默認參數輸出圖像I的灰度共生矩陣glcm。在計算過程中,graycomatrix()函數會先將圖像I歸一化到指定的灰度級,再計算GLCM,這是因為動態地求取GLCM區間代價過高;而這個指定的灰度級默認情況下是8灰度級,如果你的I是一個二值圖像,這個指定的灰度級就是2級。
用法③[glcm,SI]=graycomatrix(...)除了返回一個灰度共生矩陣glcm外,還會返回一個歸一化的灰度圖像SI,也就是實際上被用於計算灰度共生矩陣的那個灰度圖像,因而SI中的像素灰度值取值范圍在默認條件下就是[1,NumLevels].]
上面的用法②是①的加強版,可以修改一些默認的參數。
常用的可以修改的參數如
'NumLevels',可以指定歸一化后的灰度級數目,如將NumLevels設定為16,就是將整個圖像的灰度值映射到[1,16]這個區間中。NumLevels決定了灰度共生矩陣的大小,默認值是8。
'GrayLimits',是兩個元素的向量[low,high],指明圖像中的灰度值線性歸一化后的的灰度級別范圍:不大於low的灰度值將被置為1,不小於high的灰度值將被置為'NumLevels'。這一參數如果不被指定,默認情況下,low=min(I(:)),high=max(I(:))。
'Offset',是一個p*2的整數矩陣,可以用於指定目標像素點對的'相鄰'條件[^5] ,矩陣中的每一行是一個含有兩個元素的向量,[row_offset,col_offset],通過修改這兩個參數的正負性、大小就可以指定目標像素點對在特定角度、特定距離上的“相鄰”。
代碼
close all;
clear all;
clc;
%灰度共生矩陣的算法
Gray=imread('C:\Users\luoqi\Desktop\圖片\影院\file.jpg');
if ndims(Gray)==3
Gray=rgb2gray(Gray);
end
[M,N,O]=size(Gray);
%歸一化,對灰度圖像進行灰度值映射,這里將Gray量化為16級
for i=1:M
for j=1:N
for n=1:256/16
if ((n-1)*16<=Gray(i,j)) && (Gray(i,j)<=(n-1)*16+15)
Gray(i,j)=n;
end
end
end
end
%依照四種"相鄰"條件計算四個共生矩陣P,取目標像素點對距離為1,角度分別為0,45,90 135
%計算后得到的P(m,n,4)就是四個共生矩陣構成的三維數組
[M,N]=size(Gray);
P=zeros(16,16,4);
for m=1:16
for n=1:16
for i=1:M
for j=1:N
if(j<N&&Gray(i,j)==m&&Gray(i,j+1)==n)%a=0,b=1;
P(m,n,1)=P(m,n,1)+1;
end
if(i>1&&j<N&&Gray(i,j)==m&&Gray(i-1,j+1)==n)%a=-1,b=1
P(m,n,2)=P(m,n,2)+1;
end
if(i>1&&Gray(i,j)==m&&Gray(i-1,j)==n)%a=-1,b=0
P(m,n,3)=P(m,n,3)+1;
end
if(i>1&&j>1&&Gray(i,j)==m&&Gray(i-1,j-1)==n)%a=-1,b=-1
P(m,n,4)=P(m,n,4)+1;
end
end
end
end
end