文章目录
学习记录,不当之处多多指教,在此感谢以下博主
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<iostream>
#include <cassert>
#include <vector>
#include <iterator>
#include <functional>
#include <algorithm>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
typedef vector<vector<int> > 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()
{
}
//============================