天天看點

python實作圖像的白平衡,破壞圖像的白平衡(冷、暖)和調節圖像的亮度

白平衡:

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

破壞白平衡:

使圖像偏暖或者偏冷。

思路:

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

代碼如下:

import cv2
import numpy as np
import os

# 将PNG檔案夾下的所有圖檔批量處理
file = 'PNG/'
a = os.listdir(file)
print('done')
for shu in a:
    img = cv2.imread(file + shu, 1)
    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]

    # 下述3行代碼控制白平衡或者冷暖色調,下例中增加了b的分量,會生成冷色調的圖像,
    # 如要實作白平衡,則把兩個+10都去掉;如要生成暖色調,則增加r的分量即可。
    bAve = cv2.mean(imgB)[0]
    gAve = cv2.mean(imgG)[0] + 10
    rAve = cv2.mean(imgR)[0] + 10
    aveGray = (int)(bAve + gAve + rAve) / 3

    # 2計算每個通道的增益系數
    bCoef = aveGray / bAve
    gCoef = aveGray / gAve
    rCoef = aveGray / rAve

    # 3使用增益系數
    imgB = np.floor((imgB * bCoef))  # 向下取整
    imgG = np.floor((imgG * gCoef))
    imgR = np.floor((imgR * rCoef))

    # 4将數組元素後處理
    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)
    cv2.imwrite('leng/' + shu[:-4] + '_n' + '.png', dst)     # 輸出路徑

           

調節亮度

通過調節圖像中整體的強度資訊來實作。

代碼如下:

import cv2
import numpy as np
import os

file1 = 'test/'   # 輸入路徑  批量處理
file2 = 'test_A/'  # 輸出路徑
a = os.listdir(file1)
for shu in a:
    img = cv2.imread(file1 + shu)
    img2 = np.zeros(img.shape, img.dtype)
    brightness = cv2.addWeighted(img, 1, img2, 2, -40)
    cv2.imwrite(file2 + shu[:-4] + '.png', brightness)   # 處理後圖像的輸出路徑
           

繼續閱讀