灰度共生矩阵GLCM的计算

首先贴一个链接:http://www.fxyqpx.org/ZGGX/html/gx20150311.htm#zz
各种概念性的东西论文里都有了,但是我在网上查找C#代码的时候,老是找不全,要么就是有些博客写的有问题。

这是计算图像各个特征参数的函数:


        /// <summary>
        /// 
        /// </summary>
        /// <param name="bmp">传入一张图片</param>
        /// <param name="radius">需要计算的区域的半径</param>
        /// <param name="cenX">圆心横坐标</param>
        /// <param name="cenY">圆心纵坐标</param>
        /// <param name="JJ">能量</param>
        /// <param name="HH"></param>
        /// <param name="GG">对比度</param>
        /// <param name="QQ">同质性</param>
        /// <param name="CC">相关性</param>
         public void getEntropy(Bitmap bmp, int radius, int cenX, int cenY, out double[] JJ, out double[] HH, out double[] GG, out double[] QQ, out double[] CC
         {
            double[, ,] p = getP(bmp, radius, cenX, cenY);//得到共生矩阵

            double J = 0;//能量,J值越大,纹理越粗,反之越细
            double H = 0;//熵,H值越大,纹理较多
            double G = 0;//对比度,G值越大,纹理越清晰
            double Q = 0;//同质性,Q值越大,图像纹理不同区域间变化小,局部非常均匀
            JJ = new double[3];
            HH = new double[3];
            GG = new double[3];
            QQ = new double[3];
            CC = new double[3];//相关性
            double[] ui = new double[3];
            double[] uj = new double[3];
            double[] si = new double[3];
            double[] sj = new double[3];
            for (int i = 0; i < 3; i++)
            {
                ui[i] = 0;
                uj[i] = 0;
                si[i] = 0;
                sj[i] = 0;
                CC[i] = 0;
            }
            for (int n = 0; n < 3; n++)
            {
                for (int ii = 0; ii < 16; ii++)
                    for (int jj = 0; jj < 16; jj++)
                    {
                        if (p[ii, jj, n] != 0)
                        {
                            J += p[ii, jj, n] * p[ii, jj, n];
                            H -= p[ii, jj, n] * Math.Log(p[ii, jj, n]);
                            G += (ii - jj) * (ii - jj) * p[ii, jj, n];
                            Q += p[ii, jj, n] / (1 + (ii - jj) * (ii - jj));
                        }
                        ui[n] = ii * p[ii, jj, n] + ui[n];
                        uj[n] = jj * p[ii, jj, n] + uj[n];
                    }
                JJ[n] = J;
                HH[n] = H;
                GG[n] = G;
                QQ[n] = Q;
            }
            for (int n = 0; n < 3; n++)
            {
                for (int ii = 0; ii < 16; ii++)
                    for (int jj = 0; jj < 16; jj++)
                    {
                        si[n] = (ii - ui[n]) * (ii - ui[n]) * p[ii, jj, n] + si[n];
                        sj[n] = (jj - uj[n]) * (ii - uj[n]) * p[ii, jj, n] + sj[n];
                        CC[n] = ii * jj * p[ii, jj, n] + CC[n];
                    }
                CC[n] = (CC[n] - ui[n] * uj[n]) / (si[n] * sj[n]);
            }
        }

下面是计算灰度共生矩阵的代码

        public double[,,] getP(Bitmap bmp, int radius, int cenX, int cenY)//计算共生矩阵,灰度级弄成16
        {
            int[,] g = new int[2*radius,2*radius];
            //转换灰度级
            for(int w=cenX-radius;w<cenX+radius;w++)
                for (int h = cenY - radius; h < cenY + radius; h++)
                {
                    int Gray = (30 * bmp.GetPixel(w, h).R + 59 * bmp.GetPixel(w, h).G + 11 * bmp.GetPixel(w, h).B)/100;//计算灰度值
                    g[w - cenX + radius, h - cenY + radius] = Gray / 16;
                }
            double[, ,] p = new double[16, 16, 3];//三个方向的,向右一步,向下一步,向右下一步
            for (int n = 0; n < 3; n++)//都转换成概率
                for (int i = 0; i < 16; i++)
                    for (int j = 0; j < 16; j++)
                    {
                        p[i, j, n] = 0;
                    }
            for (int m = 0; m < 16; m++)
                for (int n = 0; n < 16;n++ )
                    for (int w = 0; w < 2 * radius; w++)
                    {
                        for (int h = 0; h < 2 * radius; h++)
                        {
                            if (g[w, h] == m)
                            {
                                if (h < 2 * radius - 1)
                                    if (g[w, h + 1] == n)
                                        p[m, n, 0] = p[m, n, 0] + 1;
                                if (h < 2 * radius - 1 && w < 2 * radius - 1)
                                    if (g[w + 1, h + 1] == n)
                                        p[m, n, 1] = p[m, n, 1] + 1;
                                if (w < 2 * radius - 1)
                                    if (g[w + 1, h] == n)
                                        p[m, n, 2] = p[m, n, 2] + 1;

                            }
                        }

                    }

            for (int n = 0; n < 3; n++)//都转换成概率
            {
                double sum = 0;
                for (int i = 0; i < 16; i++)
                    for (int j = 0; j < 16; j++)
                    {
                        if (p[i, j, n] != 0)
                            sum += p[i, j, n];
                    }
                for (int i = 0; i < 16; i++)
                    for (int j = 0; j < 16; j++)
                    {
                        if (p[i, j, n] != 0)
                            p[i, j, n]=p[i,j,n]/sum;
                    }
            }
            return p;
        }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值