灰度共生矩阵(GLCMGray-LevelCo-occurrenceMatrix)_第1页
灰度共生矩阵(GLCMGray-LevelCo-occurrenceMatrix)_第2页
灰度共生矩阵(GLCMGray-LevelCo-occurrenceMatrix)_第3页
灰度共生矩阵(GLCMGray-LevelCo-occurrenceMatrix)_第4页
灰度共生矩阵(GLCMGray-LevelCo-occurrenceMatrix)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

灰度共⽣矩阵(GLCM,Gray-LevelCo-occurrenceMatrix)概念由于纹理是由灰度分布在空间位置上反复出现⽽形成的,因⽽在图像空间中相隔某距离的两像素之间会存在⼀定的灰度关系,即图度的空间相关特性。灰度共⽣矩阵就是⼀种通过研究灰度的空间相关特性来描述纹理的常⽤⽅法。灰度共⽣矩阵是涉及像素距离和⾓度的矩阵函数,它通过计算图像中⼀定距离和⼀定⽅向的两点灰度之间的相关性,来反映图像在⽅向、间隔、变化幅度及快慢上的综合信息。灰度直⽅图是对图像上单个像素具有某个灰度进⾏统计的结果,⽽灰度共⽣矩阵是对图像上保持某距离的两像素分别具有某灰度的状况进⾏统计得到的。GLCM所代表的含义灰度共⽣矩阵元素所表⽰的含义,以(1,1)点为例,GLCM(1,1)值为1说明左侧原图只有⼀对灰度为1的像素⽔平相邻。GLCM(1,2)值为2,是因为原图有两对灰度为1和2的像素⽔平相邻。共⽣矩阵计算纹理特征能量(Energy):是灰度共⽣矩阵各元素值的平⽅和,是对图像纹理的灰度变化稳定程度的度量,反应了图像灰度分布均匀程度和纹理粗细度。能量值⼤表明当前纹理是⼀种规则变化较为稳定的纹理。熵(Entropy):是图像包含信息量的随机性度量。当共⽣矩阵中所有值均相等或者像素值表现出最⼤的随机性时,熵最⼤;因此熵值表明了图像灰度分布的复杂程度,熵值越⼤,图像越复杂。最⼤概率(Maximumprobability):表⽰图像中出现次数最多的纹理特征。对⽐度(Contrast):度量矩阵的值是如何分布和图像中局部变化的多少,反应了图像的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越⼤,效果清晰;反之,对⽐值⼩,则沟纹浅,效果模糊。对公式(6),典型的有κ=2,λ=1。倒数差分矩(Inversedifferencemoment):反映图像纹理的同质性,度量图像纹理局部变化的多少。其值⼤则说明图像纹理的不同区域间缺少变化,局部⾮常均匀。相关性(Correlation):⾃相关反应了图像纹理的⼀致性。如果图像中有⽔平⽅向纹理,则⽔平⽅向共⽣矩阵Correlation值⼤于其余⽅向共⽣矩阵Correlation的值。它度量空间灰度共⽣矩阵元素在⾏或列⽅向上的相似程度,因此,相关值⼤⼩反映了图像中局部灰度相关性。当矩阵元素值均匀相等时,相关值就⼤;相反,如果矩阵像元值相差很⼤则相关值⼩。其中μx,μy为均值,σx,σy为标准差,计算公式如下4.算法实现#pragmaonce#include<iostream>#include<cassert>#include<vector>#include<iterator>#include<functional>#include<algorithm>#include<opencv2/opencv.hpp>usingnamespacestd;usingnamespacecv;typedefvector<vector<int>>VecGLCM;typedefstruct_GLCMFeatures{_GLCMFeatures():energy(0.0),entropy(0.0),contrast(0.0),idMoment(0.0){}doubleenergy;//能量doubleentropy;//熵doublecontrast;//对⽐度doubleidMoment;//逆差分矩,inversedifferencemoment}GLCMFeatures;classGLCM{public:GLCM();~GLCM();public://枚举灰度共⽣矩阵的⽅向enum{GLCM_HORIZATION=0,//⽔平//垂直GLCM_VERTICAL=1,GLCM_ANGLE45=2,GLCM_ANGLE135=3//45度⾓//135度⾓};public://计算灰度共⽣矩阵//voidcalGLCM(IplImage*inputImg,VecGLCM&vecGLCM,intangle);voidcalGLCM(cv::Mat&inputImg,VecGLCM&vecGLCM,intangle);//计算特征值voidgetGLCMFeatures(VecGLCM&vecGLCM,GLCMFeatures&features);public://初始化灰度共⽣矩阵voidinitGLCM(VecGLCM&vecGLCM,intsize=16);//设置灰度划分等级,默认值为16voidsetGrayLevel(intgrayLevel){m_grayLevel=grayLevel;}//获取灰度等级intgetGrayLevel()const{returnm_grayLevel;}private://计算⽔平灰度共⽣矩阵voidgetHorisonGLCM(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight);//计算垂直灰度共⽣矩阵voidgetVertialGLCM(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight);//计算45度灰度共⽣矩阵voidgetGLCM45(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight);//计算135度灰度共⽣矩阵voidgetGLCM135(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight);private:intm_grayLevel;//将灰度共⽣矩阵划分为grayLevel个等级};12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576#include"GLCM.h"GLCM::GLCM():m_grayLevel(16){}GLCM::~GLCM(){}//==============================================================================//函数名称:initGLCM//参数说明:vecGLCM,要进⾏初始化的共⽣矩阵,为⼆维⽅阵//size,⼆维矩阵的⼤⼩,必须与图像划分的灰度等级相等//函数功能:初始化⼆维矩阵//==============================================================================voidGLCM::initGLCM(VecGLCM&vecGLCM,intsize){assert(size==m_grayLevel);vecGLCM.resize(size);for(inti=0;i<size;++i){vecGLCM[i].resize(size);}for(inti=0;i<size;++i){for(intj=0;j<size;++j){vecGLCM[i][j]=0;}}}//==============================================================================//函数名称:getHorisonGLCM//参数说明:src,要进⾏处理的矩阵,源数据//////dst,输出矩阵,计算后的矩阵,即要求的灰度共⽣矩阵imgWidth,图像宽度imgHeight,图像⾼度//函数功能:计算⽔平⽅向的灰度共⽣矩阵//==============================================================================voidGLCM::getHorisonGLCM(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight){intheight=imgHeight;intwidth=imgWidth;for(inti=0;i<height;++i){for(intj=0;j<width-1;++j){introws=src[i][j];intcols=src[i][j+1];dst[rows][cols]++;}}}//==============================================================================//函数名称:getVertialGLCM//参数说明:src,要进⾏处理的矩阵,源数据//参数说明:src,要进⾏处理的矩阵,源数据//////dst,输出矩阵,计算后的矩阵,即要求的灰度共⽣矩阵imgWidth,图像宽度imgHeight,图像⾼度//函数功能:计算垂直⽅向的灰度共⽣矩阵//==============================================================================voidGLCM::getVertialGLCM(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight){intheight=imgHeight;intwidth=imgWidth;for(inti=0;i<height-1;++i){for(intj=0;j<width;++j){introws=src[i][j];intcols=src[i+1][j];dst[rows][cols]++;}}}//==============================================================================//函数名称:getGLCM45//参数说明:src,要进⾏处理的矩阵,源数据//////dst,输出矩阵,计算后的矩阵,即要求的灰度共⽣矩阵imgWidth,图像宽度imgHeight,图像⾼度//函数功能:计算45度的灰度共⽣矩阵//==============================================================================voidGLCM::getGLCM45(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight){intheight=imgHeight;intwidth=imgWidth;for(inti=0;i<height-1;++i){for(intj=0;j<width-1;++j){introws=src[i][j];intcols=src[i+1][j+1];dst[rows][cols]++;}}}//==============================================================================//函数名称:getGLCM135//参数说明:src,要进⾏处理的矩阵,源数据//////dst,输出矩阵,计算后的矩阵,即要求的灰度共⽣矩阵imgWidth,图像宽度imgHeight,图像⾼度//函数功能:计算135度的灰度共⽣矩阵//==============================================================================voidGLCM::getGLCM135(VecGLCM&src,VecGLCM&dst,intimgWidth,intimgHeight){intheight=imgHeight;intwidth=imgWidth;for(inti=0;i<height-1;++i){for(intj=1;j<width;++j){introws=src[i][j];intcols=src[i+1][j-1];intcols=src[i+1][j-1];dst[rows][cols]++;}}}//==============================================================================//函数名称:calGLCM//参数说明:inputImg,要进⾏纹理特征计算的图像,为灰度图像////vecGLCM,输出矩阵,根据灰度图像计算出的灰度共⽣阵angle,灰度共⽣矩阵的⽅向,有⽔平、垂直、45度、135度四个⽅向//函数功能:计算灰度共⽣矩阵//==============================================================================//voidGLCM::calGLCM(IplImage*inputImg,VecGLCM&vecGLCM,intangle)//{//assert(inputImg->nChannels==1);//IplImage*src=NULL;//src=cvCreateImage(cvGetSize(inputImg),IPL_DEPTH_32S,inputImg->nChannels);//cvConvert(inputImg,src);////intheight=src->height;//intwidth=src->width;//intmaxGrayLevel=0;////寻找最⼤像素灰度最⼤值//for(inti=0;i<height;++i)//{//////////////////for(intj=0;j<width;++j){intgrayVal=cvGetReal2D(src,i,j);if(grayVal>maxGrayLevel){maxGrayLevel=grayVal;}}//}//endfori////++maxGrayLevel;//VecGLCMtempVec;////初始化动态数组//tempVec.resize(height);//for(inti=0;i<height;++i)//{//tempVec[i].resize(width);//}////if(maxGrayLevel>16)//若灰度级数⼤于16,则将图像的灰度级缩⼩⾄16级,减⼩灰度共⽣矩阵的⼤⼩。//{//////////////////////////////////for(inti=0;i<height;++i){for(intj=0;j<width;++j){inttmpVal=cvGetReal2D(src,i,j);tmpVal/=m_grayLevel;tempVec[i][j]=tmpVal;}}if(angle==GLCM_HORIZATION)//⽔平⽅向getHorisonGLCM(tempVec,vecGLCM,width,height);if(angle==GLCM_VERTICAL)//垂直⽅向getVertialGLCM(tempVec,vecGLCM,width,height);if(angle==GLCM_ANGLE45)//45度灰度共⽣阵getGLCM45(tempVec,vecGLCM,width,height);if(angle==GLCM_ANGLE135)//135度灰度共⽣阵//if(angle==GLCM_ANGLE135)//135度灰度共⽣阵//getGLCM135(tempVec,vecGLCM,width,height);//}//else//若灰度级数⼩于16,则⽣成相应的灰度共⽣矩阵//{//for(inti=0;i<height;++i)//{//for(intj=1;j<width;++j)//{//inttmpVal=cvGetReal2D(src,i,j);//tempVec[i][j]=tmpVal;//}}//////if(angle==GLCM_HORIZATION)//⽔平⽅向getHorisonGLCM(tempVec,vecGLCM,width,height);if(angle==GLCM_VERTICAL)//垂直⽅向//////getVertialGLCM(tempVec,vecGLCM,width,height);if(angle==GLCM_ANGLE45)//45度灰度共⽣阵getGLCM45(tempVec,vecGLCM,width,height);if(angle==GLCM_ANGLE135)//135度灰度共⽣阵getGLCM135(tempVec,vecGLCM,width,height);//////////}////cvReleaseImage(&src);//}voidGLCM::calGLCM(cv::Mat&inputImg,VecGLCM&vecGLCM,intangle){assert(inputImg.channels()==1);intheight=inputImg.rows;intwidth=inputImg.cols;intmaxGrayLevel=0;//寻找最⼤像素灰度最⼤值for(inti=0;i<height;++i){for(intj=0;j<width;++j){intgrayVal=inputImg.at<uchar>(i,j);if(grayVal>maxGrayLevel){maxGrayLevel=grayVal;}}}++maxGrayLevel;VecGLCMtempVec;tempVec.resize(height);for(inti=0;i<height;++i){tempVec[i].resize(width);}if(maxGrayLevel>16){for(inti=0;i<height;++i){for(intj=0;j<width;++j){inttmpVal=inputImg.at<uchar>(i,j);tmpVal/=m_grayLevel;tempVec[i][j]=tmpVal;}}if(angle==GLCM_HORIZATION){getHorisonGLCM(tempVec,vecGLCM,width,height);}elseif(angle==GLCM_VERTICAL){getVertialGLCM(tempVec,vecGLCM,width,height);}elseif(angle==GLCM_ANGLE45){getGLCM45(tempVec,vecGLCM,width,height);}elseif(angle==GLCM_ANGLE135){getGLCM135(tempVec,vecGLCM,width,height);}}else{for(inti=0;i<height;++i){for(intj=0;j<width;++j){inttmpVal=inputImg.at<uchar>(i,j);tempVec[i][j]=tmpVal;}}if(angle==GLCM_HORIZATION){getHorisonGLCM(tempVec,vecGLCM,width,height);}elseif(angle==GLCM_VERTICAL){getVertialGLCM(tempVec,vecGLCM,width,height);}elseif(angle==GLCM_ANGLE45){getGLCM45(tempVec,vecGLCM,width,height);}elseif(angle==GLCM_ANGLE135){getGLCM135(tempVec,vecGLCM,width,height);}}}//==============================================================================//函数名称:getGLCMFeatures//参数说明:vecGLCM,输⼊矩阵,灰度共⽣阵//features,灰度共⽣矩阵计算的特征值,主要包含了能量、熵、对⽐度、逆差分矩//函数功能:根据灰度共⽣矩阵计算的特征值//==============================================================================voidGLCM::getGLCMFeatures(VecGLCM&vecGLCM,GLCMFeatures&features){inttotal=0;for(inti=0;i<m_grayLevel;++i){for(intj=0;j<m_grayLevel;++j){total+=vecGLCM[i][j];//求所有图像的灰度值的和}}vector<vector<double>>temp;temp.resize(m_grayLevel);for(inti=0;i<m_grayLevel;++i){temp[i].resize(m_grayLevel);}//归⼀化for(inti=0;i<m_grayLevel;++i){for(intj=0;j<m_grayLevel;++j){temp[i][j]=(double)vecGLCM[i][j]/(double)total;}}for(inti=0;i<m_grayLevel;++i){for(intj=0;j<m_grayLevel;++j){features.energy+=temp[i][j]*temp[i][j];if(temp[i][j]>0)features.entropy-=temp[i][j]*log(temp[i][j]);//熵features.contrast+=(double)(i-j)*(double)(i-j)*temp[i][j];//对⽐度features.idMoment+=temp[i][j]/(1+(double)(i-j)*(double)(i-j));//逆差矩}}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485

8687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142

143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199

20

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论