灰度共生矩阵
灰度共生矩阵是图像特征分析和提取的重要方法之一。它在纹理分析、特征分类和图像质量评价方面有着重要的应用。其基本原理如下所示:
左边有一个图像。可以看出,最小灰度为1,最大灰度为8。总共有8个灰度级。对应灰度共生矩阵左上角第一行第一列的坐标(1,1)包含值1,因为在水平方向上,当前像素与水平右相邻像素之间只有一个像素值1、1相邻像素值(灰度)对;右侧共生矩阵的原(1,2)=2表示像素矩阵中有两对像素值为1,2的相邻像素,以此类推,得到完整的右侧灰度共生矩阵。可以根据当前像素和相邻像素的不同位置计算不同的共生矩阵,根据像素之间的不同距离输出不同的灰度共生矩阵。综上所述,灰度共生矩阵有四个不同的角度,如下:
0度水平方向
40度方向的GLCM
90度垂直GLCM
15度方向GLCM
根据相邻像素间距离参数d的不同,可以得到不同距离的灰度共生矩阵。另外,对于正常的灰度图像,最小灰度值为0,最大灰度值为255,总共有256个灰度级,所以GLCM的大小是256x256,但是我们可以降低灰度级的维数,比如每8个灰度值可以代表一个等级,这样就可以把原来的256x256的共生矩阵改成256/8 * 256 /8=32x32。因此,有三个关键参数最终影响灰度共生矩阵的生成:
角度(支持0,45、90,135)
距离(大于或等于1个像素单位)
灰度级(最大灰度系数=256 x 56)
灰度共生矩阵实现纹理特征计算
共生矩阵支持以下纹理特征计算,它们是:
活力
熵值
对比
相互关系
逆差
这些纹理特征计算如下:
以上五个是GLCM常见的纹理特征,GLCM一共14个特征值输出,所以我赢了不要在这里重复!有兴趣的可以自行搜索关键词GLCM。
OpenCV计算灰度共生矩阵
OpenCV本身并不没有灰度共生矩阵的算法实现,需要通过对比自己的编码实现来计算图像灰度共生矩阵。代码实现步骤如下:
加载图像,灰度转换
创建灰度共生矩阵Mat对象
计算灰度共生矩阵
显示灰度共生矩阵
我这里用的角度是0,45、90,135、像素距离d=1、灰度256。代码实现如下:
//0,45,90,135 Matglcm _ 0=Mat:zeros(Size(step,step),CV _ 32fc 1);for(introw=0;rowheightrow){ for(int col=0;colwidthcol ){inti=gray.at(row,col);intj=gray.at(row,col 1);glcm_0.at(i,j);} } Matglcm _ 45=Mat:zeros(Size(step,step),CV _ 32fc 1);for(introw=1;row height-1;row){ for(int col=1;colwidth-1;col ){inti=gray.at(row,col);intj=gray.at(row-1,col 1);glcm_45.at(i,j);} } Matglcm _ 90=Mat:zeros(Size(step,step),CV _ 32fc 1);for(introw=1;row height-1;row){ for(int col=0;colwidthcol ){inti=gray.at(row,col);intj=gray.at(row-1,col);glcm_90.at(i,j);} } Matglcm _ 135=Mat:zeros(Size(step,step),CV _ 32fc 1);for(introw=1;rowheightrow){ for(int col=1;colwidthcol ){inti=gray.at(row,col);intj=gray.at(row-1,col-1);glcm_135.at(i,j);}}normalize(glcm_0,glcm_0,0,1.0,NORM _ MINMAX);normalize(glcm_45,glcm_45,0,1.0,NORM _ MINMAX);normalize(glcm_90,glcm_90,0,1.0,NORM _ MINMAX);normalize(glcm_135,glcm_135,0,1.0,NORM _ MINMAX);
运行效果如下:图1
斑马线灰度共生矩阵
提取图像对比度特征
基于共生矩阵实现纹理特征计算。这里我用一个简单的对比度计算来实现局部纹理特征提取。代码如下(局部窗口大小8x8、灰度级256/32=8级)
int step=256ma image=im read(d:/images/ft texture。jpg );//mati image=im read(D:/images/ban _ texturejpg );马特格雷;颜色(图像,灰色,颜色_ bgr 2灰色);imshow(灰色'灰色);in thigh=gray . rows intwidth=gray . colsmatglcm _ 0=Mat:zeros(Size(width,height),CV _ 32fc 1);直肠ROI。x=0;投资回报率。y=0;投资回报率。宽度=8;投资回报率。高度=8;for(introw=4;行高-4;row){ for(int col=4;colwidth-4;col){ ROI。x=col-4;投资回报率。y=第4行;float PV=calculate _ matrix(gray(ROI));glcm_0.at(row,col)=PV;}}normalize(glcm_0,glcm_0,0,1.0,NORM _ MINMAX);imshow(glcm ,glcm _ 0);等待键(0);
方法计算灰度矩阵的代码如下:
Matm=Mat:zeros(Size(8,8),CV _ 32fc 1);for(introw=0;罗维姆。第1行;row){ for(int col=0;科林。cols-1;col ){inti=im.at(row,col)/32;intj=im.at(第一行第一列)/32;m.at(i,j);} }浮动对比度=0;for(inti=0;i8;I){ for(intj=0;j8;j ){contrast=m.at(i,j)*(I-j)*(I-j);} }对比度
计算135 的灰度共生矩阵,基于计算局部对比度提取纹理运行结果如下:
测试一(左侧是输入图像、右侧135的对比度)
审核彭静
标签:灰度矩阵图像