学习记录,不当之处多多指教,在此感谢以下博主
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(){ }//============================