miniimagenet的图像预处理代码_图像着色 使用 OpenCV ,深度学习 进行 黑白图像着色

b3fdc4299d0497096b5181d897336fd8.png

原文链接 图像着色 使用 OpenCV ,深度学习 进行 黑白图像着色

在 2019年7月23日 上张贴 由 hotdog发表回复

图像着色 使用OpenCV,深学习进行黑白 图像着色

fadc597c342ea4228d810021a5768043.png

在本教程中,您将学习如何使用OpenCV,深度学习和Python对黑白图像进行着色。
图像着色是获取输入灰度(黑白)图像然后产生输出彩色图像的过程,该输出彩色图像表示输入的语义颜色和色调(例如,在晴朗的晴天,海洋必须是合理的“蓝色”) – 它不能被模型着色为“粉红色”。
以前的 图像着色 方法有:

  1. 依赖于重要的人际互动和注释
  2. 产生去饱和着色

我们今天在这里使用的新方法取决于深度学习。我们将利用能够为黑白图像着色的卷积神经网络,其结果甚至可以“愚弄”人类!要了解如何使用OpenCV执行黑白 图像着色,请继续阅读!
寻找这篇文章的源代码?
跳到下载部分。
OpenCV和深度学习的黑白 图像着色
在本教程的第一部分中,我们将讨论如何利用深度学习来着色黑白图像。
从那里我们将利用OpenCV为以下两者着色黑白图像:

  1. 图片
  2. 视频

然后,我们将探讨我们工作的一些示例和演示。
我们如何通过深度学习为黑白图像着色?

a0b9a7f54880399eafeedd2bf2aa2b83.png

图1: Zhang等人的深度学习黑白图像着色的体系结构。
我们今天要介绍的技术来自Zhang等人的2016年ECCV论文“ 彩色图像着色”
以前的黑白图像着色方法依赖于手动人体注释,并且经常产生不可称为真正着色的去饱和结果。
张等人。决定通过使用卷积神经网络“幻觉化”输入灰度图像在着色时的样子来解决 图像着色 问题。
培训网络张等人。从ImageNet数据集开始,将 所有图像从RGB颜色空间转换为Lab颜色空间。
与RGB颜色空间类似,Lab颜色空间有三个通道。但 RGB颜色空间不同,Lab对颜色信息进行了不同的编码:

  • L 通道 编码仅亮度强度
  • a 通道 编码绿色-红色。
  • b 通道编码蓝黄色

实验室颜色空间的完整评论超出了本文的范围( 有关实验室的更多信息,请参阅本指南),但这里的要点是实验室可以更好地代表人类如何看待颜色。
由于L通道仅对强度进行编码,因此我们可以使用L通道作为网络的灰度输入。
从那里,网络必须学会预测ab通道。 给定输入L通道预测的ab通道,我们可以形成最终的输出图像。整个(简化)过程可归纳为:

  1. 将所有训练图像从RGB颜色空间转换为Lab颜色空间。
  2. 使用L通道作为网络的输入并训练网络预测ab通道。
  3. 将输入L通道与预测的ab通道组合。
  4. 将Lab图像转换回RGB。

为了产生更合理的黑白图像着色,作者还利用了一些额外的技术,包括平均退火和用于颜色再平衡的专用损失函数(两者都超出了本文的范围)。
有关图像着色算法和深度学习模型的更多详细信息,请务必参考Zhang等人的官方出版物。
项目结构
继续使用本文的“下载”部分下载源代码,模型和示例图像 。
解压缩后,您应该导航到项目目录。
从那里,让我们使用 tree 命令检查项目结构

12d2ed5c9c91eeb3831322af904b68a4.png

我们在images / 目录中有四个黑白图像样本 。
我们的Caffe模型和prototxt 与集群点NumPy文件一起位于 model /目录中。
我们今天将审查两个脚本:

  • bw2color_image .py
  • bw2color_video .py

图像脚本可以处理任何黑色和白色(也称为灰度)图像你通过。
我们的视频脚本将使用您的网络摄像头或接受输入视频文件,然后执行着色。
使用OpenCV着色黑白图像
让我们继续使用OpenCV实现黑白图像着色脚本。
打开 bw2color_image .py

d06210f9c2a449ba33993bf64943d023.png

我们的colorizer脚本只需要三个导入:NumPy,OpenCV和 argparse 。
让我们继续 href="https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/">使用argparse 解析命令行参数。此脚本要求将这四个参数直接从终端传递给脚本:

  • – image :输入黑/白图像的路径。
  • – prototxt :我们的Caffe原型文件路径。
  • – model 。我们通往Caffe预训练模型的途径。
  • – points :NumPy群集中心点文件的路径。

使用上述四个标志和相应的参数,脚本将能够使用不同的输入运行而无需更改任何代码。
让我们继续将模型和集群中心加载到内存中

