影象增強之對比度拉伸
阿新 • • 發佈:2019-02-16
我們前面提到過影象二值化,影象反轉,本質上是對影象的所有畫素點的灰度進行操作,屬於灰度變換的內容。灰度變換的主要目的是用於影象增強。
而對比度拉伸是影象增強的一種方法,也屬於灰度變換操作。我們看如下影象:
可以看到,這張圖片非常灰暗。我們檢視下其直方圖。
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的區間,那麼其對比度顯然是大幅增強的。可以用如下的公式來將某個畫素的灰度值對映到更大的灰度空間:
其中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)。公式如下:,
在每個畫素位置的灰度值增加一個偏移量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()
下面分別是使用直方圖位移方法後的影象和其直方圖。
可以看出直方圖與原始直方圖形狀一模一樣,只是在橫軸上有所偏移。這種方法的影象增強效果並沒有上一種方法好。