影像增強之對比度拉伸

saltriver發表於2018-03-24

我們前面提到過影像二值化,影像反轉,本質上是對影像的所有畫素點的灰度進行操作,屬於灰度變換的內容。灰度變換的主要目的是用於影像增強

而對比度拉伸是影像增強的一種方法,也屬於灰度變換操作。我們看如下影像:
這裡寫圖片描述
可以看到,這張圖片非常灰暗。我們檢視下其直方圖。

import cv2
import matplotlib.pyplot as plt

farina = cv2.imread("farina.png", 0)

hist_full = cv2.calcHist([farina], [0], None, [256], [0, 256])

plt.plot(hist_full)
plt.show()

這裡寫圖片描述
可以看到所有畫素的灰度值大部分集中在20-50之間,這使得整個影像很暗淡。也就是說對比度不高。如果我們通過灰度變換,將灰度值拉伸到整個0-255的區間,那麼其對比度顯然是大幅增強的。可以用如下的公式來將某個畫素的灰度值對映到更大的灰度空間:

I(x,y=I(x,y)IminImaxImin(MAXMIN)+MIN
I(x, y)=\frac {I(x,y)-Imin}{Imax-Imin}(MAX-MIN)+MIN

其中Imin,Imax是原始影像的最小灰度值和最大灰度值,MIN和MAX是要拉伸到的灰度空間的灰度最小值和最大值。

Imax = np.max(farina)
Imin = np.min(farina)
MAX = 255
MIN = 0
farina_cs = (farina - Imin) / (Imax - Imin) * (MAX - MIN) + MIN
cv2.imshow("farina_cs", farina_cs.astype("uint8"))
cv2.waitKey()

這裡寫圖片描述

可以看出,對比度提升了很多。我們再看看其直方圖,可以看到已經充滿了整個灰度空間。
這裡寫圖片描述

除了上述方法,對比度拉伸還有其它方法嗎?當然是有的。例如直方圖位移法(Histogram shifting)。公式如下:,

I(x,y)=I(x,y)+offset
I(x,y)=I(x,y)+offset

在每個畫素位置的灰度值增加一個偏移量offset。注意,這個offset可以是正數,也可以是負數。正的話,整體亮度變亮,負的話,整體亮度變暗。需要注意的是控制offset的值大小,不要越界。
farina_cs = farina + 100
cv2.imshow("farina_offset", farina_cs.astype("uint8"))
cv2.waitKey()
hist_full = cv2.calcHist([farina_cs.astype("uint8")], [0], None, [256], [0, 256])
plt.plot(hist_full)
plt.show()

下面分別是使用直方圖位移方法後的影像和其直方圖。
這裡寫圖片描述
這裡寫圖片描述

可以看出直方圖與原始直方圖形狀一模一樣,只是在橫軸上有所偏移。這種方法的影像增強效果並沒有上一種方法好。

相關文章