2212174e0c4291a20e5afc4c42dc38ce.png

第21行直接从命令行参数值加载我们的Caffe模型。OpenCV可以通过cv2读取Caffe模型 。dnn 。readNetFromCaffe 函数。
然后,第22行将聚类中心点直接从命令行参数路径加载到点文件。这个文件是NumPy格式,所以我们使用的是 np 。加载 。
从那里, 第25-29行:

  • 用于重新平衡的ab信道量化的加载中心。
  • 将每个点视为1×1卷积并将它们添加到模型中。

现在让我们加载,缩放和转换我们的图像

要从文件路径加载输入图像,我们使用 cv2 。imread 在34行
预处理步骤包括:

  • 将像素强度缩放到[0,1]范围(第35行)。
  • 从BGR转换为Lab颜色空间(第36行)。

让我们继续我们的预处理

dcc72c1aa2e214d20343a639bea2efd3.png

我们将继续将输入图像调整为22 4×2 24(第41行),这是网络所需的输入尺寸。
然后我们只抓取 L 通道(即输入)并执行平均减法(第42和43行)。
现在我们可以通过网络传递输入L通道预测 ab通道

9b7d2e126af99972ee24c607aca3b4fc.png

L 通道通过网络的正向 传输发生在 第48和49行 (如果需要,这是="https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/">OpenCV的blobFromImage复习)。
请注意,我们调用 net.forward后 。在同一行,我们说干就干,提取的预测 AB 卷。我在这里看起来很容易,但请参考张等人。 如果您想了解更多详细信息,请参阅GitHub上的文档和演示。
从那里,我们将预测的ab 体积调整为 与输入图像相同的尺寸(第53行)。
现在是时候进行后期处理了。请留在这里,因为我们基本上反过来执行以前的一些步骤

d949ff42d3c65867a7c4011d727b93ab.png

后期处理包括:

  • 抓取 L 通道原始输入图像(58行)和连接所述原始 L 信道和预测 AB 渠道一起形成 着色 (59线)。
  • 将 彩色 图像从Lab颜色空间转换为RGB(第63行)。
  • 剪切超出范围[0,1]的任何像素强度(第64行)。
  • 将像素强度恢复到[0,255]范围内(第69行)。在预处理步骤(第35行)中,我们除以255 ,现在我们乘以 255 。我还发现这种扩展和 “uint8” 转换不是必需的,但它有助于代码在OpenCV 3.4.x4.x版本之间工作。

最后,我们的原始 图像 和 彩色 图像都显示在屏幕上!
图像着色结果
现在我们已经实现了图像着色脚本,让我们试一试。
确保您已使用此博客文章的“下载”部分下载源代码,着色模型和示例图像。
从那里打开终端,导航到下载源代码的位置,然后执行以下命令

$ python bw2color_image.py --prototxt model/colorization_deploy_v2.prototxt --model model/colorization_release_v2.caffemodel --points model/pts_in_hull.npy --image images/robin_williams.jpg

cc978bb95d765cdcc950d661adf154ff.png

左边,你可以看到罗宾·威廉姆斯的原始输入图像,这位着名的演员和喜剧演员在5年前去世了。
右侧,您可以看到黑白着色模型的输出。
让我们尝试另一个图像,这是阿尔伯特爱因斯坦的一个

$ python bw2color_image.py --prototxt model/colorization_deploy_v2.prototxt --model model/colorization_release_v2.caffemodel --points model/pts_in_hull.npy --image images/albert_einstein.jpg

285bf28429d30d0a108dccaec5b4a9de.png

这种图像着色给我留下了特别深刻的印象。
注意水是如何适当的蓝色阴影,而爱因斯坦的衬衫是白色的,他的裤子是卡其色 – 所有这些都是合理的颜色。
这是另一个示例图像,这是我最喜欢的作者之一马克吐温:

$ python bw2color_image.py --prototxt model/colorization_deploy_v2.prototxt --model model/colorization_release_v2.caffemodel --points model/pts_in_hull.npy --image images/mark_twain.jpg

1706f6495af544aab1f68ee51e97ed72.png

在这里,我们可以看到草和树叶正确地着色为绿色,尽管你可以看到这些绿色混合成Twain的鞋子和手。
最终的图像展示了使用OpenCV的不太好的黑白图像着色

$ python bw2color_image.py --prototxt model/colorization_deploy_v2.prototxt --model model/colorization_release_v2.caffemodel --points model/pts_in_hull.npy --image images/adrian_and_janie.png

dce11a51798f0827bbff36bb6ea483e6.png

