【实用代码片段】从原图像到目标图像的颜色迁移

  • 代码
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 颜色空间进行颜色迁移。

函数的主要步骤如下:

  1. 将输入图像 sc 和参考图像 dc 转换为 LAB 颜色空间。

  2. 计算输入图像 sc 和参考图像 dc 的均值和标准差。

  3. 使用颜色迁移公式 (sc-s_mean)*(t_std/s_std))+t_mean 进行颜色迁移。

  4. 将结果图像的像素值限制在合理范围内(0到255之间)。

  5. 最后,将结果从 LAB 颜色空间转换回到 BGR 颜色空间。

这个函数可以用于使输入图像的颜色分布与参考图像相匹配。你可以将输入图像 sc 替换为你想要进行颜色迁移的图像,将参考图像 dc 替换为参考的图像。调用这个函数会返回颜色迁移后的图像。

  •  讨论

为什么要将图像从BGR转换为LAB?

LAB(CIELAB)颜色空间是一种在计算机视觉和图形学中常用的颜色表示方式。它是一种设备无关的颜色空间,被设计用于更好地模拟人眼对颜色的感知。

LAB颜色空间有三个分量:

  1. L(亮度):表示像素的亮度,范围是0到100。较大的L值表示较亮的颜色。

  2. a(从绿到红):表示颜色的绿到红分量,范围是-128到127。负值表示绿色,正值表示红色。

  3. 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颜色空间。

你可能感兴趣的:(opencv,人工智能,计算机视觉)