传统图像处理——颜色迁移

该文介绍了如何利用Python3.7.6和OpenCV4.4.0进行颜色迁移,通过将图像转换为LAB颜色空间,进行正交化处理,以改变图像的颜色风格。优化后的算法提高了效率,实现了从源图像到目标颜色风格的快速转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自知乎:https://zhuanlan.zhihu.com/p/267832794,仅供学习。

利用一张图片的颜色去修改另一张图片的颜色风格。

原理是利用颜色空间的正交化,即更改某个颜色,不会影响到其它属性。这里的色彩迁移的论文则是使用了LAB空间RGB颜色空间是非正交化空间)。

这里使用python3.7.6+opencv4.4.0实现。

选用优化后的算法效率提升很大。

颜色迁移

  • 1.先将图像转换为LAB格式:
img=cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
  • 2.再将源图像的均值和方差变换到目标颜色图像的均值和方差

(1) : 源图像的LAB分别进行零均值和单位方差化

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))

(2) 然后归一化后的原图像各通道乘以目标色图像的LAB各通道方差,再加上目标色图像的LAB各通道均值

height, width, channel = img.shape
for i in range(0, height):
	for j in range(0, width):
		for k in range(0, channel):
			x = sc[i, j, k]
			x = ((x - s_mean[k]) * (t_std[k] / s_std[k])) + t_mean[k]
			# round or +0.5
			x = round(x)
			# boundary check
			x = 0 if x < 0 else x
			x = 255 if x > 255 else x
			sc[i, j, k] = x

(3).最后再将图像转换为RGB格式:

cv2.cvtColor(res, cv2.COLOR_LAB2BGR)

下面演示颜色迁移效果:

在这里插入图片描述
4种待借鉴的颜色风格
在这里插入图片描述
4种迁移的效果图像
在这里插入图片描述
速度慢源码:

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

def color_transfer(sc, dc):
   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)
   height, width, channel = sc.shape
   for i in range(0, height):
      for j in range(0, width):
         for k in range(0, channel):
            x = sc[i, j, k]
            x = ((x - s_mean[k]) * (t_std[k] / s_std[k])) + t_mean[k]
            # round or +0.5
            x = round(x)
            # boundary check
            x = 0 if x < 0 else x
            x = 255 if x > 255 else x
            sc[i, j, k] = x
   dst = cv2.cvtColor(sc, cv2.COLOR_LAB2BGR)
   return dst

sc = cv2.imread("sc.bmp", 1)
dc = cv2.imread("sc.bmp", 1)
dst = color_transfer(sc, dc)
cv2.imshow("dst", dst)
cv2.waitKey()

后由小伙伴优化了算法,经测试速度灰常快,感谢这位小伙伴:

import cv2
import numpy as np
import time


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

def color_transfer(sc, dc):
	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 = cv2.imread("s1.bmp", 1)
dc = cv2.imread("t1.jpg", 1)
dst = color_transfer(sc, dc)
cv2.imshow("dst", dst)
cv2.waitKey()

参考大佬的python源代码:https://github.com/chia56028/Co

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@BangBang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值