CLAHE直方圖均衡化 - OpenCV


直方圖均衡化是一種影像處理技術,用於透過重新分配畫素強度來增強影像的對比度,從而最大化整體亮度和細節。該方法透過調整影像中畫素值的頻率分佈來工作,使得生成的影像具有均勻的直方圖。均勻的直方圖確保影像中的每個畫素都有相同的出現機會,從而產生對比度增強的分佈良好的影像。

直方圖均衡化是影像處理中一個重要的工具,常用於各種應用中,包括醫學影像、遙感和計算機視覺。該技術在增強對比度或亮度較差的影像(例如在低光照條件下拍攝的影像或過度曝光的影像)方面特別有用。

直方圖均衡化是影像處理中一個重要的工具,常用於各種應用中,包括醫學影像、遙感和計算機視覺。該技術在增強對比度或亮度較差的影像(例如在低光照條件下拍攝的影像或過度曝光的影像)方面特別有用。

儘管直方圖均衡化在增強影像對比度方面非常有效,但它可能會導致生成的影像中出現一些偽影,例如噪聲的過度放大和細節的丟失。因此,多年來開發了該方法的各種變體和改進,例如自適應直方圖均衡化、對比度受限自適應直方圖均衡化和區域性直方圖均衡化等。

現在讓我們瞭解一下CLAHE。

CLAHE

對比度受限自適應直方圖均衡化(CLAHE)是直方圖均衡化的一種變體,已廣泛用於影像處理應用中,以提高影像對比度,同時避免噪聲的過度放大並保留影像細節。CLAHE背後的主要思想是在影像的較小區域中區域性執行直方圖均衡化,而不是全域性執行。

在傳統的直方圖均衡化中,影像被分成小的不重疊區域或子影像,並且每個子影像都被單獨均衡化。此過程可能導致對比度低的子影像中的噪聲過度放大,從而導致影像出現噪點和人工效果。相比之下,CLAHE將影像劃分為重疊區域,並分別對每個區域應用直方圖均衡化。這允許在保留區域性細節和避免噪聲過度放大的同時更好地增強對比度。

CLAHE涉及兩個主要步驟:對比度增強和對比度限制。在第一步中,區域性直方圖均衡化應用於影像的每個小區域,從而提高對比度。在第二步中,透過對直方圖應用非線性函式來限制影像的對比度,從而減少具有非常高或非常低強度的畫素的數量。非線性函式由稱為裁剪限制的引數定義,該引數確定要應用的對比度限制量。

裁剪限制是CLAHE中的一個重要引數。它決定了在對比度受限之前每個區域可以執行的最大對比度放大量。如果裁剪限制設定得太高,影像可能會過度增強並出現人工效果,例如邊緣周圍的光暈或整體沖淡的外觀。另一方面,如果裁剪限制設定得太低,對比度增強可能不足,影像可能看起來暗淡。

CLAHE與傳統的直方圖均衡化相比有幾個優點。首先,它可以更有效地保留區域性細節和增強對比度。其次,它可以避免噪聲過度放大,這在醫學影像應用中尤其重要,因為影像可能存在噪聲。最後,它是一種簡單且計算效率高的演算法,使其適用於即時應用。

總之,CLAHE是一種強大的技術,用於增強影像對比度,同時保留區域性細節並避免噪聲過度放大。它已廣泛用於各種應用中,包括醫學影像、遙感和計算機視覺。它能夠適應區域性對比度變化並避免噪聲過度放大的能力使其成為許多領域中增強影像的寶貴工具。

本教程將演示使用對比度受限自適應直方圖均衡化(CLAHE)均衡影像的過程。

可以使用此演算法增強影像的對比度。此外,CLAHE可以應用於彩色影像,當僅對HSV影像的亮度通道應用演算法而不是均衡BGR影像的所有通道時,可以獲得更好的結果。

使用CLAHE時,需要注意兩個引數:clipLimit和tileGridSize。

clipLimit設定對比度限制的閾值,預設值為40。同時,tileGridSize在將影像劃分為CLAHE應用的區域時確定每行和每列的圖塊數量,其預設值為8x8。

現在理論知識足夠了,讓我們探索如何利用CLAHE進行直方圖均衡化。

在深入程式碼之前,我們首先需要確保我們的機器上安裝了opencv模組,如果沒有,則需要執行下面顯示的命令。

命令

pip3 install opencv-python 

