OpenCV为70年前开国大典照片增加色彩

前后对比图

Colorful Image Colorization

图片的颜色上色,主要使用到了CNN卷积神经网络,作者在ImageNet数据集上进行了大量的训练,并将此问题使用在分类任务中,以解决问题的潜在的不确定性,并在训练时使用颜色重新平衡的损失函数方法来增加颜色的多样性。该算法在测试时作为CNN中的前馈通道实现,并在超过一百万个彩色图像上进行了训练。且使用“着色图灵测试”评估算法。

此算法作者为了训练神经网络,从imageNet数据集上搜集大量的数据,并将所有搜集的图像从图片的RGB空间转换为Lab空间。

与RGB三种颜色空间类似,Lab空间具有3个通道,但是与RGB不同,Lab空间对颜色的编码为:

  1. The L channel :代表颜色的亮度
  2. The a channel :绿-红
  3. The b channel :蓝-黄

Lab颜色空间是根据Commission International Eclairage(CIE)在1931年所制定的一种测定颜色的国际标准建立的。于1976年被改进,并且命名的一种色彩模式。Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。 [1] Lab颜色模型由三个要素组成,一个要素是亮度(L),a 和b是两个颜色通道。a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。因此,这种颜色混合后将产生具有明亮效果的色彩。

由于L通道仅编码强度,因此神经网络可以将L通道用作为网络的灰度输入

神经网络训练学习并预测a、b通道。 给定输入L通道和预测的ab通道,3中通道合并便可以生成彩色的图片

开国大典

黑白照片着色步骤

基于以上的基本知识的理解,我们可以总结一下黑白照片着色步骤为:

  1. 将输入图像从RGB颜色空间转换为Lab颜色空间
  2. 使用L通道信息作为神经网络的输入,并训练神经网络以预测Ab通道信息
  3. 将输入图像的L通道信息与神经网络预测的Ab通道信息合并
  4. 将合并的图片信息转换回RGB图像

作者已经使用imageNet数据集训练了神经网络,我们使用预训练模型与权重来进行图片的着色

代码实战

1、初始化神经网络

我们加载预训练模型与权重,加载一个numpy的聚类中心点文件,此文件为numpy类文件,主要是提供颜色的重新平衡损失函数算法,使用cv的dnn模块进行模型的加载,前期文章分享视频实时对象检测时,也用到了类似的代码来加载模型

深度学习和OpenCV的对象检测(MobileNet SSD视频流实时识别)

神经网络初始化

2、神经网络颜色重新平衡

如下代码的主要作用对神经网络的a通道颜色信息进行颜色重新平衡的损失函数,将图片的每个点看作为1*1 CNN 卷积核,并输入神经网络模型中

神经网络颜色重新平衡

3、处理原始图片

输入一张原始图片,对原始图片的像素强度转换为0-1的范围

#22 按照着色步骤,我们转换原始图片的RGB颜色空间到LAB颜色空间

#23 由于模型需要,我们resize一下输入图片的尺寸大小为224*224

#24-25 提取图片的L空间信息

处理原始图片

4、神经网络预测ab空间信息

初始化了神经网络以及处理好了输入图片,且获得了224*224尺寸大小的L空间信息,利用L空间信息作为神经网络的输入,来进行神经网络的预测,以便预测出AB空间信息(尺寸224*224)

待神经网络预测出AB空间信息后,我们resize一下ab空间到输入图片的大小,以便与输入图片的L空间进行合并

神经网络预测ab空间信息

5、合并L 空间与AB空间,获取上了色的图片

#31 由于前面我们resize了图片,所以这里重新从lab空间里面获取L空间颜色信息

#32 合并L空间颜色与预测的AB空间颜色

#33 把lab空间信息重新转换到RGB空间

#34 除掉超过0-1颜色强度

#35 前面由于除以255获得了0 1颜色强度,这里乘以255重新回到原始0-255范围

合并L 空间与AB空间,获取上了色的图片

6、呈现最终图片

最后,我们呈现一下原始图片与上了色的图片,进行一下对比,经过神经网络训练上色的图片与实际照片确实有些差别,但是很多情况下也是很好呈现了原始图片的信息

呈现图片

文章中的照片来源互联网,着色图片是软件上色图片

着色照片