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图像的景象更深)。通过分析可见数据特征和图像的视觉特征相符,通常这些特征信息可以作为模式识别的特征输入量进行进一步的图像的分析和处理,常用在图像分类、图像识别等领域。

         本文所述内容和代码如有错误,请同志们多多指教,当然图像描述的方法还有很多,也请多多交流!

 

 

 

 

 

          

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