def color_transfer(sc, dc):
"""
Transfer color distribution from of sc, referred to dc.
Args:
sc (numpy.ndarray): input image to be transfered.
dc (numpy.ndarray): reference image
Returns:
numpy.ndarray: Transferred color distribution on the sc.
"""
def get_mean_and_std(img):
x_mean, x_std = cv2.meanStdDev(img)
x_mean = np.hstack(np.around(x_mean, 2))
x_std = np.hstack(np.around(x_std, 2))
return x_mean, x_std
sc = cv2.cvtColor(sc, cv2.COLOR_BGR2LAB)
s_mean, s_std = get_mean_and_std(sc)
dc = cv2.cvtColor(dc, cv2.COLOR_BGR2LAB)
t_mean, t_std = get_mean_and_std(dc)
img_n = ((sc-s_mean)*(t_std/s_std))+t_mean
np.putmask(img_n, img_n > 255, 255)
np.putmask(img_n, img_n < 0, 0)
dst = cv2.cvtColor(cv2.convertScaleAbs(img_n), cv2.COLOR_LAB2BGR)
return dst
这是一个颜色迁移函数,用于将输入图像 sc
的颜色分布转移到参考图像 dc
上。该函数使用 LAB 颜色空间进行颜色迁移。
函数的主要步骤如下:
将输入图像 sc
和参考图像 dc
转换为 LAB 颜色空间。
计算输入图像 sc
和参考图像 dc
的均值和标准差。
使用颜色迁移公式 (sc-s_mean)*(t_std/s_std))+t_mean
进行颜色迁移。
将结果图像的像素值限制在合理范围内(0到255之间)。
最后,将结果从 LAB 颜色空间转换回到 BGR 颜色空间。
这个函数可以用于使输入图像的颜色分布与参考图像相匹配。你可以将输入图像 sc
替换为你想要进行颜色迁移的图像,将参考图像 dc
替换为参考的图像。调用这个函数会返回颜色迁移后的图像。
为什么要将图像从BGR转换为LAB?
LAB(CIELAB)颜色空间是一种在计算机视觉和图形学中常用的颜色表示方式。它是一种设备无关的颜色空间,被设计用于更好地模拟人眼对颜色的感知。
LAB颜色空间有三个分量:
L(亮度):表示像素的亮度,范围是0到100。较大的L值表示较亮的颜色。
a(从绿到红):表示颜色的绿到红分量,范围是-128到127。负值表示绿色,正值表示红色。
b(从蓝到黄):表示颜色的蓝到黄分量,范围是-128到127。负值表示蓝色,正值表示黄色。
在LAB颜色空间中,色彩信息被分离到a和b通道,而亮度信息则存储在L通道。这种分离使得LAB颜色空间更适合于颜色校正和颜色迁移等应用。
对于颜色迁移函数中的 cv2.cvtColor(sc, cv2.COLOR_BGR2LAB)
和 cv2.cvtColor(dc, cv2.COLOR_BGR2LAB)
,它们分别将输入图像和参考图像从BGR颜色空间转换到LAB颜色空间,以便进行颜色迁移计算。最后的cv2.cvtColor(cv2.convertScaleAbs(img_n), cv2.COLOR_LAB2BGR)
则将颜色迁移后的图像从LAB颜色空间转换回BGR颜色空间。