图像处理(Image Processing) ---------- 直方图均衡化 (Equalization)(C#实现)

版权声明:此为个人学习与研究成果,若需转载请提前告知。 https://blog.csdn.net/weixin_35811044/article/details/84565551

说到直方图均衡化,首先提一提概率论的知识。

概率论:

  • 离散型随机变量:能用日常使用的量词度量的随机变量。
    • 概率函数:形如  P(x = 1) = 1/6;
    • 概率分布:
      X_{i} x_{1} x_{2} x_{3} x_{4} x_{5} x_{6}
      P_{i} p_{1} p_{2 } p_{3} p_{4} p_{5} p_{6 }
    • 概率分布函数:F(x) = P(X\leq x) = \sum_{x_{k}\leqslant x} P_{k} .
  • 连续型随机变量:不能用日常量词度量,无限、无穷。
    • 概率密度函数:P(a< x\leqslant b) = \int_{b}^{a}f(x) dx = F(b)-F(a),面积即事件在此区间发生的概率。
    • \int_{-\infty }^{+\infty} f(x) dx =1 . 总面积为1, 因为总概率为1.
    • 分布函数的导数即概率密度函数。

Equalization:

希望将图像灰度分布均匀。

输入图像灰度级 r  ,输出图像灰度级S, 转换公式:

  • S = T(r) --->  每个Pixel经过 T(r)变换倒新Pixel灰度级。
  • 对T(r)两个要求:(a)在区间 [0,L-1] 上单增。(b)当0 \leqslant r \leqslant L-1 时, 0 \leqslant T(r) \leqslant L-1 。
  • 牛逼公式:S = T(r) = (L-1){\int_{0}^{r} P_{r}(x) dx . ,即原图的概率密度函数*原图pixel的深度。

为什么 r 的分布函数就是符合要求的转换函数?

r 的概率密度为P(r),则 s 的概率密度为 : P(s) = P(r)\frac{dr}{ds} .  又对公式:S = T(r) = (L-1){\int_{0}^{r} P_{r}(x) dx 对 r 求导。

\frac{ds}{dr} = (L-1)P(r) ,  \therefore  P(s) = L-1 . 即S的概率密度为定值,则S的分布函数就为一条斜率固定的直线。

  • S的概率密度为定值,则S的分布函数为一条斜率固定的直线,表明所有Pixel出现的概率都一样,所以累加概率会均匀上升。

  • 实际情况中,进过均衡化的图片不会真的均衡,只会近似均衡:

  •     实际的直方图均衡化,我们要将牛逼公式离散化即:S_{k} = T(r_{k}) = (L-1)\sum_{j=0}^{k}p_{j}(r_{k}) , 就是从0到要均衡化的灰度级的累积概率*深度。

C#实现:

//获得灰阶图片各灰度级的概率,返回数组。
public double[] getGrayHistogram(Bitmap grayImage)
        {
            double[] numb = new double[256];
            for (int i = 0; i < grayImage.Height; i++)
            {
                for (int j = 0; j < grayImage.Width; j++)
                {
                    Color pixelRGB = grayImage.GetPixel(j, i);
                    if (pixelRGB.R == pixelRGB.G && pixelRGB.R == pixelRGB.B)
                    {
                        int grayNumb = pixelRGB.R;
                        numb[grayNumb]++;
                    }
                }
            }
            for (int k = 0; k < 256; k++)
            {
                double value = numb[k];
                double rate = value / (grayImage.Height * grayImage.Width * 1.0);
                numb[k] = rate;
            }
            return numb;
        }
//灰阶直方图均衡化
//传入需均衡化的灰阶图片grayImage和灰阶图片各灰度级的概率数组。
        public Bitmap Equalization(Bitmap grayImage , double[] density)
        {
            for (int j = 0; j < grayImage.Height; j++)
            {
                for (int i = 0; i < grayImage.Width; i++)
                {
                    double densitySum = 0;
                    Color value = grayImage.GetPixel(i, j);
                    for (int k = 0; k <= value.R; k++)
                    {    //累积概率
                        densitySum += density[k];
                    }
                    byte s = (byte)Math.Round(255 * densitySum);
                    Color newValue = Color.FromArgb(s, s, s);
                    grayImage.SetPixel(i, j, newValue);
                }
            }
            return grayImage;
        }

仅为个人理解,如有不足,请指教。 https://blog.csdn.net/weixin_35811044

猜你喜欢

转载自blog.csdn.net/weixin_35811044/article/details/84565551