现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma、versa 等,可以把你的照片变成梵高、毕加索、蒙克等大师的风格。

这种功能叫做“图像风格迁移”,几乎都是基于 CVPR 2015 的论文《A Neural Algorithm of Artistic Style》和 ECCV 2016 的论文《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》中提出的算法,以及后续相关研究的基础上开发出来的。

通俗来讲,就是借助于

而因为神经网络在计算机视觉方面的应用越来越广,著名的视觉开发库 OpenCV 在 3.3 版本中正式引入DNN(深度神经网络),支持 Caffe、TensorFlow、Torch/PyTorch 等主流框架的模型,可用以实现图像的识别、检测、分类、分割、着色等功能。

我最近才发现在 OpenCV 的 Sample 代码中就有图像风格迁移的 Python 示例(原谅我的后知后觉),是基于 ECCV 2016 论文中的网络模型实现。所以,即使作为人工智能的菜鸟,也可以拿别人训练好的模型来玩一玩,体会下神经网络的奇妙。

(相关代码和模型的获取见文末)

OpenCV 官方代码地址:https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py

目录下通过执行命令运行代码:

python fast_neural_style.py --model starry_night.t7

model参数是提供预先训练好的模型文件路径,OpenCV 没有提供下载,但给出的参考项目 https://github.com/jcjohnson/fast-neural-style 中可以找到

其他可设置参数有:

input可以指定原始图片/视频,如果不提供就默认使用摄像头实时采集。

width、height,调整处理图像的大小,设置小一点可以提高计算速度。在我自己的电脑上,300x200 的转换视频可以达到 15 帧/秒。

median_filter中值滤波的窗口大小,用来对结果图像进行平滑处理,这个对结果影响不大。

执行后的效果(取自 jcjohnson/fast-neural-style):

原始图像

ECCV16 models

instance_norm models

核心代码其实很短,就是加载模型 -> 读取图片 -> 进行计算 -> 输出图片,我在官方示例基础上进一步简化了一下:

import cv2

# 加载模型

net = cv2.dnn.readNetFromTorch('the_scream.t7')

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV);

# 读取图片

image = cv2.imread('test.jpg')

(h, w) = image.shape[:2]

blob = cv2.dnn.blobFromImage(image, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False)

# 进行计算

net.setInput(blob)

out = net.forward()

out = out.reshape(3, out.shape[2], out.shape[3])

out[0] += 103.939

out[1] += 116.779

out[2] += 123.68

out /= 255

out = out.transpose(1, 2, 0)

# 输出图片

cv2.imshow('Styled image', out)

cv2.waitKey(0)

执行结果:

另外还改了个多效果实时对比的版本(计算量大了,很卡顿),也一并上传在代码中。

PS:前两天看赵雷演唱会的时候我还说:他演唱会的背景 MV 大量使用了 图像二值化、边缘检测 等操作,让我想到以前数字图像处理课的大作业……现在图像风格迁移的效率达到了实时,想必以后也会经常被使用吧

参考文献:

fast-neural-style jcjohnson

https://github.com/jcjohnson/fast-neural-style

Perceptual Losses for Real-Time Style Transfer and Super-Resolution(ECCV 2016)

Justin Johnson, Alexandre Alahi, Li Fei-Fei

A Neural Algorithm of Artistic Style(CVPR 2015)

Leon A. Gatys, Alexander S. Ecker, Matthias Bethge

Neural Style Transfer with OpenCV - Adrian Rosebrock

https://www.pyimagesearch.com/2018/08/27/neural-style-transfer-with-opencv/

可以用 Python 编程语言做哪些神奇好玩的事情?- 知乎回答 @杨航锋

https://www.zhihu.com/question/21395276/answer/115805610

