Matlab圖像特徵分析——顏色矩、直方圖、灰度差分統計、自相關函數、灰度共生矩陣

Matlab圖像特徵分析——顏色矩、直方圖、灰度差分統計、自相關函數、灰度共生矩陣

        本人目前耕耘的領域是數字水印,在數字水印處理的過程中會涉到圖像的分析,本篇文章主要針對常用的,基礎的幾種圖像分析方法進行簡單介紹,以下正文。

        其實,圖像分析可以看作是一個信息提取的過程,即從圖像中提取想要的數據、信息、度量,再將其描述和表示出來。圖像特徵是指圖像的原始特徵或屬性,分爲視覺特徵和統計特徵。視覺特徵主要是人視覺的直接感受(顏色,大小等),統計特徵是指需要通過變換或測量才能得到的人爲的特徵(頻譜、直方圖等)。本文主要分析圖像顏色特徵和紋理特徵,並通過Matlab實現特徵分析。

一、 顏色特徵

      顏色特徵描述了圖像或圖像區域所對應景物的表面性質,顏色對人眼的敏感度較圖像尺寸、方向來說偏低,因此顏色特徵被廣泛應用於圖像識別。常用的顏色表示方法有顏色矩、顏色直方圖、顏色相關性等,本文介紹顏色矩和顏色直方圖兩種方法。

       1.1 顏色矩

        顏色矩是以數學方法爲基礎的,通常顏色矩直接在RGB顏色空間計算,也可以在其他顏色空間計算。顏色主要信息分佈在低階矩,因此常用一階矩、二階矩。其定義如下:

                  一階矩:

                                  \mu _{i}= \frac{1}{N}\sum_{j=1}^{N}P_{ij}

                   二階矩:

                                 \sigma _{i} = \left [ \frac{1}{N} \sum_{j=1}^{N}\left ( P_{ij}-\mu_{i} \right )^2\right ]^\frac{1}{2}

        其中 i 代表R、G、B三個顏色通道,j表示像素值,N表示像素數量。從定義可以看出,一階矩表示每個顏色通道的平均值;二階矩表示顏色方差。

        代碼示例

        Matlab中用mean2()和std()兩個函數分別求一階矩和二階矩。其代碼實現如下:

close all;
clear all;
clc;
I = imread('flower.jpg '); % 讀取指定圖像
J = imread('leaf.jpg '); 
I = double(I);   %轉化數據類型
J = double(J);
I_r = I(:,:,1);  %提取紅色通道
I_g = I(:,:,2);  %提取綠色通道
I_b = I(:,:,3);  %提取藍色通道

J_r = J(:,:,1);  %提取紅色通道
J_g = J(:,:,2);  %提取綠色通道
J_b = J(:,:,3);  %提取藍色通道

Ravg1 = mean2(I_r) %不帶分號,將結果顯示在命令行窗口
Gavg1 = mean2(I_g)
Bavg1 = mean2(I_b)
Rstd1 = std(std(I_r)) %std是求標準差, 兩次std就是方差,即二階矩
Gstd1 = std(std(I_g))
Bstd1 = std(std(I_b))


運行結果:
Ravg1 =
  140.9577
Gavg1 =
   53.7861
Bavg1 =
   44.9997
Rstd1 =
   24.3750
Gstd1 =
    4.9645
Bstd1 =
    3.8668

       1.2 顏色直方圖

        顏色直方圖描述的是圖像中不同顏色在整幅圖像中所佔的比例多少,不關心色彩的位置,適用於描述那些難以自動分割和不需要考慮物體空間位置的圖像。設一幅圖像的大小爲M * N。顏色直方圖H的定義爲:p_{i} = h_{i} .其中h_{i}是第i種顏色在整幅圖像中的具體像素數。圖像直方圖歸一化爲:p_{i} = h_{i}/(M*N).

        繪製圖像顏色直方圖

        imhist() 函數可以計算並繪製圖像的顏色直方圖。以下爲例:繪製彩色圖像R、G、B分量的直方圖,其具體Matlab的實現如下:

