24小时热门版块排行榜    

查看: 883  |  回复: 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 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 时间戳又变了8-15 +6 archvillain 2026-08-15 10/500 2026-08-15 14:29 by 枫叶之巅
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +26 医学老男孩 2026-08-13 57/2850 2026-08-15 14:25 by JChen2024
[博后之家] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +3 k0dTPqJtl0jt 2026-08-14 3/150 2026-08-15 12:41 by KxMI1BYBxWX1
[考研] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +4 7lpolszZVXgi 2026-08-14 8/400 2026-08-15 11:53 by KxMI1BYBxWX1
[考博] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 HFw0lei2R37i 2026-08-14 5/250 2026-08-15 11:41 by KxMI1BYBxWX1
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +6 Ldrop2023 2026-08-13 6/300 2026-08-15 10:09 by tuanggou
[教师之家] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +5 7lpolszZVXgi 2026-08-14 6/300 2026-08-15 09:28 by sunzitan
[公派出国] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 k0dTPqJtl0jt 2026-08-14 5/250 2026-08-15 07:09 by 4wMiSEwB6436
[找工作] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +4 k0dTPqJtl0jt 2026-08-14 4/200 2026-08-15 02:21 by 4wMiSEwB6436
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 22/1100 2026-08-14 23:45 by Noways
[基金申请] 是这周出结果还是下周出结果? +4 yuleib84 2026-08-11 4/200 2026-08-14 23:05 by lfy8008
[硕博家园] 请教兼职经验 +3 是阿文鸭 2026-08-09 3/150 2026-08-14 12:07 by HER12025
[硕博家园] 读博的好处 +4 lnee 2026-08-11 4/200 2026-08-14 10:20 by ahsoarli
[基金申请] FileCode能看出啥? +10 要乐观耀哥 2026-08-10 32/1600 2026-08-14 09:37 by 要乐观耀哥
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +11 Tide man 2026-08-11 11/550 2026-08-13 07:35 by 撸猫猫
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
信息提示
请填处理意见