24小时热门版块排行榜    

查看: 787  |  回复: 2

eeds136

金虫 (著名写手)

[求助] 灰度梯度共生矩阵VC代码!已有1人参与

回复此楼
一切都似那么神奇。。。。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

justmc

木虫 (小有名气)

不知楼主说的灰度-梯度共生矩阵是什么概念啊?如果是基本的灰度共生矩阵GLCM,我这儿倒有点儿C代码可以送你~
2楼2014-04-03 19:18:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

justmc

木虫 (小有名气)

【答案】应助回帖

这是普通的灰度共生矩阵代码,也是参考网上的,楼主看看有没有帮助。

// 求均值
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
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 eeds136 的主题更新
信息提示
请填处理意见