利用灰度共生矩阵提取图像纹理特征

利⽤灰度共⽣矩阵提取图像纹理特征
利⽤灰度共⽣矩阵提取图像纹理特征
--xuliang 1. 灰度共⽣矩阵概念
灰度共⽣矩阵定义为像素对的联合概率分布,是⼀个对称矩阵,它不仅反映图像灰度在相邻的⽅向、相邻间隔、变化幅度的综合信息,但也反映了相同的灰度级像素之间的位置分布特征,是计算纹理特征的基础。
在图像中任意取⼀点(x,y)及偏离它的⼀点(x+a,y+b)(其中,a、b为整数,⼈为定义)构成点对。设该点对的灰度值为(f1,f2),再令点(x,y)在整幅图像上移动,则会得到不同的(f1,f2)值。
设图像的最⼤灰度级为L,则f2与f2的组合共有L*L种。对于整幅图像,统计出每⼀种(f1,f2)值出现的次数,然后排列成⼀个⽅阵,再⽤
(f1,f2)出现的总次数将他们归⼀化为出现的概率P(f1,f2),由此产⽣的矩阵为灰度共⽣矩阵。θ⽅向上的间隔为d的灰度共⽣矩阵实际上
是θ⽅向间隔为d的灰度变化量的联合概率分布。
2. 共⽣矩阵的计算
(1)
公式(1)中d表⽰像素间隔,(k,l), (m,n)分别为原像素和偏移后的像素坐标,其中k,m为纵坐标,D为图像范围[Image Processing, Analysis, and Machine Vision (Sonka 3rd Edition2007)]。
举例说明,假设原图像如图1.a所⽰
1.a 灰度图像                              1.b 0°⽅向距离为1的灰度共⽣矩阵                            1.c P135°,1
对1.b中蓝⾊字表⽰原像素灰度值,红字为偏移后像素灰度值。则对矩阵元素P0°,1 (0,0)表⽰1.a中在0°⽅向上(包括正和负⽅向)相距为1的(0,0)点对有两对,考虑正负⽅向的加倍效果,P0°,1 (0,0)=4。同样由于公式(1)对距离d定义的双向性,使得灰度共⽣矩阵为对称矩阵。
为了减⼩计算量,可将d定义为沿θ正⽅向。则(1)式变为
(2)
由1.a得到的新的灰度共⽣矩阵为
3. 共⽣矩阵计算纹理特征
能量(Energy):是灰度共⽣矩阵各元素值的平⽅和,是对图像纹理的灰度变化稳定程度的度量,反应了图像灰度分布均匀程度和纹理粗细度。能量值⼤表明当前纹理是⼀种规则变化较为稳定的纹理。
(3)
熵(Entropy):是图像包含信息量的随机性度量。当共⽣矩阵中所有值均相等或者像素值表现出最⼤的随机性时,熵最⼤;因此熵值表明了图像灰度分布的复杂程度,熵值越⼤,图像越复杂。
(4)
最⼤概率(Maximum probability):表⽰图像中出现次数最多的纹理特征。
(5)
对⽐度(Contrast):度量矩阵的值是如何分布和图像中局部变化的多少,反应了图像的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越⼤,效果清晰;反之,对⽐值⼩,则沟纹浅,效果模糊。对公式(6),典型的有κ=2,λ=1。
jnc录音笔(6)
倒数差分矩(Inverse difference moment):反映图像纹理的同质性,度量图像纹理局部变化的多少。其值⼤则说明图像纹理的不同区域间缺少变化,局部⾮常均匀。
(7)
相关性(Correlation):⾃相关反应了图像纹理的⼀致性。如果图像中有⽔平⽅向纹理,则⽔平⽅向共⽣矩阵Correlation值⼤于其余⽅向共⽣矩阵Correlation的值。它度量空间灰度共⽣矩阵元素在⾏或列⽅向上的相似程度,因此,相关值⼤⼩反映了图像中局部灰度相关性。当矩阵元素值均匀相等时,相关值就⼤;相反,如果矩阵像元值相差很⼤则相关值⼩。
(8)
其中μx, μy为均值,σx, σy为标准差,计算公式如下
4. 算法实现
GLCM.h
#include <cv.h>
enum GLCMdirEnum
{
horizonal = 1,//0°
vertical = 2,//90°
diagonal = 3,//45°
antidiagonal = 4//135°
};
class GLCM
{
private:
unsigned int** GLCMdata;
unsigned char* imageData;
int imageWidth,imageWidthStep,imageHeight,imageDepth,GLCMheight;
public:
unsigned int GLCMenergy,GLCMcontrast,GLCMmaxprobability,GLCMstdeviation;
double GLCMentropy,GLCMIDM,GLCMcorrelation;
int getImage(IplImage* pimg);
int calImageGLCM(GLCMdirEnum direction,int distance,int newgraydepth);
int initGLCM(int newgraydepth);
int releaseGLCM();
int printGLCM();
};
GLCM.cpp
#include "GLCM.h"
#include <iostream>
using namespace cv;
using namespace std;
int GLCM::getImage(IplImage* pimg)
{
if (!(pimg->imageData))
{
return -1;
}
imageData = (unsigned char*)pimg->imageData;
imageDepth = pimg->depth;
imageWidth = pimg->width;
imageWidthStep = pimg->widthStep;
imageHeight = pimg->height;
return 0;
}
int GLCM::calImageGLCM(GLCMdirEnum direction,int distance,int newgraydepth) {
if (direction>4||direction<1)
{
cout<<"entry a direction value between 1 to 4"<<endl;
return -1;
高速机
}
if (newgraydepth>imageDepth||newgraydepth<1)
{
cout<<"entry a bitdepth value between 1 to origin image bitdepth"<<endl;
return -1;
}
int nextpixeloffset;
int rowrange[2], colrange[2];
rowrange[0] = colrange[0] = 0;
rowrange[1] = imageHeight-1, colrange[1] = imageWidth-1;
switch (direction)
{
case horizonal://0°
内蒙古大营铀矿
nextpixeloffset = distance;
colrange[1] -= distance;
break;
case vertical://90°
nextpixeloffset = - (distance * imageWidthStep);
rowrange[0] += distance;
break;
case diagonal://45°
nextpixeloffset = - (distance * imageWidthStep) + distance;光彩体育馆
rowrange[0] += distance;
colrange[1] -= distance;
break;
case antidiagonal://135°
nextpixeloffset = - (distance * imageWidthStep) - distance;
rowrange[0] += distance;
colrange[0] += distance;
break;
default:
break;
}
/
/计算灰度共⽣矩阵
unsigned int glcm8U[256][256]={0};
int ipixel,jpixel;
for (jpixel=rowrange[0];jpixel<=rowrange[1];jpixel++)
for (jpixel=rowrange[0];jpixel<=rowrange[1];jpixel++)
{
for (ipixel=colrange[0];ipixel<=colrange[1];ipixel++)
{
int pixelpos = jpixel*imageWidthStep+ipixel;
glcm8U[imageData[pixelpos]][imageData[pixelpos+nextpixeloffset]]++;
}
}
initGLCM(newgraydepth);
int nsubmatsize = 256/GLCMheight;
int imatsize,jmatsize,isubmatsize,jsubmatsize;
for (imatsize=0;imatsize<GLCMheight;imatsize++)
{
for (jmatsize=0;jmatsize<GLCMheight;jmatsize++)
{
for (isubmatsize=0;isubmatsize<nsubmatsize;isubmatsize++)
{
for (jsubmatsize=0;jsubmatsize<nsubmatsize;jsubmatsize++)
{
GLCMdata[imatsize][jmatsize] += glcm8U[imatsize*nsubmatsize+isubmatsize][jmatsize*nsubmatsize+jsubmatsize];
}
}
}
}
//计算部分特征值
GLCMenergy = 0, GLCMcontrast = 0, GLCMmaxprobability = 0;
GLCMentropy = 0 , GLCMIDM = 0;
GLCMstdeviation = 0, GLCMcorrelation = 0;//未计算该值
for (imatsize=0;imatsize<GLCMheight;imatsize++)
{
for (jmatsize=0;jmatsize<GLCMheight;jmatsize++)
{
if (GLCMdata[imatsize][jmatsize]>0)
{
GLCMenergy += GLCMdata[imatsize][jmatsize] * GLCMdata[imatsize][jmatsize];//能量
GLCMcontrast += (imatsize-jmatsize)*(imatsize-jmatsize)*GLCMdata[imatsize][jmatsize];//对⽐度
GLCMmaxprobability = GLCMmaxprobability > GLCMdata[imatsize][jmatsize] ? GLCMmaxprobability : GLCMdata[imatsize][jmatsize];//最⼤概率    GLCMentropy += static_cast<double>(GLCMdata[imatsize][jmatsize]) * std::log(GLCMdata[imatsize][jmatsize]);
if (imatsize!=jmatsize)
{
GLCMIDM += static_cast<double>(GLCMdata[imatsize][jmatsize])/((imatsize-jmatsize)*(imatsize-jmatsize));文件传输协议
}
}
}
}
return 0;
}
int GLCM::initGLCM(int newgraydepth)
{//初始化灰度共⽣矩阵,若要输出8*8矩阵,newgraydepth输⼊3,16*16则newgraydepth为4
GLCMheight = std::pow(2,newgraydepth);
GLCMdata = new unsigned int*[GLCMheight];
for (int imat=0;imat<GLCMheight;imat++)
{
GLCMdata[imat] = new unsigned int[GLCMheight];
memset(GLCMdata[imat],0,GLCMheight*sizeof(unsigned int));
}
return 0;
}
int GLCM::releaseGLCM()
{
for (int imat=0;imat<GLCMheight;imat++)
for (int imat=0;imat<GLCMheight;imat++)
{
delete[] GLCMdata[imat];
}
delete[] GLCMdata;
return 0;
}
int GLCM::printGLCM()
{
for (int i=0;i<GLCMheight;i++)
{
for (int j=0;j<GLCMheight;j++)
{
cout<<GLCMdata[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
主函数testGLCM.cpp
#include <highgui.h>
#include "GLCM.h"分词系统
using namespace std;
using namespace cv;
int main()
{
IplImage* img = cvLoadImage("texture7.jpg",CV_LOAD_IMAGE_GRAYSCALE); GLCM glcm1;
GLCMdirEnum d = horizonal;
glcm1.calImageGLCM(d,1,3);
glcm1.printGLCM();
return 0;
}
5. 结果与分析
测试⽤图

本文发布于:2024-09-24 15:26:25,感谢您对本站的认可!

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

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

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