知方号

知方号

灰度共生矩阵&灰度梯度共生矩阵<灰度共生矩阵计算代码>

灰度共生矩阵&灰度梯度共生矩阵

文章目录 1,灰度共生矩阵(Gray Level Cooccurrence Matrix) 1.0感谢 1.1初识 1.2Opencv实现 2,灰度梯度共生矩阵(Gray-Gradient Cooccurence Matrix,GGCM) 2.0,感谢 2.1,初识 2.2,Opencv实现

学习记录,不当之处多多指教,在此感谢以下博主

1,灰度共生矩阵(Gray Level Cooccurrence Matrix) 1.0感谢

灰度共生矩阵的原理及实现(特征提取)-OpenCV 灰度共生矩阵的生成和理解 灰度共生矩阵原理

1.1初识

以水平相邻为例: GLCM(1,1)=1表示I图中左右相邻都为1的只有一对 GLCM(1,2)=2表示I图中左右分别为1,2的有两对,如上图的红线所示

通常我们假设有两个点f(x,y)与f(x+a,y+b)相邻:x方向相隔a,y方向相隔b a=1,b=0:水平相邻,0度 a=1,b=1:对角相邻,45度 a=-1,b=1:对角相邻,135度

1,灰度共生矩阵定义为:从灰度为i的像素点出发,统计保持一定距离的两具有某灰度分布的像素。统计"灰度对"同时发生的概率,形成了灰度共生矩阵。 2,共生矩阵用两个位置的像素的联合概率密度来定义,它不仅反应亮度的分布特征,也反映具有相同亮度或者接近亮度像素之间的位置分布特性,是有关图像亮度变换的二阶统计特征。 3,一般不直接作为区分纹理特征(数据量大),一般采用如下统计量:能量,熵,对比度,均匀性,相关性,方差,和平均,和方差,和熵,差方差,差平均,差熵,相关信息测度,最大相关系数。

能量:角二阶矩阵(Angular Second Moment,ASM),Energy,uniformity,uniformity of energy 公式: ASM=sum(p(i,j).^2)  p(i,j)是归一化的灰度共生矩阵。反应了图像灰度分布均匀程度和纹理粗细度,图像均匀,纹理较细,反应在共生矩阵就是大量集中在某一部分,因此ASM值大。

熵:(Entropy,ENT) 公式: ENT = sum(p(i,j)*(-log(p(i,j))))  p(i,j)是归一化的灰度共生矩阵。描述图像具有的信息量的度量,表明图像的复杂度,和复杂度成正比。

反差分矩阵:(Inverse Differential Moment,IDM) 公式: IDM = sum(p(i,j)/(1+(i-j)^2))  反应了纹理的清晰程度和规则程度,纹理清晰,规律性强,易于描述,值较大,反之较小。

对比度:(Contrast) 公式: contrast= sum(p(i,j)*(i-j)^2)  返回图像中某个像素与它的邻居之间的对比度。反映了图像的清晰度和纹理沟纹深浅的程度

1.2Opencv实现

代码源自: 传送门

GLCM.h

#include#include #include #include #include #include #include using namespace std;using namespace cv;typedef vector VecGLCM;typedef struct _GLCMFeatures{ _GLCMFeatures() : energy(0.0) , entropy(0.0) , contrast(0.0) , idMoment(0.0) { } double energy; // 能量ASM:angular second moment double entropy; // 熵 double contrast; // 对比度 double idMoment; // 逆差分矩, inverse difference moment} GLCMFeatures;class GLCM{ public: GLCM(); ~GLCM();public: // 枚举灰度共生矩阵的方向 enum { GLCM_HORIZATION = 0, // 水平 GLCM_VERTICAL = 1, // 垂直 GLCM_ANGLE45 = 2, // 45度角 GLCM_ANGLE135 = 3 // 135度角 };public: // 计算灰度共生矩阵 void calGLCM(IplImage* inputImg, VecGLCM& vecGLCM, int angle); // 计算特征值 void getGLCMFeatures(VecGLCM& vecGLCM, GLCMFeatures& features);public: // 初始化灰度共生矩阵 void initGLCM(VecGLCM& vecGLCM, int size = 16); // 设置灰度划分等级,默认值为 16 void setGrayLevel(int grayLevel) { m_grayLevel = grayLevel; } // 获取灰度等级 int getGrayLevel() const { return m_grayLevel; }private: // 计算水平灰度共生矩阵 void getHorisonGLCM(VecGLCM &src, VecGLCM &dst, int imgWidth, int imgHeight); // 计算垂直灰度共生矩阵 void getVertialGLCM(VecGLCM &src, VecGLCM &dst, int imgWidth, int imgHeight); // 计算 45 度灰度共生矩阵 void getGLCM45(VecGLCM &src, VecGLCM &dst, int imgWidth, int imgHeight); // 计算 135 度灰度共生矩阵 void getGLCM135(VecGLCM &src, VecGLCM &dst, int imgWidth, int imgHeight);private: int m_grayLevel; // 将灰度共生矩阵划分为 grayLevel 个等级};

GLCM.cpp

#include "stdafx.h"#include "GLCM.h"GLCM::GLCM() : m_grayLevel(16){ }GLCM::~GLCM(){ }//============================

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。