- 代码
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_stdsc = 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_meannp.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颜色空间。