这张照片是几周前在暴风雪中我自己和我的小猎犬小狗Janie拍的。
在这里你可以看到,虽然雪,Janie,我的夹克,甚至背景中的凉亭都是正确的颜色,我的蓝色牛仔裤实际上是红色的。
并非所有的图像着色都是完美的,但今天的结果确实证明了Zhang等人的合理性。做法。
使用OpenCV进行实时黑白视频着色
我们已经看到了如何将黑白图像着色应用于图像 – 但是我们可以对视频流做同样的事情吗?
该脚本遵循与上述相同的过程,除了我们将处理视频流的帧。我将更详细地回顾它,并专注于帧抓取和处理方面。
打开 bw2color_video .py

8b94a68d00c687d2ebb87554accc0f98.png

我们的视频脚本需要另外两个导入:

  • VideoStream 允许我们从网络摄像头或视频文件中抓取帧
  • time 将用于暂停以允许网络摄像头预热

我们 现在初始化我们的 VideoStream

636f03cd82088a7e30b73af8518922ac.png

根据我们是否使用 网络摄像头 或视频文件,我们将 在此处创建我们的 vs(即“视频流”)对象。
从那里,我们将加载着色器深度学习模型和聚类中心(与我们之前的脚本中的方式相同)

46ec17a3d2f56cf2f50c41f586a8f3f6.png

现在,我们将开始一个无限 while 循环 环比数据帧。我们将直接在循环中处理帧

fdc0ab064f438df4549461be0a02f3b1.png

来自我们vs的每一帧都 被第55和56行抓住 。检查 None 类型 帧 – 当发生这种情况时,我们已经到达视频文件的末尾(如果我们正在处理视频文件),我们可以 从循环中断开(第60和61行)。
预处理(与以前一样)在第66-75行进行 。这是我们调整大小,缩放和转换为Lab的地方。然后我们抓住 L 通道,并执行平均减法。
现在让我们应用深度学习着色并对结果进行后处理

29d70699d52392117c526eebecb21f18.png

我们 通过网络的L深度学习前向传递 导致预测的 ab 信道。
然后我们将结果后处理到我们的 彩色 图像(第86-95行)。这是我们调整大小,抓住原始 L ,并连接我们预测的 ab的地方 。从那里,我们将Lab转换为RGB,剪辑和缩放。
如果你紧跟在上面,你会记得我们接下来要做的就是显示结果

da32ba71934c22bdf4634d7578f1d99f.png

我们的原始网络摄像头 框架 与我们的灰度图像和 彩色 结果一起显示。
如果 按下“q” 键,我们将从 循环和清理中断开。
视频着色结果
让我们继续,尝试我们的视频黑白色彩脚本。
确保使用本教程的“下载”部分下载源代码和着色模型。
从那里,打开一个终端并执行以下命令,让您的网络摄像头上运行着色器

$ python bw2color_video.py --prototxt model/colorization_deploy_v2.prototxt --model model/colorization_release_v2.caffemodel --points model/pts_in_hull.npy

如果要在视频文件上运行着色器,可以使用以下命令

$ python bw2color_video.py --prototxt model/colorization_deploy_v2.prototxt --model model/colorization_release_v2.caffemodel --points model/pts_in_hull.npy --input video/jurassic_park_intro.mp4Credits::

  • ef="https://www.youtube.com/watch?v=lc0UehYemQA">侏罗纪公园预告片视频
  • ef="https://www.youtube.com/watch?v=D8zlUUrFK-M">侏罗纪公园主题曲

这款机型在我的3Ghz Intel Xeon W上接近实时运行。
使用GPU,当然可以获得实时性能; 但是,请记住,对OpenCV的“dnn”模块的GPU支持目前有点受限,遗憾的是,它还不支持NVIDIA GPU。
摘要
在今天的教程中,您学习了如何使用OpenCV和深度学习为黑白图像着色。
我们今天使用的图像着色模型首先由Zhang等人介绍。在他们的2016年出版物,彩色图像着色
使用这个模型,我们能够将两者着色:

  1. 黑白图像
  2. 黑白视频

我们的结果虽然不完美,但展示了自动着色黑白图像和视频的合理性。
根据张等人的说法,他们的方法能够在32%的几率里“愚弄”人类!
我希望你喜欢今天的帖子


代码下载
源代码下载

原文链接 图像着色 使用 OpenCV ,深度学习 进行 黑白图像着色


文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Black and white image colorization with OpenCV and Deep Learning/,2009年7月23日访问
相关文章

  • 边缘检测 使用 OpenCV 和 深度学习 进行整体嵌套边缘检测
  • 活体检测 使用OpenCV进行 运动检测
  • 文本识别 使用 Tesseract 进行 OpenCV OCR 和 文本识别
  • Mask R-CNN Keras 对象检测 对象分割 像素掩码
  • YOLO 对象检测 OpenCV 源代码

张贴在技术博客、opencv标签:opencv、深度学习、图像着色编辑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值