Pin-Jiun / ComputerVision

0 stars 0 forks source link

4-modify color temperature, white balance #4

Open Pin-Jiun opened 1 year ago

Pin-Jiun commented 1 year ago

調整色調、色溫(白平衡)

白平衡: 讓實際環境中白色的物體在你拍攝的畫面中也呈現出“真正”的白色。不同性質的光源會在畫面中產生不同的色彩傾向,比如說,蠟燭的光線會使畫面偏橘黃色,而黃昏過後的光線則會為景物披上一層藍色的冷調。而我們的視覺系統會自動對不同的光線作出補償,所以無論在暖調還是冷調的光線環境下,我們看一張白紙永遠還是白色的。但相機則不然,它只會直接記錄呈現在它面前的色彩,這就會導致畫面色彩偏暖或偏冷。

破壞白平衡: 使圖像偏暖或者偏冷。

思路 白平衡的思想是將三原色的成分比例變得近似相同 而破壞白平衡則相反,增大b分量所占比例實現冷色調,增大r分量所占比例實現暖色調。

def modify_color_temperature(img):

    # ---------------- 冷色調 ---------------- #  

#     height = img.shape[0]
#     width = img.shape[1]
#     dst = np.zeros(img.shape, img.dtype)

    # 1.計算三個通道的平均值,並依照平均值調整色調
    imgB = img[:, :, 0] 
    imgG = img[:, :, 1]
    imgR = img[:, :, 2] 

    # 調整色調請調整這邊~~ 
    # 白平衡 -> 三個值變化相同
    # 冷色調(增加b分量) -> 除了b之外都增加
    # 暖色調(增加r分量) -> 除了r之外都增加
    bAve = cv2.mean(imgB)[0] 
    gAve = cv2.mean(imgG)[0] + 20
    rAve = cv2.mean(imgR)[0] + 20
    aveGray = (int)(bAve + gAve + rAve) / 3

    # 2. 計算各通道增益係數,並使用此係數計算結果
    bCoef = aveGray / bAve
    gCoef = aveGray / gAve
    rCoef = aveGray / rAve
    imgB = np.floor((imgB * bCoef))  # 向下取整
    imgG = np.floor((imgG * gCoef))
    imgR = np.floor((imgR * rCoef))

    # 3. 變換後處理
#     for i in range(0, height):
#         for j in range(0, width):
#             imgb = imgB[i, j]
#             imgg = imgG[i, j]
#             imgr = imgR[i, j]
#             if imgb > 255:
#                 imgb = 255
#             if imgg > 255:
#                 imgg = 255
#             if imgr > 255:
#                 imgr = 255
#             dst[i, j] = (imgb, imgg, imgr)

    # 將原文第3部分的演算法做修改版,加快速度
    imgb = imgB
    imgb[imgb > 255] = 255

    imgg = imgG
    imgg[imgg > 255] = 255

    imgr = imgR
    imgr[imgr > 255] = 255

    cold_rgb = np.dstack((imgb, imgg, imgr)).astype(np.uint8) 

    print("Cold color:")
    print(cold_rgb.shape)
    show_img(cold_rgb)

我們所說的冷、暖色調,其實就是色溫變化的結果, 而色溫的變化,通常也就伴隨著「白平衡的破壞」。

一個白平衡的圖片,色調並不會明顯偏冷或偏暖, 但因為人類視覺上的觀感,有時我們能透過色調使圖片更有特色。

例如:

想呈現「冷酷、冰冷」的照片,適合使用冷色調。 想呈現「溫暖、熱情」的照片,適合使用暖色調。 -> 關於修改演算法的部分: 原文的演算法使用兩層for迴圈進行計算, 但既然都使用了numpy矩陣,使用矩陣算法才是更有效率的方式, 因此才有修改版的寫法,如果讀者有興趣可以自行試試執行時間的差距。