图像的灰度共生矩阵(转载)

Gray-level co-occurrence matrix from an image

图像的灰度共生矩阵

灰度共生矩阵是像素距离和角度的矩阵函数,它通过计算图像中一定距离和一定方向的两点灰度之间的相关性,来反映图像灰度在方向、间隔、变化幅度及快慢上的综合信息。它是分析图像的局部模式和它们排列规则的基础

使用方法:
glcm = graycomatrix(I)
glcms = graycomatrix(I,param1,val1,param2,val2,...)
[glcms,SI] = graycomatrix(...)

描述:
glcms = graycomatrix(I) 产生图像I的灰度共生矩阵GLCM。它是通过计算两灰度值在图像I中水平相邻的次数而得到的 (也不必是水平相邻的次数,这一参数是可调的,可能通过Offsets来进行调整,比如[0 D]代表是水平方向,[-D D]代表是右上角45度方向,[-D 0]代表是竖直方向,即90度方向,而[-D -D]则代表是左上角,即135度方向),GLCM中的每一个元素(i,j)代表灰度i与灰度j在图像中水平相邻的次数。

因为动态地求取图像的GLCM区间代价过高,我们便首先将灰度值转换到I的灰度区间里。如果I是一个二值图像,那么灰度共生矩阵就将图像转换到两级。如果I是一个灰度图像, 那将转换到8级。灰度的级数决定了GLCM的大小尺寸。你可以通过设定参数“NumLevels”来指定灰度的级数,还可以通过设置“GrayLimits"参数来设置灰度共生矩阵的转换方式。

下图显示了如何求解灰度共生矩阵,以(1,1)点为例,GLCM(1,1)值为1说明只有一对灰度为1的像素水平相邻。GLCM(1,2)值为2,是因为有两对灰度为1和2的像素水平相邻。

 

 

glcms = graycomatrix(I,param1,val1,param2,val2,...) 返回一个或多个灰度灰度共生矩阵,根据指定的参数。参数可以很简短,并且对大小写不敏感。

参数

'GrayLimits'  是两个元素的向量,表示图像中的灰度映射的范围,如果其设为[],灰度共生矩阵将使用图像I的最小及最大灰度值作为GrayLimits

'NumLevels'    一个整数,代表是将图像中的灰度归一范围。举例来说,如果NumLevels为8,意思就是将图像I的灰度映射到1到8之间,它也决定了灰度共生矩阵的大小

'Offset'   上面有解释,是一个p*2的整数矩阵,D代表是当前像素与邻居的距离,通过设置D值,即可设置角度
Angle        Offset
  0              [0 D]
 45             [-D D]
 90             [-D 0]
135            [-D -D]

示例:

计算灰度共生矩阵,并且返回缩放后的图像,SI
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',[])

计算灰度图像的灰度共生矩阵
I = imread('circuit.tif');
glcm = graycomatrix(I,'Offset',[2 0]);

灰度共生矩阵的特征:

角二阶矩(Angular Second Moment, ASM)
ASM=sum(p(i,j).^2)    p(i,j)指归一后的灰度共生矩阵
角二阶矩是图像灰度分布均匀程度和纹理粗细的一个度量,当图像纹理绞细致、灰度分布均匀时,能量值较大,反之,较小。

