0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

灰度共生矩阵(GLCM)基本原理

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-08-14 11:53 次阅读

灰度共生矩阵

灰度共生矩阵(Gray Level CO-Occurrence Matrix-GLCM)是图像特征分析与提取的重要方法之一,在纹理分析、特征分类、图像质量评价灯方面都有很重要的应用,其基本原理图示如下:

c1e45a22-1b0f-11ed-ba43-dac502259ad0.png

左侧是一个图像,可以看出最小的灰度级别是1,最大的灰度级别是8,共有8个灰度级别。右侧对应的灰度共生矩阵,左上角第一行与第一列的坐标(1, 1)包含值1,原因在于水平方向上,相距一个像素值,当前像素跟水平右侧相邻像素只有一个是1、1相邻的像素值(灰度级别)对;右侧共生矩阵的原始(1, 2) = 2 说明在像素矩阵中有两个像素值1,2相邻的像素点对、以此类推得到完整的右侧灰度共生矩阵。根据当前像素跟相邻像素位置不同,可以计算得到不同的共生矩阵,同时根据像素之间的距离不同会输出不同灰度共生矩阵。总结来说,有如下四种不同角度的灰度共生矩阵:

c1f4617e-1b0f-11ed-ba43-dac502259ad0.png

0度水平方向GLCM

45度方向GLCM

90度垂直方向GLCM

135度方向GLCM

根据相邻像素点之间距离参数D不同可以得到不同距离的GLCM。此外对正常的灰度图像来说,最小灰度值为0,最大的灰度值为255,共计256个灰度级别,所以GLCM的大小为256x256,但是我们可以对灰度级别进行降维操作,比如可以每8个灰度值表示一个level这样,这样原来256x256大小的共生矩阵就可以改成256/8 * 256 /8 = 32x32的共生矩阵。所以最终影响灰度共生矩阵生成有三个关键参数:

角度 (支持0、45、90、135)

距离(大于等于1个像素单位)

灰度级别(最大GLCM=256 x 56)

GLCM实现纹理特征计算

灰度共生矩阵支持如下纹理特征计算,它们是:

能量

熵值

对比度

相关性

逆分差

这些纹理特征计算公式如下:

c2102562-1b0f-11ed-ba43-dac502259ad0.png

上述5个是常见的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_32FC1);
for(introw=0;row< height; row++) {
    for (int col = 0; col < width; col++) {
        int i = gray.at(row,col);
intj=gray.at(row,col+1);
glcm_0.at(i,j)++;
}
}

