1. 算法原理
直方圖均衡化是一種常見的圖像增強方法,可以增強圖像的對比度。其數(shù)學(xué)原理如下:
首先,我們需要了解直方圖的概念。直方圖是對圖像像素分布的一種統(tǒng)計,它將每個像素值出現(xiàn)的次數(shù)記錄下來,并以圖形的方式呈現(xiàn)出來。在一幅圖像中,像素值的范圍通常是有限的。例如,對于一個 8 位灰度圖像,像素值的范圍是 0 到 255。
直方圖均衡化的目的是將一幅圖像的直方圖變成一個均勻分布的直方圖,從而增強圖像的對比度。具體來說,直方圖均衡化的步驟如下:
-
統(tǒng)計原始圖像的直方圖。我們可以計算每個像素值出現(xiàn)的次數(shù),然后將它們歸一化,得到每個像素值的頻率。
-
計算累計分布函數(shù)(CDF)。CDF 是對頻率分布函數(shù)(PDF)的積分,它表示每個像素值在原始圖像中出現(xiàn)的概率。CDF 可以通過對 PDF 進(jìn)行累加計算得到。對于一個灰度值 i,CDF 的計算公式如下:
其中, P ( j ) P(j) P(j) 表示灰度值為 j j j 的像素在圖像中出現(xiàn)的頻率。 -
計算均衡化后的像素值。我們需要將原始圖像中的每個像素值映射到一個新的像素值,使得均衡化后的直方圖近似為一個均勻分布的直方圖。這個映射函數(shù)可以通過以下公式計算:
其中, H ( i ) H(i) H(i) 表示映射后的像素值, M M M 和 N N N 分別表示圖像的寬度和高度, L L L 表示像素值的范圍, m i n min min 表示原始圖像中的最小像素值。 -
將原始圖像中的像素值替換為映射后的像素值。這樣就完成了直方圖均衡化的過程。
總的來說,直方圖均衡化的數(shù)學(xué)原理就是通過對原始圖像的直方圖進(jìn)行變換,將其變成一個均勻分布的直方圖,從而增強圖像的對比度。
2. 算法缺陷及改進(jìn)
2.1 缺陷
盡管直方圖均衡化是一種簡單且有效的圖像增強算法,但它也存在一些缺陷:
-
全局變換:直方圖均衡化是一種全局變換方法,它將整個圖像的直方圖都變成了均勻分布的直方圖,這可能會導(dǎo)致一些像素值的細(xì)節(jié)信息丟失或被模糊化。
-
非線性變換:直方圖均衡化的映射函數(shù)是非線性的,這意味著它會改變像素值之間的距離,從而可能導(dǎo)致一些圖像特征的失真。
-
計算復(fù)雜度:直方圖均衡化需要計算原始圖像的直方圖和累計分布函數(shù),這可能會增加算法的計算復(fù)雜度,尤其是對于大型圖像。
-
對噪聲敏感:由于直方圖均衡化是一種全局變換,它對圖像中的噪聲也會進(jìn)行增強,可能會使噪聲更加明顯。
因此,在實際應(yīng)用中,直方圖均衡化算法可能需要結(jié)合其他方法進(jìn)行優(yōu)化或改進(jìn),以克服其缺陷。例如,可以使用局部直方圖均衡化等技術(shù)來改進(jìn)算法的局限性。
2.2 改進(jìn)
限制對比度自適應(yīng)直方圖均衡化(CLAHE)是一種改進(jìn)的直方圖均衡化算法,它通過在圖像的局部區(qū)域內(nèi)進(jìn)行直方圖均衡化,以保留圖像的局部細(xì)節(jié)信息。
CLAHE 的基本原理如下:
-
將原始圖像分成許多小塊(或稱為子圖像),每個小塊大小為 N × N N \times N N×N。
-
對于每個小塊,計算其直方圖,并將直方圖進(jìn)行均衡化,得到映射函數(shù)。
-
對于每個小塊,使用對應(yīng)的映射函數(shù)對其像素值進(jìn)行變換。
-
由于像素值在小塊之間可能存在不連續(xù)的變化,因此需要進(jìn)行插值處理,以使得整個圖像的對比度保持連續(xù)。
CLAHE 的優(yōu)點如下:
-
保留了圖像的局部細(xì)節(jié)信息,不會將整個圖像都變成均勻分布的直方圖。
-
具有自適應(yīng)性,可以根據(jù)圖像的局部特征來調(diào)整直方圖均衡化的參數(shù)。
-
通過限制對比度,可以有效地減少直方圖均衡化算法對噪聲的敏感性。
CLAHE 的缺點如下:
-
對計算資源的要求較高,需要對整個圖像進(jìn)行分塊、直方圖均衡化和插值處理,因此計算量較大。
-
對算法的參數(shù)設(shè)置較為敏感,需要合理地設(shè)置參數(shù),以獲得良好的增強效果。
-
由于對比度的限制,可能會導(dǎo)致一些像素值的變化受到限制,從而降低圖像的視覺效果。
綜上所述,CLAHE 是一種比較優(yōu)秀的圖像增強算法,可以有效地保留圖像的局部細(xì)節(jié)信息,但其計算量較大,對算法的參數(shù)設(shè)置較為敏感,需要進(jìn)行合理的參數(shù)設(shè)置和優(yōu)化。
3. 實現(xiàn)
3.1 調(diào)包俠版本
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取原始圖像
img = cv2.imread('example.jpg', 0)
# 判斷圖像是否為灰度圖
if len(img.shape) == 2:
print('The image is a grayscale image.')
else:
# 將RGB圖像轉(zhuǎn)換為灰度圖像
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print('The image is a RGB image. Converting to grayscale...')
# 降低圖像的對比度
img = img.astype(np.float32) / 255.0
img_low_contrast = np.power(img, 2.2) * 255.0
# 將圖像轉(zhuǎn)換為uint8
img_low_contrast = np.uint8(img_low_contrast)
# 進(jìn)行直方圖均衡化
img_he = cv2.equalizeHist(img_low_contrast)
# 進(jìn)行自適應(yīng)直方圖均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
img_clahe = clahe.apply(img_low_contrast)
# 顯示原始圖像、降低對比度后的圖像和均衡化后的圖像
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(img_low_contrast, cmap='gray')
plt.title('Low Contrast Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(img_he, cmap='gray')
plt.title('Equalized Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_clahe, cmap='gray')
plt.title('Adaptive Equalized Image'), plt.xticks([]), plt.yticks([])
plt.show()
文章來源:http://www.zghlxwxcb.cn/news/detail-412080.html
3.2 自由發(fā)揮版本
TODO
文章來源地址http://www.zghlxwxcb.cn/news/detail-412080.html
到了這里,關(guān)于【數(shù)字圖像處理】直方圖均衡化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!