詳解OpenCV自適應直方圖均衡化的應用
介紹
在《直方圖均衡化詳解》中,我們已經(jīng)了解的直方圖均衡化的基本概念,并且可以使用 cv2.equalizeHist()
函數(shù)執(zhí)行直方圖均衡。
在本節(jié)中,將介紹如何應用對比度受限的自適應直方圖均衡化 ( Contrast Limited Adaptive Histogram Equalization
, CLAHE
) 來均衡圖像,CLAHE
是自適應直方圖均衡化( Adaptive Histogram Equalization
, AHE
)的一種變體,區(qū)別在于其對比度的增大是受限的。圖像相對均勻區(qū)域中的噪聲被 AHE
過度放大,而 CLAHE
通過限制對比度增大來解決這個問題。該算法通過創(chuàng)建原始圖像的多個直方圖,并使用這些直方圖來重新分配圖像的亮度,用于提高圖像的對比度。
主要代碼
接下來,將 CLAHE
應用于灰度和彩色圖像。應用 CLAHE
時,有兩個重要參數(shù),第一個是 clipLimit
,它設置對比度限制的閾值,默認值為 40;第二個是 tileGridSize
,它設置行和列中的 tiles
數(shù)量。應用 CLAHE
時,圖像被分成稱為 tiles
(默認為 8 x 8 )的小塊以執(zhí)行其計算。 將 CLAHE 應用于灰度圖像,需要使用以下代碼:
# 加載圖像 image = cv2.imread('example.png') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 灰度圖像應用 CLAHE clahe = cv2.createCLAHE(clipLimit=2.0) gray_image_clahe = clahe.apply(gray_image) # 使用不同 clipLimit 值 clahe.setClipLimit(5.0) gray_image_clahe_2 = clahe.apply(gray_image) clahe.setClipLimit(10.0) gray_image_clahe_3 = clahe.apply(gray_image) clahe.setClipLimit(20.0) gray_image_clahe_4 = clahe.apply(gray_image)
然后,我們將 CLAHE
應用于彩色圖像,類似于彩色圖像對比度均衡的方法,創(chuàng)建四個函數(shù)以僅在不同顏色空間的亮度通道上使用 CLAHE
來均衡化彩色圖像:
def equalize_clahe_color_hsv(img): cla = cv2.createCLAHE(clipLimit=4.0) H, S, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV)) eq_V = cla.apply(V) eq_image = cv2.cvtColor(cv2.merge([H, S, eq_V]), cv2.COLOR_HSV2BGR) return eq_image def equalize_clahe_color_lab(img): cla = cv2.createCLAHE(clipLimit=4.0) L, a, b = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2Lab)) eq_L = cla.apply(L) eq_image = cv2.cvtColor(cv2.merge([eq_L, a, b]), cv2.COLOR_Lab2BGR) return eq_image def equalize_clahe_color_yuv(img): cla = cv2.createCLAHE(clipLimit=4.0) Y, U, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2YUV)) eq_Y = cla.apply(Y) eq_image = cv2.cvtColor(cv2.merge([eq_Y, U, V]), cv2.COLOR_YUV2BGR) return eq_image def equalize_clahe_color(img): cla = cv2.createCLAHE(clipLimit=4.0) channels = cv2.split(img) eq_channels = [] for ch in channels: eq_channels.append(cla.apply(ch)) eq_image = cv2.merge(eq_channels) return eq_image # 彩色圖像應用 CLAHE image_clahe_color = equalize_clahe_color(image) image_clahe_color_lab = equalize_clahe_color_lab(image) image_clahe_color_hsv = equalize_clahe_color_hsv(image) image_clahe_color_yuv = equalize_clahe_color_yuv(image) # 可視化 show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "gray", 1) show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=2.0", 2) show_img_with_matplotlib(cv2.cvtColor(gray_image_clahe_2, cv2.COLOR_GRAY2BGR), "gray CLAHE clipLimit=5.0", 3) # 其他圖像的可視化方法類似,不再贅述 # ...
將所有這些函數(shù)應用于測試圖像后比較結果,如下圖所示:
在上圖中,我們可以看到改變 clipLimit
參數(shù)在測試圖像上應用 CLAHE 后的不同效果,同時也可以看到在不同顏色空間( LAB、HSV 和 YUV )的亮度通道上應用 CLAHE
后的不同結果。其中,可以看到在 BGR
圖像的三個通道上應用 CLAHE
與僅在不同顏色空間的亮度通道上使用 CLAHE
的不同效果。
比較 CLAHE 和直方圖均衡化
為了更好地展示 CLAHE
的效果,接下來對比 CLAHE
和直方圖均衡化 (cv2.equalizeHist()
) 在同一圖像上的效果,同時可視化生成的圖像和生成的直方圖。
image = cv2.imread('example.png') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256]) # 直方圖均衡化 gray_image_eq = cv2.equalizeHist(gray_image) # 計算直方圖 hist_eq = cv2.calcHist([gray_image_eq], [0], None, [256], [0, 256]) # 創(chuàng)建 clahe: clahe = cv2.createCLAHE(clipLimit=4.0) # 在灰度圖像上應用 clahe gray_image_clahe = clahe.apply(gray_image) # 計算直方圖 hist_clahe = cv2.calcHist([gray_image_clahe], [0], None, [256], [0, 256])
可視化的結果如下圖所示:
通過以上對比,可以肯定地說,在許多情況下,CLAHE
比應用直方圖均衡化有更好的結果和性能。
到此這篇關于詳解OpenCV自適應直方圖均衡化的應用的文章就介紹到這了,更多相關OpenCV自適應直方圖均衡化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pytorch?transforms圖像增強實現(xiàn)方法
這篇文章主要介紹了pytorch?transforms圖像增強的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04jupyter notebook 使用過程中python莫名崩潰的原因及解決方式
這篇文章主要介紹了jupyter notebook 使用過程中python莫名崩潰的原因及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Pytorch 解決自定義子Module .cuda() tensor失敗的問題
這篇文章主要介紹了Pytorch 解決自定義子Module .cuda() tensor失敗的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06PyQt5+python3+pycharm開發(fā)環(huán)境配置教程
這篇文章主要介紹了PyQt5+python3+pycharm開發(fā)環(huán)境配置教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03