Matglcm_45=Mat::zeros(Size(step,step),CV_32FC1);
for(introw=1;row< height -1; row++) {
    for (int col = 1; col < width-1; col++) {
        int i = gray.at(row,col);
intj=gray.at(row-1,col+1);
glcm_45.at(i,j)++;
}
}
Matglcm_90=Mat::zeros(Size(step,step),CV_32FC1);
for(introw=1;row< height-1; row++) {
    for (int col = 0; col < width; col++) {
        int i = gray.at(row,col);
intj=gray.at(row-1,col);
glcm_90.at(i,j)++;
}
}
Matglcm_135=Mat::zeros(Size(step,step),CV_32FC1);
for(introw=1;row< height; row++) {
    for (int col = 1; col < width; col++) {
        int i = 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);

运行效果如下:图一

c2216962-1b0f-11ed-ba43-dac502259ad0.jpg

斑马线的灰度共生矩阵

c2382ee0-1b0f-11ed-ba43-dac502259ad0.jpg

提取图像对比度特征

基于共生矩阵实现纹理特征计算,这里我用了比较简单的对比度计算来实现局部纹理特征提取、代码实现如下(局部窗口大小8x8、灰度级别256/32 =8个级别)

intstep=256;
Matimage=imread("D:/images/ftexture.jpg");
//Matimage=imread("D:/images/ban_texture.jpg");
Matgray;
cvtColor(image,gray,COLOR_BGR2GRAY);
imshow("gray",gray);
intheight=gray.rows;
intwidth=gray.cols;

Matglcm_0=Mat::zeros(Size(width,height),CV_32FC1);
Rectroi;
roi.x=0;
roi.y=0;
roi.width=8;
roi.height=8;

for(introw=4;row< height-4; row++) {
    for (int col = 4; col < width-4; col++) {
        roi.x = col-4;
        roi.y = row - 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);
waitKey(0);

方法计算灰度矩阵的代码如下:

Matm=Mat::zeros(Size(8,8),CV_32FC1);
for(introw=0;row< im.rows-1; row++) {
    for (int col = 0; col < im.cols-1; col++) {
        int i = im.at(row,col)/32;
intj=im.at(row+1,col+1)/32;
m.at(i,j)++;
}
}
floatcontrast=0;
for(inti=0;i< 8; i++) {
    for (int j = 0; j < 8; j++) {
        contrast += m.at(i,j)*(i-j)*(i-j);
}
}
returncontrast;

计算135°的灰度共生矩阵,基于计算局部对比度提取纹理运行结果如下:

测试一(左侧是输入图像、右侧135的对比度)

c2487c46-1b0f-11ed-ba43-dac502259ad0.jpg

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码
    +关注

    关注

    6

    文章

    835

    浏览量

    54452
  • 图像特征
    +关注

    关注

    0

    文章

    13

    浏览量

    6999
  • 灰度共生矩阵

    关注

    0

    文章

    2

    浏览量

    825

原文标题:基于灰度共生矩阵(GLCM)的图像纹理分析与提取

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CT的基本原理及方法

    CT的基本原理及方法人体内不同组织对射线的吸收率是不同的,这也是 CT 技术的基本原理。如下图所示:图(1)左侧代表一未知灰度的区域,每小块灰度值相同,分别以μ 标记,如图所示做两次投
    发表于 06-14 15:56

    步进电机基本原理

    本帖最后由 eehome 于 2013-1-5 09:48 编辑 步进电机基本原理
    发表于 08-16 16:17

    串联谐振逆变器的基本原理

    串联谐振通常伴有逆变器。该组合称为串联谐振逆变器。什么是基本原理?让我简要介绍串联谐振逆变器的一些基本原理。]首先给你看一张图片:
    发表于 11-07 10:21

    IC测试的基本原理是什么?

    本文详细介绍了芯片开发和生产过程中的IC测试基本原理
    发表于 05-08 07:33

    电机转动的基本原理是什么?

    电机转动的基本原理是什么?电机运动的基本原则有哪些?
    发表于 07-21 07:59

    线性电源的基本原理是什么

    多路线性电源 AC-DC稳压电源 低纹波电源 可调线性电源 原理图PCB目录多路线性电源 AC-DC稳压电源 低纹波电源 可调线性电源 原理图PCB基本原理芯片选型原理图&3D-PCB具体
    发表于 07-30 07:47

    无线充电的基本原理是什么

    一 、无线充电基本原理无线充电的基本原理就是我们平时常用的开关电源原理,区别在于没有磁介质耦合,那么我们需要利用磁共振的方式提高耦合效率,具体方法是在发送端和接收端线圈串并联电容,是发送线圈处理谐振
    发表于 09-15 06:01

    RAID技术的基本原理是什么

    RAID技术的基本原理是什么?RAID技术有哪几个优势?
    发表于 10-14 12:01

    串口通信的基本原理是什么?

    同步通信和异步通信的区别是什么?串口通信的基本原理是什么?
    发表于 12-13 06:46

    基于灰度共生矩阵的自适应图像边缘检测

    纹理分析是图像处理中一种十分重要的方法。通过纹理分析,利用灰度共生矩阵惯性矩特征值能够反映图像灰度空间复杂度的特性,成功获取了LOG边缘检测算子最佳空间系数,抑制
    发表于 08-05 15:22 0次下载

    基于GLCM和CGA的人脸表情识别方法

    灰度共生矩阵GLCM 纹理是图像分析中常用的特征% 一般说来可以认为 纹理由许多相互接近的( 互相交织的元素组成% 并具有 一定的周期性 量化图像的纹理内容是描述图像的一种 重要方法
    发表于 02-11 14:14 70次下载
    基于<b class='flag-5'>GLCM</b>和CGA的人脸表情识别方法

    步进马达基本原理

    步进马达基本原理步进马达基本原理步进马达基本原理
    发表于 11-30 11:55 8次下载

    基于分块颜色矩和灰度共生矩阵的图像检索_岳磊

    基于分块颜色矩和灰度共生矩阵的图像检索_岳磊
    发表于 03-17 09:57 1次下载

    三像素彩色共生矩阵的图像检索

    种颜色,并且对图像进行共生矩阵分析,最后采用90维特征向量来描述图像特征。实验结果表明,三像素彩色共生矩阵的检索性能优越于灰度
    发表于 12-19 16:34 1次下载

    使用结合改进聚合通道特征和灰度共生矩阵设计的俯视行人检测算法介绍

    针对传统俯视行人检测方法提取的头部特征单一、检测错误率高的问题,提出了结合改进聚合通道特征(ACF)和灰度共生矩阵GLCM)的俯视行人检测算法。首先,将提取到的HSV颜色特征、梯度幅
    发表于 12-24 16:59 6次下载
    使用结合改进聚合通道特征和<b class='flag-5'>灰度</b><b class='flag-5'>共生</b><b class='flag-5'>矩阵</b>设计的俯视行人检测算法介绍