灰度共生矩阵

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

灰度共生矩阵

概念:

像素灰度在空间位置上的反复出现形成图像的纹理,GLCM是描述具有某种空间位置关系两个像素灰度的联合分布

含义:

就是两个像素灰度的联合直方图,是一种二阶统计量

就是两个像素点的关系。像素关系可以根据不同的纹理特性进行选择,也就是的大小可以自由选

像素的空间位置关系:

取。对于较细的纹理分析可以取像素间距为1,是水平扫描;是垂直扫描;是45度扫描;是

135度扫描(原博文有错误)。一旦位置空间确定,就可以生成灰度共生矩阵。

矩阵的物理意义:

用表示灰度共生矩阵,它是一个的矩阵(L为灰度级,就是一幅图中包含的不同灰度或者颜色的个数),是具有空间位置关系且灰度分别为i

和j的两个像素出现的次数或频率(归一化)

例如:下图是某纹理像素的放大,和对应的像素灰度矩阵

此图像只有三种灰度,故灰度级为3,灰度共生矩阵是一个3*3的矩阵

归一化形式为

改变位置空间的定义,灰度共生矩阵相应地改变:

归一化形式为:

矩阵的特征量:

从灰度共生矩阵上可以简单的看出,如果对角附近的元素有较大的值,说明图像的像素具有相似的像素值,如果偏离对角线的元素会有比较大的值,说明像素灰度在局部有较大变化。为了得到更多的纹理特征,我们还需要在进行计算:

对比度)(或反差)(contrast):

纹理沟纹越深,其对比度越大,视觉效果越清晰;反之,对比度小,则沟纹浅,效果模糊。灰度差即对比度大的象素对越多,这个值越大。灰度公生矩阵中远离对角线的元素值越大,con越大。所以con越大图像越清晰

相关度(inverse different moment):

度量空间灰度共生矩阵元素在行或列方向上的相似程度,因此,相关值大小反映了图像中局部灰度相关性。当矩阵元素值均匀相等时,相关值就大;相反,如果矩阵像元值相差很大则相关值小。

能量:是灰度共生矩阵元素值的平方和,所以也称之为能量,反映了图像灰度分布均匀程度和纹理粗细度。ASM值大表明一种较均一和规则变化的纹理模式。

熵(entropy):熵在物理中的含义就是物体的规则度,越有序熵越小,越无序熵越大。此处熵同样表示图像的信息量,当共生矩阵中所有元素有最大的随机性、空间共生矩阵中所有值几乎相等时,共生矩阵中元素分散分布时,熵较大。它表示了图像中纹理的非均匀程度或复杂程度。

自相关(correlation):反应了图像纹理的一致性。如果图像中有水平方向纹理,则水平方向矩阵的COR大于其余矩阵的COR值。

代码:

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; // 能量

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 "GLCM.h"

GLCM::GLCM() : m_grayLevel(16)

{

}

GLCM::~GLCM()

{

}

相关文档
最新文档