請考慮下面顯示的程式碼。

示例

import cv2
import numpy as np

# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))

# The initial processing of the image
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
clahe = cv2.createCLAHE(clipLimit = 5)
final_img = clahe.apply(image_bw) + 30

# Ordinary thresholding the same image
_, ordinary_img = cv2.threshold(image_bw, 155, 255, cv2.THRESH_BINARY)

# Showing all the three images
cv2.imshow("ordinary threshold", ordinary_img)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()

解釋

此程式碼使用Python中的OpenCV庫執行簡單的影像處理任務。

首先,它匯入必要的庫:OpenCV和NumPy。然後,它從當前目錄讀取名為“aircraft-ww2.jpeg”的影像,並將其大小調整為500x600以確保相容性。

接下來,使用cv2.cvtColor()函式將影像轉換為灰度。生成的image_bw變數儲存灰度影像。

之後,程式碼使用cv2.createCLAHE()函式對灰度影像應用對比度受限自適應直方圖均衡化(CLAHE)。clipLimit引數設定為5,它決定對比度限制的閾值。然後透過新增值30來調整生成的影像以增加其亮度。

除了CLAHE影像外,程式碼還使用cv2.threshold()函式對灰度影像執行普通閾值處理。閾值設定為155,這意味著任何高於155的畫素值都設定為255(白色),任何低於155的值都設定為0(黑色)。生成的影像儲存在變數ordinary_img中。

最後,程式碼使用cv2.imshow()函式顯示所有三個影像,“普通閾值”表示普通閾值處理影像,“CLAHE影像”表示CLAHE增強的影像。程式碼在使用cv2.waitKey()關閉視窗之前等待按鍵。

要執行以上程式碼,我們需要執行下面顯示的命令。

命令

python3 main.py

執行以上命令後,我們可以期望輸出與下面顯示的輸出相同。

輸出

左側是未經clahe處理的原始影像,右側是使用CLAHE處理的影像。

現在讓我們再舉一個例子。

我們將更改cliplimit和titleGridSize。

請考慮下面顯示的程式碼。

示例

import cv2
import numpy as np

# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))

# The initial processing of the image
# Uncomment the line below to apply median filtering
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
# tileGridSize -> Number of tiles in the row and column
clahe = cv2.createCLAHE(clipLimit=10, tileGridSize=(8, 8))
final_img = clahe.apply(image_bw)

# Adjust the brightness of the output
final_img = cv2.add(final_img, 50)

# Showing all the three images
cv2.imshow("Original image", image)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()

解釋

首先,我們匯入必要的庫,OpenCV和NumPy。

然後,我們使用cv2.imread()函式從當前目錄讀取名為“aircraft-ww2.jpeg”的影像,並將其儲存在“image”變數中。我們將影像大小調整為500 x 600畫素,以確保與顯示視窗相容。

接下來,我們使用cv2.cvtColor()函式將影像轉換為灰度,並將其儲存在一個名為“image_bw”的新變數中。

然後,我們使用cv2.createCLAHE()函式建立一個對比度受限自適應直方圖均衡化(CLAHE)物件。我們將“clipLimit”引數設定為10,它設定對比度限制的閾值,並將“tileGridSize”引數設定為(8,8),它設定行和列中的圖塊數量。

然後,我們使用CLAHE物件的apply()方法將CLAHE演算法應用於灰度影像,並將結果儲存在一個名為“final_img”的新變數中。

最後,我們透過使用cv2.add()函式向“final_img”變數新增值50來調整輸出影像的亮度。我們使用cv2.imshow()函式並排顯示原始影像和CLAHE增強的影像,並使用cv2.waitKey()函式等待按鍵。

要執行以上程式碼,我們需要執行下面顯示的命令。

命令

python3 main.py

執行以上命令後,我們可以期望輸出與下面顯示的輸出相同。

輸出

結論

總之,對比度受限自適應直方圖均衡化(CLAHE)是一種強大的影像增強技術,可以改善影像的對比度和動態範圍。

藉助OpenCV,可以輕鬆地在灰度和彩色影像上實現CLAHE。透過調整clipLimit和tileGridSize引數,我們可以微調CLAHE演算法的效能以滿足我們的需求。總的來說,CLAHE是影像處理中一個有用的工具,可以幫助提高各種應用中影像的視覺質量。

更新於: 2023年8月2日

3K+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.