图像之间超快速的颜色转移

  • 1. 效果图
  • 2. 步骤
  • 3. 改进算法的方法
  • 4. 源码
  • 参考

目标:源图像与目标图像,转移源图像的色彩空间到目标图像,生成一张新的图像;

有关如何在两个图像之间转移颜色,有俩种方式,

  • (1)基于直方图的方法,该方法旨在平衡三种“类型”的颜色:相等,过多和不足。 该方法获得了良好的结果-但以速度为代价。使用此算法将要求您对源图像中的每个像素执行查找,这将随着图像尺寸的增加而变得非常昂贵。

  • (2)仅使用图像通道的均值和标准差的颜色转移算法。没有复杂的代码。没有计算直方图。只是简单的统计……这种方法甚至可以轻松处理巨大的图像。

1. 效果图

输入源图像和目标图像。源图像包含期待目标图像模仿的色彩空间。
在下图中,左侧的蓝色梦幻水母是我的源,中间的红色水母是我的目标图像,而右侧的图像是将左图色彩应用于目标图像的色彩空间。

2019年中秋节青岛海洋世界里拍的水母图,把梦幻的蓝色(左图)应用于目标烈焰红(中间图),合成独特的水母“红”(右边图);


水母2:左图的色彩应用于目标图梦幻的水母图,得到右边的结果图(有点像拍出来的骨片的色彩);

水母转换图3:左图 + 中间图 = 右图(结果是比较仙的浅紫色~~~)

2. 步骤

  1. 输入来源和目标图像。源图像包含您希望目标图像模仿的色彩空间。在此页顶部的图中,左侧的水母图像是我的源,中间的图像是我的目标,而右侧的图像是应用到目标的源的色彩空间。
  2. 将源图像和目标图像都转换为L * a * b *颜色空间。 L * a * b *颜色空间模拟了感知均匀性,其中颜色值的微小变化也应该在颜色重要性上产生相对相等的变化。与标准RGB颜色空间相比,L * a * b *颜色空间在模仿人类如何解释颜色方面做得好得多,并且您将看到,它在颜色转移方面效果很好。
  3. 分割源和目标图像的颜色通道值。
  4. 为源图像和目标图像计算每个L * a * b *通道的平均值和标准差。
  5. 从目标通道中减去目标图像的L * a * b *通道的平均值。
  6. 按目标的标准偏差除以源的标准偏差再乘以目标通道的比例来缩放目标通道。
  7. 为源图像添加L * a * b 通道的均值。
  8. 裁剪掉[0,255]范围之外的所有值。
  9. 将通道颜色值合并在一起。
  10. 从L * a * b 空间转换回RGB颜色空间。

3. 改进算法的方法

该算法非常快,有一个缺点——它依赖于全局颜色统计信息,因此像素强度值相似的大区域会极大地影响平均值(进而影响总体颜色传递)

为了解决这个问题,有两个解决方案:

  • (1)计算要模拟颜色的较小关注区域(ROI)中的源图像的均值和标准偏差,而不是使用整个图像。采用这种方法将使您的均值和标准差更好地表示您要使用的色彩空间。

  • (2)将k均值应用于两个图像。可以在L * a * b *颜色空间中的每个图像的像素强度上聚类,然后使用欧几里德距离确定最相似的两个图像之间的质心。

    然后,仅计算每个区域内的统计信息。同样,这将使您的平均数和标准差更具“局部”效果,并有助于减轻全局统计数据的过分表达问题。当然,缺点是这种方法的速度要慢得多,因为添加了昂贵的聚类步骤。

4. 源码

用到了 color_transfer模块的方法,可通过 pip install color_transfer 安装

# USAGE
# python example.py --source images/01.jpg --target images/02.jpg -o images/01_02.jpgimport argparseimport cv2
# 导入必要的类
from color_transfer import color_transferdef show_image(title, image, width=300):# resize图像以使得图像具有固定的大小,以便整个屏幕都可以展示r = width / float(image.shape[1])dim = (width, int(image.shape[0] * r))resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)# 展示缩放后的图像cv2.imshow(title, resized)# 构建命令行参数及解析
# --source 源图像
# --target 目标图像
# --output 是否输出转换后的图像,此为其路径
ap = argparse.ArgumentParser()
ap.add_argument("-s", "--source", required=True,help="Path to the source image")
ap.add_argument("-t", "--target", required=True,help="Path to the target image")
ap.add_argument("-o", "--output", help="Path to the output image (optional)")
args = vars(ap.parse_args())# 加载图像
source = cv2.imread(args["source"])
target = cv2.imread(args["target"])# 转移源图像的色彩分配 到 目标图像
transfer = color_transfer(source, target)# 检测是否保存输出图像
if args["output"] is not None:cv2.imwrite(args["output"], transfer)# 展示图像
show_image("Source", source)
show_image("Target", target)
show_image("Transfer", transfer)
cv2.waitKey(0)

