先前介紹過的影像增強技術,同樣也可用來對色彩影像進行處理。
若 **伽瑪矯正(Gamma Correction)**技術同時套用於R、G、B色彩影像,則可解決過度曝光或曝光不足的問題。而伽瑪矯正也可僅套用於R、G、B一個通道上,此時由於特別針對單一色彩進行強化或減弱,稱為**色彩矯正(Color Correction)**。
程式碼如下:
import numpy as np
import cv2
def RGB_gamma_correction(f, channel, gamma):
g = f.copy()
nr, nc = f.shape[:2]
c = 255.0 / (255.0 ** gamma)
table = np.zeros(256)
for i in range(256):
table[i] = round(i ** gamma * c, 0)
if channel == 1:
k = 2
elif channel == 2:
k = 1
else:
k = 0
for x in range(nr):
for y in range(nc):
g[x, y, k] = table[f[x, y, k]]
return g
def main():
img = cv2.imread("D:\Desktop\IThome\lena.bmp", -1)
gamma = eval(input("please enter gamma: "))
img1 = RGB_gamma_correction(img, 1, gamma)
img2 = RGB_gamma_correction(img, 2, gamma)
img3 = RGB_gamma_correction(img, 3, gamma)
cv2.imshow("Original", img)
cv2.imshow("Gamma Correction(R)", img1)
cv2.imshow("Gamma Correction(G)", img2)
cv2.imshow("Gamma Correction(B)", img3)
cv2.waitKey()
cv2.destroyAllWindows()
main()
結果如下圖:
由左至右分別為:原圖、對R進行增強、對G進行增強、對B進行增強,Gamma值輸入為0.5。
若以灰階影像而言,**直方圖等化(Histogram Equalization)**可解決過度曝光、曝光不足或低對比度等問題。然而,若以色彩影像而言,當R、G、B三個通道同時套用直方圖等化,則產生的結果其實並不理想。
原因在於色彩影像在三個通道的直方圖、PDF或CDF不一定都相同,因此在三個通道中等化的程度都不同。因此為了解決此問題,通常會採用其他色彩模型,例如HSI或HSV的色彩模型,僅對Intensity或Value值進行直方圖等化,而不更改色彩屬性。
import numpy as np
import cv2
def HSV_histogram_equalization(f):
hsv = cv2.cvtColor(f, cv2.COLOR_BGR2HSV)
hsv[:, :, 2] = cv2.equalizeHist(hsv[:, :, 2])
g = cv2.cvtColor(f, cv2.COLOR_HSV2BGR)
return g
def main():
img1 = cv2.imread("D:\Desktop\IThome\test.bmp", -1)
img2 = HSV_histogram_equalization(img1)
cv2.imshow("Original", img1)
cv2.imshow("After", img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
main()
上述範例採用HSV模型進行直方圖等化,也可以使用HSI模型,但是輸出的影像會有所差異,仍會比使用RGB模型好