注:理论部分从百度百科复制。若引用理论部分,请标明出自百度百科。
概念
由于纹理是由灰度分布在空间位置上反复出现而形成的,因而在图像空间中相隔某距离的两象素之间会存在一定的灰度关系,即图像中灰度的空间相关特性。灰度共生矩阵就是一种通过研究灰度的空间相关特性来描述纹理的常用方法。
灰度共生矩阵的生成

灰度共生矩阵的特征
G
表示灰度共生矩阵常用的特征有
ASM 能量(angular second moment)
G中的值分布较均匀(如噪声严重的图像),则ASM有较小的值。
对比度(contrast)
如果偏离对角线的元素有较大值,即图像亮度值变化很快,则CON会有较大取值,这也符合对比度的定义。其中 。反映了图像的清晰度和纹理沟纹深浅的程度。纹理沟纹越深,其对比度越大,视觉效果越清晰;反之,对比度小,则沟纹浅,效果模糊。灰度差即对比度大的象素对越多,这个值越大。灰度公生矩阵中远离对角线的元素值越大,CON越大。
IDM(inverse different moment)

熵(entropy)
若灰度共生矩阵值分布均匀,也即图像近于随机或噪声很大,熵会有较大值。
自相关(correlation)
其中
自相关反应了图像纹理的一致性。如果图像中有水平方向纹理,则水平方向矩阵的COR大于其余矩阵的COR值。它度量空间灰度共生矩阵元素在行或列方向上的相似程度,因此,相关值大小反映了图像中局部灰度相关性。当矩阵元素值均匀相等时,相关值就大;相反,如果矩阵像元值相差很大则相关值小。
代码实现
以下提取共生矩阵特征的C++代码,需要opencv才可以运行。
#define GLCM_DIS 1 //灰度共生矩阵的统计距离 #define GLCM_CLASS 64 //计算灰度共生矩阵的图像灰度值等级化 #define GLCM_ANGLE_HORIZATION 0 //水平 #define GLCM_ANGLE_VERTICAL 1 //垂直 #define GLCM_ANGLE_DIGONAL_45 2 //对角 #define GLCM_ANGLE_DIGONAL_135 3//对角 #include#include static int calGLCM(IplImage* bWavelet,int angleDirection,std::vector &featureVector) { int i,j; int width,height; if(NULL == bWavelet) return 1; width = bWavelet->width; height = bWavelet->height; float * glcm = new float[GLCM_CLASS * GLCM_CLASS]; int * histImage = new int[width * height]; int normalized_factor=0; if(NULL == glcm || NULL == histImage) return 2; //灰度等级化---分GLCM_CLASS个等级 uchar *data =(uchar*) bWavelet->imageData; for(i = 0;i < height;i++){ for(j = 0;j < width;j++){ histImage[i * width + j] = (int)(data[bWavelet->widthStep * i + j] * GLCM_CLASS / 256); } } //初始化共生矩阵 for (i = 0;i < GLCM_CLASS;i++) for (j = 0;j < GLCM_CLASS;j++) glcm[i * GLCM_CLASS + j] = 0; //计算灰度共生矩阵 int k,l;//(l,k)是点对 //水平方向 if(angleDirection == GLCM_ANGLE_HORIZATION) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { if(j + GLCM_DIS < width) { l = histImage[i * width + j];//当前象元 k = histImage[i * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; ++normalized_factor; } } } } //垂直方向 else if(angleDirection == GLCM_ANGLE_VERTICAL) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { if(i + GLCM_DIS < height) { l = histImage[i * width + j]; k = histImage[(i + GLCM_DIS) * width + j]; glcm[l * GLCM_CLASS + k]++; ++normalized_factor; } } } } //45度对角方向 else if(angleDirection == GLCM_ANGLE_DIGONAL_45) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { if(j - GLCM_DIS >= 0 && i + GLCM_DIS < height) { l = histImage[i * width + j]; k = histImage[(i + GLCM_DIS) * width + j - GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; ++normalized_factor; } } } } //135度对角方向 else if(angleDirection == GLCM_ANGLE_DIGONAL_135) { for (i = 0;i < height;i++) { for (j = 0;j < width;j++) { if(j + GLCM_DIS < width && i + GLCM_DIS < height) { l = histImage[i * width + j]; k = histImage[(i + GLCM_DIS) * width + j + GLCM_DIS]; glcm[l * GLCM_CLASS + k]++; ++normalized_factor; } } } } for (i = 0;i < GLCM_CLASS;i++) for (j = 0;j < GLCM_CLASS;j++) glcm[i * GLCM_CLASS + j] = glcm[i * GLCM_CLASS + j]/normalized_factor; /计算特征值*/ float u_i=0,u_j=0,s_i_2=0,s_j_2=0; for (i = 0;i < GLCM_CLASS;i++) { for (j = 0;j < GLCM_CLASS;j++) { u_i+=i*glcm[i * GLCM_CLASS + j]; u_j+=j*glcm[i * GLCM_CLASS + j]; } } for (i = 0;i < GLCM_CLASS;i++) { for (j = 0;j < GLCM_CLASS;j++) { s_i_2+=(i-u_i)*(i-u_i)*glcm[i * GLCM_CLASS + j];//s_i的平方 s_j_2+=(j-u_j)*(j-u_j)*glcm[i * GLCM_CLASS + j]; } } float entropy = 0,energy = 0,contrast = 0,IDM = 0,correlation=0; for (i = 0;i < GLCM_CLASS;i++) { for (j = 0;j < GLCM_CLASS;j++) { //熵 if(glcm[i * GLCM_CLASS + j] > 0) entropy -= glcm[i * GLCM_CLASS + j] * log10(double(glcm[i * GLCM_CLASS + j])); //能量 energy += glcm[i * GLCM_CLASS + j] * glcm[i * GLCM_CLASS + j]; //对比度 contrast += (i - j) * (i - j) * glcm[i * GLCM_CLASS + j]; //一致性 IDM += 1.0 / (1 + (i - j) * (i - j)) * glcm[i * GLCM_CLASS + j]; //自相关性 correlation+=(i*j*glcm[i * GLCM_CLASS + j]-u_i*u_j)/(sqrt(s_i_2)*sqrt(s_j_2)+0.000001); } } //返回特征值 featureVector.push_back(entropy); featureVector.push_back(energy); featureVector.push_back(contrast); featureVector.push_back(IDM); featureVector.push_back(correlation); delete[] glcm; delete[] histImage; return 0; }
参考:
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230030.html原文链接:https://javaforall.net