参考

  • https://www.pyimagesearch.com/2014/06/30/super-fast-color-transfer-images/

使用Python,OpenCV实现图像之间超快速的颜色转移相关推荐

  1. 使用Python和OpenCV在图像之间执行超快速的颜色转换

    使用Python和OpenCV在图像之间执行超快速的颜色转换 1. 效果图 2. 原理 2.1 颜色转移算法 2.2 步骤 2.3 算法改进 3. 源码 参考 这篇博客将介绍如何使用Python和Op ...

  2. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  3. 【Python OpenCV】图像直方图 calcHist方法 equalizeHist方法

    [Python OpenCV]图像直方图 calcHist方法 equalizeHist方法 (一)图像直方图 图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图).所谓直方 ...

  4. Python+OpenCV:图像修复(Image Inpainting)

    Python+OpenCV:图像修复(Image Inpainting) 理论 Most of you will have some old degraded photos at your home ...

  5. Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features)

    Python+OpenCV:图像二进制鲁棒独立基本特征(BRIEF, Binary Robust Independent Elementary Features) 理论 We know SIFT us ...

  6. Python+OpenCV:图像Shi-Tomasi角点检测器

    Python+OpenCV:图像Shi-Tomasi角点检测器 理论 The scoring function in Harris Corner Detector was given by: Inst ...

  7. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  8. Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)

    Python+OpenCV:图像对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization) ############ ...

  9. Python+OpenCV:图像轮廓

    Python+OpenCV:图像轮廓 轮廓是什么? 轮廓可以简单地解释为一条连接所有连续点(沿边界)的曲线,具有相同的颜色和强度. 轮廓线是形状分析.目标检测和识别的重要工具. 为了获得更好的精度,可 ...

最新文章

  1. 别再问我Redis内存满了该怎么办了
  2. python掌握程度怎么判断-Python学到什么程度可以面试工作?
  3. ORA-12012: error on auto execute of job quot;ORACLE_OCM
  4. 10 words and phrases that shouldn’t be on your résumé
  5. java学习笔记9--内部类总结
  6. windows c语言能分配多少内存,Windows下C语言程序的内存布局(内存模型)
  7. office2010 启动man_Office2010打开慢速度怎么办?
  8. 转载:cin总结附带string输入总结
  9. 深度学习(九)——花式卷积
  10. python 输入框查询_Element输入框带历史查询记录
  11. matlab编程设计fir滤波器,用MATLAB设计FIR滤波器
  12. IDEA安装jclasslib
  13. Zynq-Linux移植学习笔记之47-PL部分spi flash文件系统挂载
  14. CentOS 8 配置 authorized_keys 免密登录后,免密登录失败的排查以及最终的解决
  15. nar神经网络_NAR 神经网络多步和单步预测
  16. 用java写个记账本,融会贯通你的J2SE(一)java实战项目 Java项目
  17. obj 与 fbx 三维模型文件对比
  18. LaTeX排版心形段落
  19. 数据库 2.关系模型
  20. derby数据库连接操作

热门文章

  1. Android中View如何刷新
  2. 2021年大数据常用语言Scala(二十六):函数式编程 分组 groupBy
  3. 2021年大数据Flink(三十一):​​​​​​​Table与SQL案例准备 依赖和​​​​​​​程序结构
  4. 兑换量子计算机,阅读 | 【量子计算机】构造置换量子门
  5. android layout组件,Android UI学习 - Linear Layout, RelativeLayout
  6. python list.pop 的方法的使用
  7. git 下载的文件与git上面的文件不相同的处理方法
  8. leetcode--Reorder List
  9. pyhton re模块
  10. 【kindeditor】KindEditor获取多个textarea文本框的值并判断非空