做項目的時候,有時候手抖,一不小心把一個成熟穩定的項目的相機配置,重置了,如何進行恢復呢,在不知道之前配置數據的情況下。
我在做項目的時候,為了讓這個相機成像穩定一點,尤其是做顏色檢測時,如果自動白平衡打開,會因為環境問題,光線波動,導致這個成像顏色波動,尤其是做顏色檢測的時候,所以一般我都會把這個白平衡關掉,然后單獨對紅綠藍三個通道去設置相應的值,調好了成像后,后面識別的時候,識別顏色的閾值就和當前的成像保持著關聯,一但成像變化大了,就可能導致之前的顏色閾值不適配了,導致顏色識別錯誤。
今天沒事的時候就會對著這個工業相機軟件亂點亂看,就不小心把之前配置的參數重置了。成像發生變化后,如果不想改變算法,就要盡量配置參數讓其更接近原先的成像。
首先:要需要兩張圖,一張圖簡稱1圖,第二張圖簡稱2圖
1圖是原先的圖,在參數未被重置時候,之前保存下的圖
2圖是重置參數后的圖
此外如果畫面目標變化了,我們要截取到一個不變區域,通過這個區域的顏色對比來計算。
其次:要知道重置后,當前圖的白平衡對應的紅綠藍三個值
準備就緒后,上代碼:
import cv2
import numpy as np
# 根據已有兩張圖1和2,還有2圖對應的白平衡值,來求1圖的白平衡值def calculate_white_balance(image1_path, image2_path, reference_wb):# 讀取兩張圖像img1 = cv2.imread(image1_path)img2 = cv2.imread(image2_path)if img1 is None:raise Exception(f"無法讀取圖像: {image1_path}")if img2 is None:raise Exception(f"無法讀取圖像: {image2_path}")# 將圖像轉換為浮點數類型img1_float = img1.astype(np.float32)img2_float = img2.astype(np.float32)# 計算兩張圖像每個通道的平均值avg1_b = np.mean(img1_float[:, :, 0])avg1_g = np.mean(img1_float[:, :, 1])avg1_r = np.mean(img1_float[:, :, 2])avg2_b = np.mean(img2_float[:, :, 0])avg2_g = np.mean(img2_float[:, :, 1])avg2_r = np.mean(img2_float[:, :, 2])# 使用參考白平衡值ref_r, ref_g, ref_b = reference_wb# 計算兩張圖像之間的比例關系ratio_r = avg1_r / avg2_rratio_g = avg1_g / avg2_gratio_b = avg1_b / avg2_b# 計算1.jpg的白平衡值wb_r = int(ref_r * ratio_r)wb_g = int(ref_g * ratio_g)wb_b = int(ref_b * ratio_b)return wb_r, wb_g, wb_bdef main():# 參考圖像的白平衡值reference_wb = (1360, 1124, 2110) # (R, G, B)try:# 計算1.jpg的白平衡值wb_r, wb_g, wb_b = calculate_white_balance("1.png", "2.png", reference_wb)print(f"1.jpg的白平衡值:")print(f"R: {wb_r}")print(f"G: {wb_g}")print(f"B: {wb_b}")except Exception as e:print(f"錯誤: {str(e)}")if __name__ == "__main__":main()
輸出結果:
1.jpg的白平衡值:
R: 1552
G: 1268
B: 2045
把這個值配置到白平衡對應的紅綠藍值即可,圖像又恢復成1圖的成像了。