1. 程式人生 > >影象處理(Image Processing) ---------- 直方圖均衡化 (Equalization)(C#實現)

影象處理(Image Processing) ---------- 直方圖均衡化 (Equalization)(C#實現)

說到直方圖均衡化,首先提一提概率論的知識。

概率論:

  • 離散型隨機變數:能用日常使用的量詞度量的隨機變數。
    • 概率函式:形如  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