图像间的超快速色彩传递(P1)
安装
假设您已经安装了OpenCV(带有Python绑定)和NumPy,最简单的安装方法是使用pip:
代码解释
我已经创建了一个PyPI包,你可以用它在你自己的图像之间进行颜色转换。该代码也可以在GitHub上获得。
(以下为GitHub的代码链接:
https://github.com/jrosebr1/color_transfer)
不管怎样,让我们卷起袖子,把手弄脏,看看color_transfer包
下面发生了什么:
第3行和第4行导入我们需要的包。我们将使用NumPy进行数值处理,使用CV2进行OpenCV绑定。
从那里,我们在第5行定义了颜色传递函数。此函数执行颜色从源图像(第一个参数)到目标图像(第二个参数)的实际传输。
Reinhard等人详细介绍的算法表明,应该使用L*a*b*颜色空间,而不是标准RGB。为了处理这个问题,我们将源图像和目标图像转换为第9行和第10行的L*a*b*颜色空间(步骤1和2)。
OpenCV将图像表示为多维NumPy数组,但默认为uint8数据类型。这在大多数情况下都很好,但在执行颜色转移时,我们可能会有负值和十进制值,因此我们需要使用浮点数据类型。
现在,让我们开始执行实际的颜色转移:
第12行和第13行調用image_stats函數,我將在幾段中詳細討論。 但就現時而言,要知道該函數只是分別計算每個L*、a*和b*通道的點數强度的平均值和標準差(步驟3和4)。
現在我們有了源影像和目標影像的每個L*a*b*通道的平均值和標準差,我們現在可以執行顏色轉移。
在第17-20行,我們將目標影像分割為L*、a*和b*分量,並减去它們各自的平均值(步驟5)。
從這裡開始,我們在第23-25行上執行第6步,按目標標準差除以源影像標準差的比率進行縮放。
然後,我們可以應用第7步,將第28-30行的源通道平均值相加。
第8步是在第34-36行處理的,在這裡我們剪輯掉範圍[0255]之外的值(在L*a*b*顏色空間的OpenCV實現中,這些值被縮放到範圍[0255],儘管這不是原始L*a*b*規範的一部分)。
最後,我們在第41行和第42行執行第9步和第10步,將縮放的L*a*b*通道合併在一起,最後轉換回原始RGB顏色空間。
最後,我們在第45行返回彩色轉印影像。
讓我們快速查看image_stats函數,以完成以下程式碼解釋:
这里我们定义image_stats函数,它接受一个参数:我们要计算统计数据的图像。
在调用CV2之前,我们假设图像已经在L*a*b*颜色空间中。在第46行拆分,将我们的图像拆分为各自的频道。
从这里开始,第47-49行处理计算每个通道的平均值和标准偏差。
最后,在第52行返回每个通道的平均值和标准偏差的元组。