Если я правильно понимаю, вы хотите сбалансировать цвета с отлитыми цветами с помощью источника света, предсказанного вашей моделью.Ваш прогноз состоит из 3 значений (скажем, [альфа, бета, ceta]), которые представляют собой поправочные коэффициенты, которые будут применены к каждому каналу (синий, зеленый, красный) ваших изображений с цветной заливкой.
Однако, прежде чем применить усиление коррекции, необходимо выполнить гамма-линеаризацию изображений (дополнительная информация здесь ).
Вот несколько примеров кодов, которые помогутВы:
import cv2
import numpy as np
def gamma_decode(B_gamma, G_gamma, R_gamma):
B_gamma = B_gamma/255
G_gamma = G_gamma/255
R_gamma = R_gamma/255
gamma = 1/2.2
B_gamma_decode = 255*(B_gamma**(1/gamma))
G_gamma_decode = 255*(G_gamma**(1/gamma))
R_gamma_decode = 255*(R_gamma**(1/gamma))
return (B_gamma_decode, G_gamma_decode, R_gamma_decode)
def gamma_encode(B_channel, G_channel, R_channel):
B_channel = B_channel/255
G_channel = G_channel/255
R_channel = R_channel/255
gamma = 1/2.2
if np.all(B_channel <= 0):
B_gamma_cor = (B_channel**(gamma + 0j))
B_gamma_cor = 255*(abs(B_gamma_cor))
else:
B_gamma_cor = 255*(B_channel**gamma)
if np.all(G_channel <= 0):
G_gamma_cor = (G_channel**(gamma + 0j))
G_gamma_cor = 255*(abs(G_gamma_cor))
else:
G_gamma_cor = 255*(G_channel**gamma)
if np.all(R_channel <= 0):
R_gamma_cor = (R_channel**(gamma + 0j))
R_gamma_cor = 255*(abs(R_gamma_cor))
else:
R_gamma_cor = 255*(R_channel**gamma)
return (B_gamma_cor, G_gamma_cor, R_gamma_cor)
def white_balance(img, pred_illum)
B_channel, G_channel, R_channel = cv2.split(img)
alpha, beta, ceta = pred_illum
#Gamma_decoding
B_channel, G_channel, R_channel = gamma_decode(B_channel, G_channel, R_channel)
#Correction
B_cor = (alpha*B_channel)
G_cor = (beta*G_channel)
R_cor = (ceta*R_channel)
#Gamma encoding
B_cor, G_cor, R_cor = gamma_encode(B_cor, G_cor, R_cor)
#Convert to uint8 to display
B_cor = B_cor.astype(np.uint8)
G_cor = G_cor.astype(np.uint8)
R_cor = R_cor.astype(np.uint8)
img_white_balanced = cv2.merge((B_cor, G_cor, R_cor))
return img_white_balanced