close all;
clear all;
clc;
I = imread('pic01.jpg');
I_r = I(:,:,1);
I_g = I(:,:,2);
I_b = I(:,:,3);
figure;
subplot(221);imshow(I);                            %顯示彩色圖像
subplot(222);imshow(I_r);          %R分量灰度圖
subplot(223);imshow(I_g);          %G分量灰度圖
subplot(224);imshow(I_b);          %B分量灰度圖

figure;
subplot(131);imhist(I(:,:,1));title('紅色分量直方圖');     %顯示紅色分辨率下的直方圖
subplot(132);imhist(I(:,:,2));title('綠色分量直方圖')   %顯示綠色分辨率下的直方圖
subplot(133);imhist(I(:,:,3));title('藍色分量直方圖')  %顯示藍色分辨率下的直方圖

        其運行結果如下:
                                                                                             

    使用上述同樣的代碼。更換一張色彩諞亮一些的圖進行同樣的測試,其結果如下圖:

                                                                                            

               

        對照這兩幅圖像的顏色特徵解釋直方圖,直方圖的橫座標是0-255,表示像素值;縱座標表示該像素值在整幅圖像中的個數。第一幅圖像的顏色比較鮮豔,色彩豐富且圖像諞深色一些,故直方圖較爲均勻(縱座標的到5000)且數字偏小的像素更多一些;第二幅圖像爲雪景,圖像諞白、諞亮,所以在150-255之間的像素值較多(縱座標達到7000)。

       2> 圖像直方圖均衡化

        圖像處理中經常有一個操作是圖像均衡化,使用histeq()函數。histeq()有以下幾種使用方式:

    J = histeq(I,hgram) 變換灰度圖像 I,以使輸出灰度圖像 J 具有 length(hgram) 個 bin 的直方圖近似匹配目標直方圖 hgram

    J = histeq(I,n) 變換灰度圖像 I,以使輸出灰度圖像 J 具有 n 個 bin 的直方圖大致平坦。當 n 遠小於 I 中的離散灰度級數時,J 的直方圖更平坦。

    J = histeq(I) 變換灰度圖像 I,以使輸出灰度圖像 J 的直方圖具有 64 個 bin 且大致平坦。

           用上面的第一個圖爲例進行一次均衡化,實現如下

I = imread('pic03.jpg');
I = rgb2gray(I);
H = histeq(I);
figure;
subplot(121); imshow(I);  title('原始灰度圖像');
subplot(122);imshow(H); title('直方圖均衡化圖像');
figure;
subplot(121); imhist(I);  title('原始灰度圖像直方圖');
subplot(122);imhist(H); title('直方圖均衡化圖像直方圖');

其運行效果入下圖:

灰度圖像直方圖均衡化處理
圖像直方圖

二、紋理特徵

        圖像的紋理特徵描述圖像景物的表面性質,是從圖像中計算出的一個值,反應圖像對應物品的質地,如粗糙度、顆粒度、隨機性和規範性等。圖像紋理常被應用於衛星遙感地表圖像分析,圖像分類、模式識別等。在此我介紹灰度差分統計,自相關函數、灰度共生矩陣三種分析方法。

        2.1 灰度差分統計法

        利用圖像直方圖提取諸如均值、方差、能量及熵等特徵來描述紋理。

        設(x,y)爲圖像中的一點,該點附近的點(x+\Delta x,y+\Delta y)的灰度差值爲: g_{\Delta } = g(x,y) - g(x+\Delta x + y+\Delta y) .差分叫法的由來!

        由直方圖可以得到g\Delta取值的概率p(k),直方圖平坦時,說明紋理較細緻。相關的紋理特徵有:

                 平均值:

                              mean = \sum_{i}ip(i)/M

                   對比度:

                               con = \sum_{i}i^{2}p(i)

                   熵:

                              Entropy = -\sum_{i}p(i)log_{2}[p(i)]

        在上述各式中,p(k)較平坦時,熵較大,能量較小,p(k) 越分佈在原點附近,則均值越小。基於灰度級的直方圖並不能建立特徵與紋理基元的一一對應關係,相同的直方圖可能會有不同的圖像紋理。因此在運用灰度直方圖進行紋理分析和比較時,還需要加上其他特徵。

        實施例:計算兩幅圖像的差分統計特性,實現如下:

