首頁 > 軟體

詳解OpenCV自適應直方圖均衡化的應用

2022-02-08 13:01:26

介紹

《直方圖均衡化詳解》中,我們已經瞭解的直方圖均衡化的基本概念,並且可以使用 cv2.equalizeHist() 函數執行直方圖均衡。

在本節中,將介紹如何應用對比度受限的自適應直方圖均衡化 ( Contrast Limited Adaptive Histogram Equalization, CLAHE ) 來均衡影象,CLAHE 是自適應直方圖均衡化( Adaptive Histogram Equalization, AHE )的一種變體,區別在於其對比度的增大是受限的。影象相對均勻區域中的噪聲被 AHE 過度放大,而 CLAHE 通過限制對比度增大來解決這個問題。該演演算法通過建立原始影象的多個直方圖,並使用這些直方圖來重新分配影象的亮度,用於提高影象的對比度。

主要程式碼

接下來,將 CLAHE 應用於灰度和彩色影象。應用 CLAHE 時,有兩個重要引數,第一個是 clipLimit,它設定對比度限制的閾值,預設值為 40;第二個是 tileGridSize ,它設定行和列中的 tiles 數量。應用 CLAHE 時,影象被分成稱為 tiles (預設為 8 x 8 )的小塊以執行其計算。 將 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 應用於彩色影象,類似於彩色影象對比度均衡的方法,建立四個函數以僅在不同顏色空間的亮度通道上使用 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)
# 其他影象的視覺化方法類似,不再贅述
# ...

將所有這些函數應用於測試影象後比較結果,如下圖所示:

在上圖中,我們可以看到改變 clipLimit 引數在測試影象上應用 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])
# 建立 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自適應直方圖均衡化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com