想象壹下,如果壹副圖像中的大多是像素點的像素值都集中在壹個像素值範圍之內會怎樣呢?例如,如果壹幅圖片整體很亮,那所有的像素值應該都會很高。但是壹副高質量的圖像的像素值分布應該很廣泛。所以妳應該把它的直方圖做壹個橫向拉伸(如下圖),這就是直方圖均衡化要做的事情。通常情況下,這種操作會改善圖像的對比度。
這種方法通常用來增加許多圖像的全局 對比度 ,尤其是當圖像的有用數據的對比度相當接近的時候。通過這種方法, 亮度 可以更好地在直方圖上分布。這樣就可以用於增強局部的對比度而不影響整體的對比度,直方圖均衡化通過有效地擴展常用的亮度來實現這種功能。
這種方法對於背景和前景都太亮或者太暗的圖像非常有用,這種方法尤其是可以帶來 X光 圖像中更好的 骨骼 結構顯示以及曝光過度或者曝光不足 照片 中更好的細節。這種方法的壹個主要優勢是它是壹個相當直觀的技術並且是 可逆 操作,如果已知均衡化 函數 ,那麽就可以恢復原始的直方圖,並且計算量也不大。這種方法的壹個缺點是它對處理的數據不加選擇,它可能會增加背景 噪聲 的對比度並且降低有用 信號 的對比度。
我們先來看看相應的直方圖和累積直方圖,然後使用 OpenCV 進行直方圖均衡化。
我們可以看出來直方圖大部分在灰度值較高的部分,而且分布很集中。而我們希望直方圖的分布比較分散,能夠涵蓋整個 x 軸。所以,我們就需要壹個變換函數幫助我們把現在的直方圖映射到壹個廣泛分布的直方圖中,這就是直方圖均衡化。
**限制對比度自適應性直方圖均衡化 CLAHE **
在上邊做的直方圖均衡化會改變整個圖像的對比度,但是在很多情況下,這樣做的效果並不好。的確在進行完直方圖均衡化之後,圖片背景的對比度被改變了。但是妳再對比壹下兩幅圖像中雕像的面圖,由於太亮我們丟失了很多信息。
原理:
為了解決這個問題,我們需要使用自適應的直方圖均衡化 CLAHE (Contrast Limited Adaptive Histogram Equalization)。這種情況下,整幅圖像會被分成很多小塊,這些小塊被稱為“tiles”(在 OpenCV 中 tileGridSize默認是 8x8),然後再對每壹個小塊分別進行直方圖均衡化(跟前面類似)。所以在每壹個的區域中,直方圖會集中在某壹個小的區域中(除非有噪聲幹擾)。如果有噪聲的話,噪聲會被放大。為了避免這種情況的出現,要使用對比度限制。
CLAHE中,每壹個像素鄰域都要進行對比度限制,從而得到對應的變換函數,被用來降低AHE中噪聲的增強,這主要是通過限制AHE中的對比度增強來實現的。像素周圍鄰域噪聲的增強主要是由變換函數的斜率造成的,由於像素鄰域的噪聲與鄰域的CDF成正比,因此也與鄰域直方圖在該中心像素位置的值成正比,CLAHE之所以能夠限制對比度,是因為它在計算鄰域的CDF之前在指定閾值處對直方圖進行了修剪,如下圖所示,這壹做法不僅限制了CDF的斜率,也限制了變換函數的斜率,其中對直方圖進行切割所使用的閾值,被稱作修剪限制度(clip limit),這個參數不僅依賴於直方圖的歸壹化,而且依賴於像素鄰域的size大小,通常設為3到4之間。
對於每個小塊來說,如果直方圖中的 bin 超過對比度的上限的話,就把其中的像素點均勻分散到其他 bins 中,然後在進行直方圖均衡化。最後,為了去除每壹個小塊之間“人造的”(由於算法造成)邊界,再使用雙線性差值,與原圖做圖層濾色混合操作(可選)。
實現:
參考文獻:
網址: 直方圖均衡化
Adaptive_histogram_equalization
書籍:《數字圖像處理》《OpenCV-Python 中文教程》