clc;
clear all; close all;
J=imread('ballon.png');                    %讀入紋理圖像,分別輸入wall.jpg和stone.jpg兩幅圖進行對比
A=double(J);
[m,n]=size(A);                         %求A矩陣的大小,賦值給m n
B=A;
C=zeros(m,n);                         %新建全零矩陣C,以下求解歸一化的灰度直方圖
for i=1:m-1
    for j=1:n-1
        B(i,j)=A(i+1,j+1);
        C(i,j)=abs(round(A(i,j)-B(i,j)));
    end
end
h=imhist(mat2gray(C))/(m*n);
mean=0;con=0;ent=0;                    % 均值mean、對比度con和熵ent初始值賦零
for i=1:256                              %循環求解均值mean、對比度con和熵ent          
    mean=mean+(i*h(i))/256;
    con=con+i*i*h(i);
    if(h(i)>0)
        ent=ent-h(i)*log2(h(i));
    end
end
    mean,con,ent

計算上面兩幅圖的結果如下:

 

平均值

對比度

stone

0.0674

591.3967

5.1700

ballon

0.0130

194.3447

2.0622

        計算結果中,stone的平均值和熵均大於ballon且有顯著差異,也就表明stone的紋理較爲粗糙。在模式識別領域通常將這些特徵作爲特徵輸入量來進行目標的區分。    

    2.2 自相關函數

         紋理常用它的粗糙性來描述。例如,在相同的觀看條件下,上例中石子比氣球表面粗糙。紋理粗糙性的大小與局部結構的空間重複週期有關,週期大的紋理粗,週期小的紋理細。這種感覺上的粗糙與否不足以作爲定量的紋理測度,但至少可以用來說明紋理測度變化的傾向,即小數值的紋理測度表示細紋理,大數值測度表示粗紋理。通常採用自相關函數作爲紋理測度。設圖像爲f(x,y), 自相關函數的定義爲:

                  C(\varepsilon ,\eta ,j,k) = \frac{\sum_{x=j-w}^{j+w}\sum_{y=k-w}^{k+w}f(x,y)f(x-\varepsilon ,y-\eta )}{\sum_{x=j-w}^{j+w}\sum_{y=k-w}^{k+w}[f(x,y)]^2}

       它是對(2w+1)*(2w+1)窗口的每一像素點(j,k)於偏離值 \varepsilon ,\eta 的像素之間的相關值作計算。

       示例:調用定義的自相關函數zxcor()對圖像進行紋理分析,實現的代碼如下:

clc;
close all;
clear all;

P1=imread('stone.png');		
P1_gray=rgb2gray(P1);									
P1_gray=double(P1_gray);										
[m,n]=size(P1_gray);										%圖像大小賦值爲[m,n]
D=20;										    	%偏移量爲20
[epsilon1,eta1,C1]=zxcor(P1_gray,D,m,n);						%調用自相關函數

P2=imread('ballon.png');		
P2_gray=rgb2gray(P2);									
P2_gray=double(P2_gray);										
[m,n]=size(P2_gray);										%圖像大小賦值爲[m,n]
D=20;										    	%偏移量爲20
[epsilon2,eta2,C2]=zxcor(P2_gray,D,m,n);						%調用自相關函數

figure;
subplot(121);imshow(P1);title('stone');    
subplot(122);imshow(P2);title('stone');    

figure;
subplot(121);mesh(epsilon1,eta1,C1); title('stone自相關函數');                             	%顯示自相關函數與x,y的三維圖像
xlabel('epsilon');ylabel('eta');							%標示座標軸變量
subplot(122);mesh(epsilon2,eta2,C2); title('ballon自相關函數'); 
xlabel('epsilon');ylabel('eta');	


