首页 > 编程知识 正文

灰度共生矩阵的理解,简述灰度共生矩阵的生成过程

时间:2023-05-05 15:03:47 阅读:170500 作者:56

1 .灰度共生矩阵的生成原理

灰度共生矩阵(GLDM )的统计方法是20世纪70年代初由R.Haralick等人提出的,在假定图像中各像素间的空间分布关系包含图像纹理信息的基础上,提出了具有通用性的纹理分析方法。

度共生矩阵定义了在距离某一定位置(距离d,方位d )的点处,灰度值与灰度I的像素点一致的概率,也就是说,所有的推定值都可以表示为一个矩阵,将其称为灰度共生矩阵。 在纹理变化较慢的图像中,灰度共生矩阵对角线上的数值较大; 在纹理变化较快的图像中,灰度共生矩阵对角线上的值小,对角线两侧的值大。 由于灰度共生矩阵的数据量大,一般不直接作为区分纹理的特征,而是把建立在此基础上的一些统计量作为纹理分类特征。 Haralick提出了基于灰度共生矩阵计算的14种统计量。 即能量、熵、对比度、均匀性、相关、方差、和均值、和方差、和熵、差方差、差均值、差熵、相关信息测度、最大相关系数。

本文借用一个文章的例子来说明灰度共生矩阵,用文字来说明是说不清楚的。 我以前用这个方法做过实验,但还是会忘记,所以干脆用例子介绍一下,下次看也很容易理解。

由图像中的任意一点(x,y )和偏离它的一点) x a,y b ) (这里a,b是整数,定义)构成点对。 若将该点对的灰度值设为[f1,f2]、将图像的最大灰度等级设为l,则f1和f2的组合总共有L*L种。 关于整福图像,按[f1,f2]的值计算出现次数并排列成方阵,通过将它们用[f1,f2]的出现次数的总和归一化为出现概率P(f1,F2 )而生成的矩阵为灰度共生矩阵。

下图是一个简单的示例。

图a为原图像,最大灰度为16。 为了方便,在此将灰度数减少到4个阶段,将图a变为图b的形状。 由此,(f1,f2 )取的值的范围为[ 0,3 ]。 如果取不同的间隔,排列(f1,f2 )的各种组合出现的次数,就可以得到图e~g所示的灰度共生矩阵。

图e表示图b中的(x,y )和偏离它的(x 1,y 0 )构成点对,(f1,f2 )取值的情况)用黄色涂抹的部分在f1上取0,在f2上取1的情况下,从图b的填充情况容易看出共计110 类似地,f、g分别表示出现由图c、d中的(x,y )分别为点(x 1,y 1 )、(x 2,y 0 )构成的点对(f1,f2 )的情况)的图c的由黄色标注的部分由f1、f2, 通过比较可知,0、1、1、2、2、3、3、3、0的出现频率都很高。 图b示出了图像中存在明显的左上-右下方向纹理。

距离(a,b )的可取值不同,灰度共生矩阵中的值不同。 a和b可取的值根据纹理周期分布的特征来选择,但对于细小的纹理,需要取(1,0 )、(1,1 )、(2,0 )等值。 a、b的值小对应于变化缓慢的纹理图像,灰度共生矩阵对角线上的数值大。 纹理变化越快,对角线上的值越小,对角线两侧的值越大。

共生矩阵实际上是两个像素点的联合直方图,对于图像中细小有序的纹理,成对像素点的二维直方图趋于均匀分布; 对于粗而规则的纹理,倾向于最对角分布。

2 .灰度共生矩阵特征值2.1对比度度量矩阵值如何分布,图像局部变化量反映了图像清晰度和纹理沟槽深度。 纹理凹槽越深,对比度越大,效果越明显。 相反,对比度小时,槽纹浅,效果模糊。

2.2能量转换反映了图像灰度分布的均匀度和纹理的粗细。 灰度共生矩阵的元素值相近时,表示能量小,纹理细; 如果一部分值较大,另一部分值较小,则能量值会变大。 较大的能量值表示这是一种更加均匀且规则变化的纹理图案。

2.3熵影像包括信息量的随机性测量。 共生矩阵中所有值相等时,或者像素值显示最大随机性时,熵最大; 因而,熵值表示图像灰度分布的复杂性,熵值越大,图像越复杂。

2.4逆方差的逆方差反映了图像纹理局部变化的大小,如果图像纹理不同区域之间均匀且变化缓慢,则逆方差较大,反之亦然。

2.5相关性为了测定图像的灰度等级在行方向或者列方向上相似到什么程度,值的大小反映了局部的灰度相关性,值越大相关性也越大。

#define GLCM_DIS 3 //灰度共生矩阵统计距离#define GLCM_CLASS 16 //灰度共生矩阵的图像灰度值灰度化typedefenumglcm _ angle { glcm _ angle _ horiz atioz ation 计算的intcalglcm(unsignedchar*pimage,GLCM_ANGLE angleDirection,double* featureVector ) { int i,j; if(null==pimage )返回

1; int * glcm = new int[GLCM_CLASS * GLCM_CLASS]; int * histImage = new int[width * height]; if(NULL == glcm || NULL == histImage) return 2; //灰度等级化---分GLCM_CLASS个等级 for(i = 0;i < height;i++) { for(j = 0;j < width; j++){ histImage[i * width + j] = (int)(data[width*i+j] * GLCM_CLASS/256); } } //初始化共生矩阵 for (i = 0;i < GLCM_CLASS;i++) for (j = 0;j < GLCM_CLASS;j++) glcm[i * GLCM_CLASS + j] = 0; //计算灰度共生矩阵 int w,k,l; //水平方向 if(angleDirection == GLCM_ANGLE_HORIZATION) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width) { k = histImage[i * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width) { k = histImage[i * width + j - GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } } } } //垂直方向 else if(angleDirection == GLCM_ANGLE_VERTICAL) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(i + GLCM_DIS >= 0 && i + GLCM_DIS < height) { k = histImage[(i + GLCM_DIS) * width + j]; glcm[l * GLCM_CLASS + k]++; } if(i - GLCM_DIS >= 0 && i - GLCM_DIS < height) { k = histImage[(i - GLCM_DIS) * width + j]; glcm[l * GLCM_CLASS + k]++; } } } } //对角方向 else if(angleDirection == GLCM_ANGLE_DIGONAL) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { l = histImage[i * width + j]; if(j + GLCM_DIS >= 0 && j + GLCM_DIS < width && i + GLCM_DIS >= 0 && i + GLCM_DIS < height) { k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } if(j - GLCM_DIS >= 0 && j - GLCM_DIS < width && i - GLCM_DIS >= 0 && i - GLCM_DIS < height) { k = histImage[(i - GLCM_DIS) * width + j - GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; } } } } //计算特征值 double entropy = 0,energy = 0,contrast = 0,homogenity = 0; for (i = 0;i < GLCM_CLASS;i++) { for (j = 0;j < GLCM_CLASS;j++) { //熵 if(glcm[i * GLCM_CLASS + j] > 0) entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j])); //能量 energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j]; //对比度 contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j]; //一致性 homogenity += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j]; } } //返回特征值 i = 0; featureVector[i++] = entropy; featureVector[i++] = energy; featureVector[i++] = contrast; featureVector[i++] = homogenity; delete[] glcm; delete[] histImage; return 0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。