熵(Entropy, ENT)
ENT=sum(p(i,j)*(-ln(p(i,j)))    
是描述图像具有的信息量的度量,表明图像的复杂程序,当复杂程序高时,熵值较大,反之则较小。

反差分矩阵(Inverse Differential Moment, IDM)
IDM=sum(p(i,j)/(1+(i-j)^2))
反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较大;杂乱无章的,难于描述的,值较小。

 

  1. #define GLCM_DIS 3  //灰度共生矩阵的统计距离   
  2. #define GLCM_CLASS 16 //计算灰度共生矩阵的图像灰度值等级化   
  3. #define GLCM_ANGLE_HORIZATION 0  //水平   
  4. #define GLCM_ANGLE_VERTICAL   1  //垂直   
  5. #define GLCM_ANGLE_DIGONAL    2  //对角   
  6. int calGLCM(IplImage* bWavelet,int angleDirection,double* featureVector)  
  7. {  
  8.     int i,j;  
  9.     int width,height;  
  10.   
  11.     if(NULL == bWavelet)  
  12.         return 1;  
  13.   
  14.     width = bWavelet->width;  
  15.     height = bWavelet->height;  
  16.   
  17.     int * glcm = new int[GLCM_CLASS * GLCM_CLASS];  
  18.     int * histImage = new int[width * height];  
  19.   
  20.     if(NULL == glcm || NULL == histImage)  
  21.         return 2;  
  22.   
  23.     //灰度等级化---分GLCM_CLASS个等级   
  24.     uchar *data =(uchar*) bWavelet->imageData;  
  25.     for(i = 0;i < height;i++){  
  26.         for(j = 0;j < width;j++){  
  27.             histImage[i * width + j] = (int)(data[bWavelet->widthStep * i + j] * GLCM_CLASS / 256);  
  28.         }  
  29.     }  
  30.   
  31.     //初始化共生矩阵   
  32.     for (i = 0;i < GLCM_CLASS;i++)  
  33.         for (j = 0;j < GLCM_CLASS;j++)  
  34.             glcm[i * GLCM_CLASS + j] = 0;  
  35.   
  36.     //计算灰度共生矩阵   
  37.     int w,k,l;  
  38.     //水平方向   
  39.     if(angleDirection == GLCM_ANGLE_HORIZATION)  
  40.     {  
  41.         for (i = 0;i < height;i++)  
  42.         {  
  43.             for (j = 0;j < width;j++)  
  44.             {  
  45.                 l = histImage[i * width + j];  
  46.                 if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width)  
  47.                 {  
  48.                     k = histImage[i * width + j + GLCM_DIS];  
  49.                     glcm[l * GLCM_CLASS + k]++;  
  50.                 }  
  51.                 if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width)  
  52.                 {  
  53.                     k = histImage[i * width + j - GLCM_DIS];  
  54.                     glcm[l * GLCM_CLASS + k]++;  
  55.                 }  
  56.             }  
  57.         }  
  58.     }  
  59.     //垂直方向   
  60.     else if(angleDirection == GLCM_ANGLE_VERTICAL)  
  61.     {  
  62.         for (i = 0;i < height;i++)  
  63.         {  
  64.             for (j = 0;j < width;j++)  
  65.             {  
  66.                 l = histImage[i * width + j];  
  67.                 if(i + GLCM_DIS >= 0 && i + GLCM_DIS < height)   
  68.                 {  
  69.                     k = histImage[(i + GLCM_DIS) * width + j];  
  70.                     glcm[l * GLCM_CLASS + k]++;  
  71.                 }  
  72.                 if(i - GLCM_DIS >= 0 && i - GLCM_DIS < height)   
  73.                 {  
  74.                     k = histImage[(i - GLCM_DIS) * width + j];  
  75.                     glcm[l * GLCM_CLASS + k]++;  
  76.                 }  
  77.             }  
  78.         }  
  79.     }  
  80.     //对角方向   
  81.     else if(angleDirection == GLCM_ANGLE_DIGONAL)  
  82.     {  
  83.         for (i = 0;i < height;i++)  
  84.         {  
  85.             for (j = 0;j < width;j++)  
  86.             {  
  87.                 l = histImage[i * width + j];  
  88.   
  89.                 if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width && i + GLCM_DIS >= 0 && i + GLCM_DIS < height)  
  90.                 {  
  91.                     k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS];  
  92.                     glcm[l * GLCM_CLASS + k]++;  
  93.                 }  
  94.                 if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width && i - GLCM_DIS >= 0 && i - GLCM_DIS < height)  
  95.                 {  
  96.                     k = histImage[(i - GLCM_DIS) * width + j - GLCM_DIS];  
  97.                     glcm[l * GLCM_CLASS + k]++;  
  98.                 }  
  99.             }  
  100.         }  
  101.     }  
  102.   
  103.     //计算特征值   
  104.     double entropy = 0,energy = 0,contrast = 0,homogenity = 0;  
  105.     for (i = 0;i < GLCM_CLASS;i++)  
  106.     {  
  107.         for (j = 0;j < GLCM_CLASS;j++)  
  108.         {  
  109.             //熵   
  110.             if(glcm[i * GLCM_CLASS + j] > 0)  
  111.                 entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j]));  
  112.             //能量   
  113.             energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j];  
  114.             //对比度   
  115.             contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j];  
  116.             //一致性   
  117.             homogenity += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j];  
  118.         }  
  119.     }  
  120.     //返回特征值   
  121.     i = 0;  
  122.     featureVector[i++] = entropy;  
  123.     featureVector[i++] = energy;  
  124.     featureVector[i++] = contrast;  
  125.     featureVector[i++] = homogenity;  
  126.   
  127.     delete[] glcm;  
  128.     delete[] histImage;  
  129.     return 0;  
  130. }  
posted @ 2014-08-28 20:40  pei~乐悠悠  阅读(1941)  评论(0编辑  收藏  举报