| 查看: 787 | 回复: 2 | ||
[求助]
灰度梯度共生矩阵VC代码!已有1人参与
|

justmc
木虫 (小有名气)
- 应助: 7 (幼儿园)
- 金币: 4376.4
- 红花: 8
- 帖子: 168
- 在线: 140小时
- 虫号: 2056856
- 注册: 2012-10-12
- 性别: GG
- 专业: 信息处理方法与技术
2楼2014-04-03 19:18:20
justmc
木虫 (小有名气)
- 应助: 7 (幼儿园)
- 金币: 4376.4
- 红花: 8
- 帖子: 168
- 在线: 140小时
- 虫号: 2056856
- 注册: 2012-10-12
- 性别: GG
- 专业: 信息处理方法与技术
【答案】应助回帖
|
这是普通的灰度共生矩阵代码,也是参考网上的,楼主看看有没有帮助。 // 求均值 double GetMean(double m[4]) { double nmean=0,sum=0; sum = m[0]+m[1]+m[2]+m[3]; nmean = sum/4; return nmean; } // 求方差 double GetSdDe(double m[4],double nmean) { int i; double stde,sum=0; for (i=0;i<4;i++) { sum+=((m-nmean)*(m-nmean)); } sum/=4; stde=sqrt(sum); return stde; } // 计算灰度共生矩阵 void GetGLCM(Mat mat_double, double glcm[8]) { double minvalue=0.0,maxvalue=0.0; int nW,nH; int j,i,n,m,dim; nW = mat_double.cols; nH = mat_double.rows; // 将图像量化至0-255 Mat mat_uchar = Mat(nW,nH,CV_8UC1); minMaxLoc(mat_double, &minvalue, &maxvalue); mat_double.convertTo(mat_uchar, CV_8UC1, 255/(maxvalue-minvalue), -minvalue); // 为了减少计算量,将原始图像0-255量化成16级,(0,15)为1,(16,31)为2 for(i=0;i<nH;i++) for(j=0;j<nW;j++) for(n=0;n<16;n++) { uchar temp = mat_uchar.at<uchar>(i,j); if((n*16<=temp)&&(temp<=n*16+15)) mat_uchar.at<uchar>(i,j) = n; } // 计算四个共生矩阵P,取距离为1,角度分别为 0,45,90,135 Mat mat_co[4]; for (dim=0;dim<4;dim++) { mat_co[dim] = Mat::zeros(16,16,CV_64FC1); } int delta[4][2] = {{0,1}, {-1,1}, {1,0}, {1,1}}; int p = 0; int x, y; for (int i = 0; i < nH; i++) { for (int j = 0; j < nW; j++) { x = mat_uchar.at<uchar>(i,j); for (p = 0; p < 4; p++) { if (j + delta[p][0] < nW && j + delta[p][0] >= 0 && i + delta[p][1] < nH && i + delta[p][1] >= 0) { y = mat_uchar.at<uchar>(i+delta[p][1],j+delta[p][0]); mat_co[p].at<double>(x,y) += 1.0; mat_co[p].at<double>(y,x) += 1.0; } } } } // 归一化共生矩阵 Mat temp_mat = Mat(16,16,CV_64FC1); for (dim=0; dim<4; dim++) { Scalar sum_value = sum(mat_co[dim]); temp_mat.setTo(sum_value); divide(mat_co[dim],temp_mat,mat_co[dim]); } // 对共生矩阵计算能量、熵、惯性矩、相关4个纹理参数 double energy[4]={0}; //能量 double entropy[4]={0}; //熵 double inertia[4]={0}; //惯性矩 double uX[4]={0};/*相关性中μx*/ double uY[4]={0};/*相关性中μy*/ double deltaX[4]={0};/*相关性中σx*/ double deltaY[4]={0};/*相关性中σy*/ double corelation[4]={0}; //相关性 Scalar temp_energy[4]; //能量 Mat mat_energy[4]; for (dim=0; dim<4; dim++) { mat_energy[dim] = Mat(16,16,CV_64FC1); multiply(mat_co[dim], mat_co[dim], mat_energy[dim]); temp_energy[dim] = sum(mat_energy[dim]); //求能量 energy[dim] = temp_energy[dim].val[0]; } for (dim=0; dim<4; dim++) { for (m=0;m<16;m++) { for(n=0;n<16;n++) { double temp = mat_co[dim].at<double>(m,n); if (temp!=0) { entropy[dim] = temp*log(temp)+entropy[dim]; //熵 } inertia[dim] = (m-n)*(m-n)*temp+inertia[dim]; //惯性矩 uX[dim] = n*temp+uX[dim]; //相关性中μx uY[dim] = n*temp+uY[dim]; //相关性中μy } } } for (dim=0;dim<4;dim++) { for (m=0;m<16;m++) { for (n=0;n<16;n++) { double temp = mat_co[dim].at<double>(m,n); deltaX[dim] = (m-uX[dim])*(m-uX[dim])*temp+deltaX[dim]; //相关性中σx deltaY[dim] = (n-uY[dim])*(n-uY[dim])*temp+deltaY[dim]; //相关性中σy corelation[dim] = m*n*temp+corelation[dim]; } } corelation[dim] = (corelation[dim]-uX[dim]*uY[dim])/deltaX[dim]/deltaY[dim]; //相关性 } // 求能量、熵、惯性矩、相关的均值和标准差作为最终8维纹理特征 glcm[0] = GetMean(energy); glcm[1] = GetSdDe(energy,glcm[0]); glcm[2] = GetMean(entropy); glcm[3] = GetSdDe(entropy,glcm[2]); glcm[4] = GetMean(inertia); glcm[5] = GetSdDe(inertia,glcm[4]); glcm[6] = GetMean(corelation); glcm[7] = GetSdDe(corelation,glcm[6]); } |
3楼2014-04-03 19:24:08













回复此楼