%% 定義自相關函數zxcor(),建立zxcor.m文件
function [epsilon,eta,C]=zxcor(f,D,m,n)  
%自相關函數zxcor(),f爲讀入的圖像數據,D爲偏移距離,【m,n】是圖像的尺寸數據,返回圖像相關函數C的
%值,epsilon和eta是自相關函數C的偏移變量。
for epsilon=1:D									%循環求解圖像f(x,y)與偏離值爲D的像素之間的相關值
  for eta=1:D                
     temp=0;
     fp=0;
     for x=1:m
        for y=1:n
           if(x+ epsilon -1)>m|(y+ eta -1)>n
             f1=0;
           else   
            f1=f(x,y)*f(x+ epsilon -1,y+ eta -1);     
           end
           temp=f1+temp;
           fp=f(x,y)*f(x,y)+fp;
        end      
     end 
        f2(epsilon, eta)=temp;
        f3(epsilon, eta)=fp;
        C(epsilon, eta)= f2(epsilon, eta)/ f3(epsilon, eta);		%相關值C
   end
end
epsilon =0:(D-1);									% 方向的取值範圍
eta =0:(D-1);										% 方向的取值範圍
end

其運行結果如下:

        自相關函數圖中,數字下降變化趨勢越大對應圖像的紋理就越複雜,自相關函數可以初步判斷對比出圖像地粗糙程度。在圖像識別應用中,常根據標準紋理的自相關曲線與未知紋理的自相關曲線相比較來判斷未知圖像的紋理粗糙度。

