灰度共生矩阵(GLCM,Gray-LevelCo-occurrenceMatrix)

灰度共⽣矩阵(GLCM,Gray-LevelCo-occurrenceMatrix)
概念
由于纹理是由灰度分布在空间位置上反复出现⽽形成的,因⽽在图像空间中相隔某距离的两像素之间会存在⼀定的灰度关系,即图像中灰度的空间相关特性。灰度共⽣矩阵就是⼀种通过研究灰度的空间相关特性来描述纹理的常⽤⽅法。
灰度共⽣矩阵是涉及像素距离和⾓度的矩阵函数,它通过计算图像中⼀定距离和⼀定⽅向的两点灰度之间的相关性,来反映图像在⽅向、间隔、变化幅度及快慢上的综合信息。
灰度直⽅图是对图像上单个像素具有某个灰度进⾏统计的结果,⽽灰度共⽣矩阵是对图像上保持某距离的两像素分别具有某灰度的状况进⾏统计得到的。
GLCM 所代表的含义
灰度共⽣矩阵元素所表⽰的含义,以(1,1)点为例,GLCM(1,1)值为1说明左侧原图只有⼀对灰度为1的像素⽔平相邻。
GLCM(1,2)值为2,是因为原图有两对灰度为1和2的像素⽔平相邻。
灰度共⽣矩阵的特征
1) ⾓⼆阶矩(Angular Second Moment, ASM)
公式:ASM = sum(p(i,j).^2),其中  p(i,j) 表⽰归⼀后的灰度共⽣矩阵
意义:⾓⼆阶矩是图像灰度分布均匀程度和纹理粗细的⼀个度量,当图像纹理绞细致、灰度分布均匀时,能量值较⼤,反之,较⼩。
2) 熵(Entropy, ENT)
公式:ENT=sum(p(i,j)*(-log(p(i,j)))
意义:描述图像具有的信息量的度量,表明图像的复杂程度,当复杂程度⾼时,熵值较⼤,反之则较⼩。
3) 反差分矩阵(Inverse Differential Moment, IDM)
公式:IDM=sum(p(i,j)/(1+(i-j)^2))
意义:反映了纹理的清晰程度和规则程度,纹理清晰、规律性较强、易于描述的,值较⼤;杂乱⽆章的,难于描述的,值较⼩。 OpenCV 代码
// 0°灰度共⽣矩阵
// 0°灰度共⽣矩阵
void getGLCM0(Mat& src, Mat& dst, int gray_level)// 0度灰度共⽣矩阵{
CV_Assert(1 == src.channels());
int height = ws;
int width = ls;
dst = Scalar::all(0);
for (int i = 0; i < height; i++)
{
int*srcdata = src.ptr<int>(i);
for (int j = 0; j < width - 1; j++)
{
// 同样的像素对,⽔平相邻
int rows = srcdata[j];
int cols = srcdata[j + 1];
dst.ptr<int>(rows)[cols]++;
真菌恐惧症
}
}
}
// 90°灰度共⽣矩阵
void getGLCM90(Mat& src, Mat& dst, int gray_level)
{
CV_Assert(1 == src.channels());
int height = ws;
int width = ls;
dst = Mat(gray_level, gray_level, CV_32SC1, Scalar(0));
for (int i = 0; i < height - 1; i++)
{
int*srcdata = src.ptr<int>(i);
int*srcdata1 = src.ptr<int>(i + 1);
for (int j = 0; j < width; j++)
{
// 同样的像素对,垂直相邻
int rows = srcdata[j];
int cols = srcdata1[j];
dst.ptr<int>(rows)[cols]++;
}
}
}
// 45°灰度共⽣矩阵
void getGLCM45(Mat& src, Mat& dst, int gray_level)
{
CV_Assert(1 == src.channels());
int height = ws;
int width = ls;
dst = Mat(gray_level, gray_level, CV_32SC1, Scalar(0));
for (int i = 0; i < height - 1; i++)
{
int*srcdata = src.ptr<int>(i);
int*srcdata1 = src.ptr<int>(i + 1);
for (int j = 0; j < width - 1; j++)
{
// 同样的像素对,45°相邻
// 同样的像素对,45°相邻
int rows = srcdata[j];贺敏仁
int cols = srcdata1[j + 1];
dst.ptr<int>(rows)[cols]++;
}
}
}
/
/ 135°灰度共⽣矩阵
void getGLCM135(Mat& src, Mat& dst, int gray_level)
{
CV_Assert(1 == src.channels());
int height = ws;
int width = ls;
dst = Mat(gray_level, gray_level, CV_32SC1, Scalar(0));
for (int i = 0; i < height - 1; i++)
{
int*srcdata = src.ptr<int>(i);
兖矿休闲网络int*srcdata1 = src.ptr<int>(i + 1);
for (int j = 1; j < width; j++)
{
// 同样的像素对,135°相邻
int rows = srcdata[j];
int cols = srcdata1[j - 1];
dst.ptr<int>(rows)[cols]++;
}
}
}
// 计算特征值
void featureGLCM(Mat&src, double& Asm, double& Ent, double& Con, double& Idm) {
CV_Assert(src.channels() == 1);
int height = ws;
int width = ls;
int total = 0;
//求图像所有像素的灰度值的和
for (int i = 0; i < height; i++)
{
int*srcdata = src.ptr<int>(i);
for (int j = 0; j < width; j++)
{
total += srcdata[j];
}
}
//图像每⼀个像素的的值除以像素总和
Mat mean;
for (int i = 0; i < height; i++)
{
int*srcdata = src.ptr<int>(i);
double*copydata = mean.ptr<double>(i);
for (int j = 0; j < width; j++)
{
copydata[j] = (double)srcdata[j] / (double)total;
}
成长第一课堂}
for (int i = 0; i < height; i++)
{
double*srcdata = mean.ptr<double>(i);
for (int j = 0; j < width; j++)
{
上上下下的享受
// 能量
Asm += srcdata[j] * srcdata[j];
// 熵(Entropy)
if (srcdata[j]>0)
Ent -= srcdata[j] * log(srcdata[j]);
// 对⽐度
Con += (double)(i - j)*(double)(i - j)*srcdata[j];
// 逆差矩
Idm += srcdata[j] / (1 + (double)(i - j)*(double)(i - j));  }
自由绘画}
}
注:本代码以 offset = 1 为例
参考⾃:

本文发布于:2024-09-23 19:15:55,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/104935.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:灰度   图像   矩阵
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议