zoukankan      html  css  js  c++  java
  • 图像的熵、灰度平均值、灰度中值、方差

    //图像的熵=========================================================================================
            private void Menu_Entropy_Click(object sender, EventArgs e)
            {
                if (curBitmap != null)
                {
                    //计算熵
                    double entropy = GetEntropy(curBitmap, curBitmap.Width, curBitmap.Height);

                    MessageBox.Show("图像:"+curFileName +"nn"+"图像熵为  H = " + entropy);
                   
                }
            }

            //计算熵的函数-----------------------------------------------
            public double GetEntropy(Bitmap bmp, int w, int h)
            {
                int g;
                double H = 0.0;

                int[] pix = new int[256];
                Array.Clear(pix, 0, 256);

                //获取各灰度值的像素个数
                for (int i = 0; i < h; i++)
                {
                    for (int j = 0; j < w; j++)
                    {
                        Color c = bmp.GetPixel(j, i);
                        g = (int)(0.299*c.R + 0.587*c.B + 0.114*c.G);
                        pix[g]++;
                    }
                }

               

                //计算熵
                for (int i = 0; i < 256; i++)
                    if (pix[i] > 0)
                        H = H + pix[i] * Math.Log10(pix[i]);
                H = Math.Log10(w * h) / Math.Log10(2) - H / (w * h * Math.Log10(2));

                return H;

            }

    //灰度平均值=======================================================================================
            private void Menu_GrayAverage_Click(object sender, EventArgs e)
            {
                if (curBitmap != null)
                {
                    double aver = GetGrayAverage(curBitmap, curBitmap.Width, curBitmap.Height);

                    MessageBox.Show("图像:" + curFileName +"nn"+ "灰度平均值为  A = " + aver);
                }
            }

            //计算灰度平均值的函数---------------------------------------
            public double GetGrayAverage(Bitmap bmp, int w, int h)
            {
                double sum = 0;

                //计算平均值
                for (int i = 0; i < w; i++)
                    for (int j = 0; j < h; j++)
                    {
                        Color c = bmp.GetPixel(i, j);
                        sum = sum + (int)(0.299 * c.R + 0.587 * c.B + 0.114 * c.G);
                    }
                double aver = sum / (w * h);

                return aver;
            }

    //灰度中值=========================================================================================
            private void Menu_GrayMid_Click(object sender, EventArgs e)
            {
                if (curBitmap != null)
                {
                    Bitmap bmp = curBitmap;

                    //由5 X 5的矩形获取值
                    int[] pix = new int[25];
                    for (int j = 0; j < 5; j++)
                    {
                        for (int i = 0; i < 5; i++)
                        {
                            pix[i + j * 5] = bmp.GetPixel(100 + i, 100 + j).B;
                        }
                    }
                    pix = MedianSorter(pix,25);

                    MessageBox.Show("图像:" + curFileName + "n" +
                        "左上角坐标为(100,100)的5X5矩形块n灰度中值为" +
                        "  M = " + pix[12]);
                }
            }

            //排序-------------------------------------------------------
            public int[] MedianSorter(int[] data, int m)
            {
                int tem;

                for (int i = m - 1; i >= 1; i--)
                    for (int j = 1; j <= i; j++)
                        if (data[j - 1] > data[j])
                        {
                            tem = data[j];
                            data[j] = data[j - 1];
                            data[j - 1] = tem;
                        }

                return data;
            }

    //方差=============================================================================================
            private void Menu_Variance_Click(object sender, EventArgs e)
            {
                if (curBitmap != null)
                {
                    double vari = GetVariance(curBitmap, curBitmap.Width, curBitmap.Height);

                    MessageBox.Show("图像:" + curFileName + "nn" + "方差值  S = " + vari);
                }
            }

            //计算方差值的函数-------------------------------------------
            public double GetVariance(Bitmap bmp, int w, int h)
            {
                double aver, vari =0;
                int data;

                //求平均值
                aver = GetGrayAverage(bmp ,w , h);

                //求方差
                for (int i = 0; i < w; i++)
                {
                    for (int j = 0; j < h; j++)
                    {
                        Color c = bmp.GetPixel(i, j);
                        data = (int)(0.299 * c.R + 0.587 * c.B + 0.114 * c.G);
                        vari = vari + (data - aver) * (data - aver);
                    }
                }
                vari = vari / (w * h);

                return vari;
            }

    连接:http://blog.sina.com.cn/s/blog_5edfc90301012nbz.html

  • 相关阅读:
    阐述:SIP协议是什么
    【SIP协议】学习初学笔记
    【协议学习】SIP基本场景分析
    电话的前世今生
    深入浅出SIP协议
    QVariant类及QVariant与自定义数据类型转换的方法
    Qt中如何根据类名来实例化对象
    模板的全特化与偏特化
    为什么c++中,有时可以用类名直接访问非静态成员函数?
    C++引用详解
  • 原文地址:https://www.cnblogs.com/pengkunfan/p/3444580.html
Copyright © 2011-2022 走看看