詳解OpenCV自適應(yīng)直方圖均衡化的應(yīng)用
介紹
在《直方圖均衡化詳解》中,我們已經(jīng)了解的直方圖均衡化的基本概念,并且可以使用 cv2.equalizeHist() 函數(shù)執(zhí)行直方圖均衡。
在本節(jié)中,將介紹如何應(yīng)用對(duì)比度受限的自適應(yīng)直方圖均衡化 ( Contrast Limited Adaptive Histogram Equalization, CLAHE ) 來(lái)均衡圖像,CLAHE 是自適應(yīng)直方圖均衡化( Adaptive Histogram Equalization, AHE )的一種變體,區(qū)別在于其對(duì)比度的增大是受限的。圖像相對(duì)均勻區(qū)域中的噪聲被 AHE 過(guò)度放大,而 CLAHE 通過(guò)限制對(duì)比度增大來(lái)解決這個(gè)問(wèn)題。該算法通過(guò)創(chuàng)建原始圖像的多個(gè)直方圖,并使用這些直方圖來(lái)重新分配圖像的亮度,用于提高圖像的對(duì)比度。
主要代碼
接下來(lái),將 CLAHE 應(yīng)用于灰度和彩色圖像。應(yīng)用 CLAHE 時(shí),有兩個(gè)重要參數(shù),第一個(gè)是 clipLimit,它設(shè)置對(duì)比度限制的閾值,默認(rèn)值為 40;第二個(gè)是 tileGridSize ,它設(shè)置行和列中的 tiles 數(shù)量。應(yīng)用 CLAHE 時(shí),圖像被分成稱為 tiles (默認(rèn)為 8 x 8 )的小塊以執(zhí)行其計(jì)算。 將 CLAHE 應(yīng)用于灰度圖像,需要使用以下代碼:
# 加載圖像
image = cv2.imread('example.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 灰度圖像應(yīng)用 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 應(yīng)用于彩色圖像,類似于彩色圖像對(duì)比度均衡的方法,創(chuàng)建四個(gè)函數(shù)以僅在不同顏色空間的亮度通道上使用 CLAHE 來(lái)均衡化彩色圖像:
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
# 彩色圖像應(yīng)用 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ù)應(yīng)用于測(cè)試圖像后比較結(jié)果,如下圖所示:

在上圖中,我們可以看到改變 clipLimit 參數(shù)在測(cè)試圖像上應(yīng)用 CLAHE 后的不同效果,同時(shí)也可以看到在不同顏色空間( LAB、HSV 和 YUV )的亮度通道上應(yīng)用 CLAHE 后的不同結(jié)果。其中,可以看到在 BGR 圖像的三個(gè)通道上應(yīng)用 CLAHE 與僅在不同顏色空間的亮度通道上使用 CLAHE 的不同效果。
比較 CLAHE 和直方圖均衡化
為了更好地展示 CLAHE 的效果,接下來(lái)對(duì)比 CLAHE 和直方圖均衡化 (cv2.equalizeHist()) 在同一圖像上的效果,同時(shí)可視化生成的圖像和生成的直方圖。
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)
# 計(jì)算直方圖
hist_eq = cv2.calcHist([gray_image_eq], [0], None, [256], [0, 256])
# 創(chuàng)建 clahe:
clahe = cv2.createCLAHE(clipLimit=4.0)
# 在灰度圖像上應(yīng)用 clahe
gray_image_clahe = clahe.apply(gray_image)
# 計(jì)算直方圖
hist_clahe = cv2.calcHist([gray_image_clahe], [0], None, [256], [0, 256])可視化的結(jié)果如下圖所示:

通過(guò)以上對(duì)比,可以肯定地說(shuō),在許多情況下,CLAHE 比應(yīng)用直方圖均衡化有更好的結(jié)果和性能。
到此這篇關(guān)于詳解OpenCV自適應(yīng)直方圖均衡化的應(yīng)用的文章就介紹到這了,更多相關(guān)OpenCV自適應(yīng)直方圖均衡化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python對(duì)接支付寶支付自實(shí)現(xiàn)功能
這篇文章主要介紹了Python對(duì)接支付寶支付自實(shí)現(xiàn)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
(手寫)PCA原理及其Python實(shí)現(xiàn)圖文詳解
這篇文章主要介紹了Python來(lái)PCA算法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你帶來(lái)幫助2021-08-08
Python Web編程之WSGI協(xié)議簡(jiǎn)介
這篇文章主要介紹了Python Web編程之WSGI協(xié)議,簡(jiǎn)單說(shuō)明了WSGI的概念、功能并結(jié)合實(shí)例形式分析了Gunicorn和uWSGI相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-07-07
pytorch?transforms圖像增強(qiáng)實(shí)現(xiàn)方法
這篇文章主要介紹了pytorch?transforms圖像增強(qiáng)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
jupyter notebook 使用過(guò)程中python莫名崩潰的原因及解決方式
這篇文章主要介紹了jupyter notebook 使用過(guò)程中python莫名崩潰的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題
這篇文章主要介紹了Pytorch 解決自定義子Module .cuda() tensor失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
PyQt5+python3+pycharm開發(fā)環(huán)境配置教程
這篇文章主要介紹了PyQt5+python3+pycharm開發(fā)環(huán)境配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
給Python IDLE加上自動(dòng)補(bǔ)全和歷史功能
這篇文章主要介紹了給Python IDLE加上自動(dòng)補(bǔ)全和歷史功能,需要的朋友可以參考下2014-11-11