opencv python是什么_Python+OpenCV 十几行代码模仿世界名画相关推荐

  1. python画自己的名字_Python+OpenCV 十几行代码模仿世界名画

    原标题:Python+OpenCV 十几行代码模仿世界名画 现在很多人都喜欢拍照(自拍).有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma.versa 等, ...

  2. Python+OpenCV 十几行代码模仿世界名画

    现在很多人都喜欢拍照(自拍).有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma.versa 等,可以把你的照片变成 梵高.毕加索.蒙克 等大师的风格. 这种 ...

  3. python开发视频播放器_python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  4. python怎么判断真假_Python不超过10行代码就可实现人脸识别,教你辨别真假

    [[爱编程的南风]Python不超过10行代码就可实现人脸识别,教你辨别真假]http://toutiao.com/group/6518157903055045127/?iid=15906422033 ...

  5. opencv python 调用摄像头_python+opencv实现摄像头调用的方法

    最近入了一块树莓派,想让其实现摄像头的调用,因此写下此博客备忘 一.树莓派网络的配置 首先,对树莓派进行网络配置,否则就无法进行软件的安装 我们知道,ifconfig命令可以修改ip地址.子网掩码等信 ...

  6. python实现新闻网站_Python 教你 4 行代码开发新闻网站通用爬虫

    ​ GNE(GeneralNewsExtractor)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的 HTML, 输出正文内容.标题.作者.发布时间.正文中的图片地址和正文所在的标签源代码.GNE ...

  7. python控制视频播放器的大小与位置_python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  8. python语言写视频播放器-python_十几行代码实现简单播放器

    python20行代码实现简单播放器 播放器简介 播放器大家都并不陌生,我们听音乐,我们看视频都会用到.那么播放器实现的功能到底有哪些呢?一个播放器一般来讲都完成了如下步骤: 读取文件(包括音频文件和 ...

  9. 谷歌为什么把几十亿行代码放在一个库?

    <ACM通信>有一篇论文<为什么 Google 要把几十亿行代码放在一个库?>,作者是谷歌基础设施小组的工程师.作者详细讲述了Google的代码为什么全部放在一个库里面. 一. ...

最新文章

  1. java报错MalformedURLException: unknown protocol: c
  2. Hibernate5-多对一双向关联-fetch=select,lazy=proxy,在一的一方的class标签中添加
  3. Infineon第九届汽车电子开发者大会宣传视频
  4. Log4net 配置使用总结(一)
  5. python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目
  6. LeetCode 1271. 十六进制魔术数字(进制转换)
  7. 2018亚太CDN峰会开幕,阿里云王海华解读云+端+AI的短视频最佳实践
  8. centos7.x redhat7.x 升级openssh8.7
  9. winform控件的学习
  10. 【Python】main函数 if __name__=='__main__' 详解
  11. 卷积神经网络的重要知识点
  12. 自动执行任务_中小企业如何做运维自动化?
  13. linux pppoe 共享上网,Linux操作系统下如何PPPOE拨号共享上网?
  14. 如何筹办一场千人技术峰会?
  15. 存档修改 html,制作可以修改.rpgsave存档的网页
  16. 【python 去除文件名后缀或提取后缀】
  17. SEAndroid安全机制中的文件安全上下文关联分析
  18. python表白代码,照片隐藏表白话语
  19. Go+Python双剑合璧
  20. app模式会被第三方平台模式取代吗_未来APP将取代移动网站? - 搜外问答

热门文章

  1. python高并发的解决方案
  2. 小程序“errcode“:41002错误问题如何解决?
  3. python自动控制windows、Android的软件用来实现机器人流程自动化--RPA,外挂、自动化测试等方面的解决方案
  4. 分布式任务调度平台XXL-JOB本地配置可能遇到的问题和解决方案
  5. JS中for循环里面的闭包问题的原因及解决办法
  6. Hibernate hbm2ddl.auto配置的可能值是什么,它们做了什么
  7. 监控MySQL数据库的主从状态的shell脚本
  8. markdown测试
  9. public virtual T GetT(string key, T defaultValue)
  10. MyBatis -- Spring -- SqlSessionFactoryBean