直方圖均衡化

直方圖均衡化的作用是圖像增強。

有兩個問題比較難懂,一是爲什麼要選用累積分佈函數,二是爲什麼使用累積分佈函數處理後像素值會均勻分佈。

第一個問題。均衡化過程中,必須要保證兩個條件:①像素無論怎麼映射,一定要保證原來的大小關係不變,較亮的區域,依舊是較亮的,較暗依舊暗,只是對比度增大,絕對不能明暗顛倒;②如果是八位圖像,那麼像素映射函數的值域應在0和255之間的,不能越界。綜合以上兩個條件,累積分佈函數是個好的選擇,因爲累積分佈函數是單調增函數(控制大小關係),並且值域是0到1(控制越界問題),所以直方圖均衡化中使用的是累積分佈函數。

第二個問題。累積分佈函數具有一些好的性質,那麼如何運用累積分佈函數使得直方圖均衡化?比較概率分佈函數和累積分佈函數,前者的二維圖像是參差不齊的,後者是單調遞增的。直方圖均衡化過程中,映射方法是

其中,n是圖像中像素的總和,是當前灰度級的像素個數,L是圖像中可能的灰度級總數。

來看看通過上述公式怎樣實現的拉伸。假設有如下圖像:


得圖像的統計信息如下圖所示,並根據統計信息完成灰度值映射:


映射後的圖像如下所示:

以上就是直方圖映射均衡化的步驟,當然還有一些基於此的更優算法,比如Photoshop中的方法,在此就不一一列舉了,大同小異。

參考:

http://blog.csdn.net/zrongh/article/details/7302816               直方圖均衡化原理

http://bbs.ednchina.com/BLOG_ARTICLE_219471.HTM     直方圖均衡化


項目中遇到要直方圖均衡化,在網上找到如下介紹:

直方圖均衡化算法分爲三個步驟,第一步是統計直方圖每個灰度級出現的次數,第二步是累計歸一化的直方圖,第三步是計算新的像素值。

第一步:

    for(i=0;i<height;i++){
       for(j=0;j<width;j++){
          n[s[i][j]]++;
       }
    }

    for(i=0;i<L;i++){

        p[i]=n[i]/(width*height);

    }

    這裏,n[i]表示的是灰度級爲i的像素的個數,L表示的是最大灰度級,width和height分別表示的是原始圖像的寬度和高度,所以,p[i]表示的就是灰度級爲i的像素在整幅圖像中出現的概率(其實就是p[]這個數組存儲的就是這幅圖像的歸一化之後的直方圖)。

第二步:

    for(i=0;i<=L;i++){
       for(j=0;j<=i;j++){
          c[i]+=p[j];
       }
    }

    c[]這個數組存儲的就是累計的歸一化直方圖。

第三步:

    max=min=s[0][0];
    for(i=0;i<height;i++){
       for(j=0;j<width;j++){
           if(max<s[i][j]){

               max=s[i][j];

           }else if(min>s[i][j]){

               min=s[i][j];

           }
       }
    }

    找出像素的最大值和最小值。

    for(i=0;i<height;i++){
       for(j=0;j<width;j++){
          t[i][j]=c[s[i][j]]*(max-min)+min;
      }
    }

    t[][]就是最終直方圖均衡化之後的結果。

    處理前的圖片:

   直方圖均衡化之前

    處理後的圖片:

   處理後的圖片

   對於彩色的圖片來說,直方圖均衡化一般不能直接對R、G、B三個分量分別進行上述的操作,而要將RGB轉換成HSV來對V分量進行直方圖均衡化的操作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章