图像间的超快速色彩传递(P0,前情提要)
颜色转移算法
我对颜色传递的实现(松散地)基于Reinhard等人(2001)的图像之间的颜色传递。
在本文中,Reinhard及其同事证明,通过分别利用L*a*b*颜色空间和每个L*、a*和b*通道的平均值和标准偏差,可以在两幅图像之间传递颜色。
算法如下:
第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步:剪裁[0255]范围之外的任何值。(注意:这一步不是原著的一部分。我之所以添加这一步,是因为OpenCV处理颜色空间转换的方式。如果要在不同的语言/库中实现此算法,您必须自己执行颜色空间转换,或者了解进行转换的库是如何工作的)。
第9步:将频道重新合并在一起。
第10步:从L*a*b*空间转换回RGB颜色空间。
我知道这似乎需要很多步骤,但事实并非如此,尤其是考虑到在使用Python、NumPy和OpenCV时,该算法的实现有多么简单。
如果现在看起来有点复杂,别担心。继续阅读,我会解释为算法提供动力的代码。
要求
我假设您的系统上安装了Python、OpenCV(带有Python绑定)和NumPy。