2.3 灰度共生矩陣

       紋理是各量級像素值在空間位置上反覆出現而形成的,所以在圖像空間中相隔某距離的兩個像素之間存在一定的關係。灰度共生矩陣是一種通過研究圖像灰度的空間分佈相關特性來描述紋理的常用方法。表示了灰度爲 i 的像素周圍某個灰度值出現的概率。一副圖像的灰度共生矩陣能反映出圖像和灰度關於方向、相鄰間隔的變化幅度的綜合信息,它是分析圖像的局部模式和它們排列規則的基礎。設f(x,y)是二維圖像,S 爲目標區域R中具體特定空間聯繫的像素對的集合,則滿足一定空間關係的灰度共生矩陣P爲:

        上式等號右邊的分子是具有某種空間關係、灰度值分別爲g_{1},g_{2} 的像素對的個數,分母爲像素對的總和個數(#代表數量)。這樣得到的 P 是歸一化的。取不同的距離和角度則可得到不同的灰度共生矩陣,實際求解時常選定距離不變,取不同角度,如0°、45°、90°和135°時的灰度共生矩陣。

        對於紋理變換緩慢的圖像,灰度共生矩陣對角線上的數值越大;圖像紋理在局部變換較大,則偏離矩陣對角線的元素值較大。但是由於灰度共生矩陣的數據量較大,一般不直接作爲區分紋理特徵的依據。Haralick曾提出了14種基於灰度共生矩陣計算出來的統計標量。這裏採用信息熵、對比度、同質性(逆差距)、相關性、能量五個較常用的特徵信息進行圖像描述。令G表示灰度共生矩陣,則特徵信息分別表示爲:

                能量:        

                 對比度:   

                 同質性(逆差矩): 

                 相關性:    

                   熵:   

其中信息熵、對比度、能量越大表示該超像素塊的紋理越複雜,顏色跳躍越大;同質性和相關性數值越大,其對應的超像素塊越紋理平滑,顏色均勻。在MATLAB中可以用函數graycomatrix();計算圖像的灰度共生矩陣。使用語法如下:

                 glcm = graycomatrix(I)
                 glcms = graycomatrix(I,Name,Value)
                 [glcms,SI] = graycomatrix(__)

       其中具體的參數設置和返回值可參考MATLAB文檔中的graycomatrix();https://ww2.mathworks.cn/help/images/ref/graycomatrix.html 

       示例1:實現如下人像圖和SEM圖的灰度共生矩陣

 

   代碼實現:

close all;
clear all;
clc;、
I = imread('03.tif');      % 如果是彩色圖需要轉灰度圖         
glcm = graycomatrix(I,'Offset',[0 2]);     %圖像I的灰度共生矩陣,2表示當前像素與鄰居的距離爲2,offset爲[0 2]表示角度爲0爲水平方向
set(0,'defaultFigurePosition',[100,100,1000,500]);	  %修改圖形圖像位置的默認設置
set(0,'defaultFigureColor',[1 1 1])
imshow(I);
glcm

分別對人像圖和SEM圖進行計算得到如下結果:

人像圖灰度共生矩陣:

glcm =
      101185       16538        3152        1590         940         714         520         574
       17255       62048       14733        2591        1200         766         619         712
        3026       15466       38759        9758        2125        1042         685         607
        1507        2730       10414       24542        6594        1699         947         681
         981        1341        2193        7269       15706        5050        1424         959
         703         792        1030        1850        5569       15059        5630        1471
         575         525         643         968        1723        6021       20894        5398
         402         567         597         613         893        1484        5846       22033


SEM圖灰度共生矩陣:
glcm =
           1          10           0           1           0           0           0           0
           9       25174        2808          34           4          55          19           0
           0        2772       35824        5438         129          94         106          32
           0          79        5349       51611        3146         280         119          87
           0          18         154        3147       11986        1017          27         183
           0           0          14         266         959        2834          99           6
           0           0           0          35          34          73         242           0
           0           0           0           0           0           0           0           0

       從結果上看來,數據可以反應圖像的特徵,即人像圖的紋理更多、更深、顏色範圍更大,所以人像圖的灰度共生矩陣對角線之外的數據更多,更大。

示例2: 通過灰度共生矩陣計算以下兩幅SEM圖的特徵信息,包括對比度、相關性、熵、

        

clc;
close all;
clear all;

I1 = imread('SEM01.tif');
I1 = rgb2gray(I1);
I2 = imread('SEM02.tif');
I2 = rgb2gray(I2);
glcm01 = graycomatrix(I1,'NumLevels',8);
stats01 = graycoprops(glcm01,{'contrast','homogeneity','correlation','energy'})% 對比度 同質性 相關 能量  信息熵

glcm02 = graycomatrix(I2,'NumLevels',8);
stats02 = graycoprops(glcm02,{'contrast','homogeneity','correlation','energy'})% 對比度 同質性 相關 能量  信息熵

       將計算結果統計如下表:

 

對比度

同質性

相關性

能量

信息熵

SEM01

0.4569

0.8407

0.9302

0.1053

7.6121

SEM02

0.1581

0.9513

0.9480

0.2266

7.0185

       對應着圖像對數據進行簡單分析。從圖像視覺特徵角度來看,相比於SEM02,SEM01圖的結構更復雜,紋理更細緻,SEM02圖的結構規律性更強、線條更粗。對應在數據上,信息熵越大,表示圖像紋理越不均勻,圖像越複雜(信息熵:SEM01>SEM02,所以SEM01更細膩);能量越大,圖像紋理的線條越粗糙(能量:SEM01<SEM02,所以SEM02線條更粗);同質性和相關性越大圖像越的區域越平穩,相關性越高(同質性、相關性:SEM01<SEM02,所以SEM02圖像整體更均勻);對比度越大圖像視覺衝擊越大,圖像的溝壑更多、更深(對比度:SEM01>SEM02,所以SEM01圖像的景象更深)。通過分析可見數據特徵和圖像的視覺特徵相符,通常這些特徵信息可以作爲模式識別的特徵輸入量進行進一步的圖像的分析和處理,常用在圖像分類、圖像識別等領域。

         本文所述內容和代碼如有錯誤,請同志們多多指教,當然圖像描述的方法還有很多,也請多多交流!

 

 

 

 

 

          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章