python请输入你的名字_实现《你的名字》同款滤镜,python+opencv

好久没有上简书,最近上来一看发现这篇文章阅读量远超了其他的文章,还有评论提到说在讲技术的时候卖萌不好。哈哈,当时写的时候完全没想过会有人搜到看,只是为自己的作品留个念想,所以文风比较散漫随意。于是这次来小修了一遍,谢谢阅读~

前很长一段时间,时光相册火了一个应用《你的名字》同款滤镜,一时间这种鲜艳靓丽的卡通天空滤镜刷遍了QQ空间朋友圈。

时光相册的效果是这样的。

左:原图,右:滤镜图

他们在新闻采访中说自己和prisma一样用到了深度学习的技术,不过是用在了天空区域提取上。

我初步理解下就是:

1. 使用深度学习提取了天空区域

2. 蒙版替换了预设的卡通天空图片

3. 辅以传统美图滤镜方法美化效果。

天空区域真的需要用深度学习来提取吗?在知乎上逛了,下果然有人和我有相似的疑问。

我觉得深度学习真的很难把控,这是自己做着玩的小东西,所以我就用opencv实现了一个极简版=v=

首先确定编码流程:

1). 实现天空提取检测模块

2). 实现无缝融合模块

3). 实现日系色调滤镜

4). 整合测试及联调

PART1. 天空区域提取

尝试了三种方法,两种是来自论文的,一种是随便写写的,从最终的平均质量来看,还是拍脑袋决定的简单方法A的平均质量更高。

方法A. 阈值分割,蓝色消除

核心思想是将蓝色作为天空进行消除。利用HSV颜色模型做色调分离,首先将原图转换到HSV空间,并进行蓝色部分的选择,然后做个阈值分割,从而使得蓝色可以被分割走。只要我们选取到了合适的H值,那么就可以把蓝色去掉。

下表是颜色对应的HSV的值:

这种方案在天空较均匀,蓝色较明显时表现较好

我的效果(目前用的opencv里的copyto接口,傻乎乎的粘贴了卡通天空图去检测到的区域)所以边界还比较僵硬。

我的天空区域提取代码:首先是cvtColor,给原图从BGR转HSV去,然后把hsv的三个通道split一下

用Inrange分出我们需要的蓝色阈值区域。中值滤波一下消除杂点,让Mask看起来比较完整。跟着一个开操作,再滤波一下。其实这些都是我随便定的,目的就是让提取出的黑白Mask更完整一点,别尽是小杂点,我们只需要保证大致的准确就行。把检测区域存在mask里,做成一个黑白图片。(用来提取天空region的mask),下面是这段文字的顺序代码描述。

B.《sky region detection in a single image for autonomous ground robot navigation》

和其他的方法不同,这个算法可以同时用于灰度图和彩色图。做法是:1、获取图像的梯度信息;2、根据能量函数优化计算【梯度域的最优分割阈值】,估计初始天空区域;3、最后一步后处理是为了细化前期天空区域的检测,比如途中没有天空区域出现,或天空对象伸出地面时。、

这个我实现了,测试时很容易检测出奇奇怪怪的东西。可能是我写的不对,如果最终要求是70%图能看,那么还是A方法好一些。

C.《一种基于灰度阈值的天地背景轮廓线提取方法》

针对天地背景轮廓线具有波动起伏、边缘模糊及轮廓边缘灰度值变化缓慢的特点,采用灰度阈值方法,实现了多种天地背景边缘轮廓提取

天地背景图像通常包括天空区域和地表区域,常见的有天空海面、天空平原、天空山地、天空沙漠等景物图像。在摄录远距离天地背景图像时,背景图像除了噪声增大外,还会因大气湍流等因素影响而产生抖动或起伏,这种现象在背景边缘轮廓附近尤为明显。其结果造成图像轮廓边缘模糊、波动起伏,图像边缘区域灰度值变化呈现连续缓慢变化状态,导致建立在微分理论基础上的传统经典图像边缘检测算法对天地背景图像的边缘轮廓提取失效。

同上,可能是我写的不对,如果最终要求是70%图能看,那么还是草率决定的A方法好一些。

无缝融合

在展示方法A效果的时候,我用copyto函数进行的融合,那融合效果十分僵硬,边缘一看就是抠图贴上去的,这种看起来就很没品并外行的效果,咱们是必须拒绝的。

那么怎么做融合才能无缝?这里我了解的方法中和时光相册效果最像的是一个叫【泊松融合】的方法。seamlessClone这个泊松函数在Opencv2里没有,所以我重新去下opencv3。下来opencv3后,发现报错提示我Numpy跟不上版本,本来装的是Numpy1.9,说要升级到10以上。然后跑去sourceforge里补了一个numpy 1.10.2。当环境配好之后,seamlessClone就自己通了。详细代码是这样的:

其实完全就是调用用seamlessClone这个函数么,前期需要做一些准备工作。找出边缘,给出定位(确定要把卡通图贴在什么位置、按什么比例缩放后再贴)

然后调用seamlessClone,按api上要求的给他传他要的那些参数就Ok了。这里选的融合方式是normal_clone,不清楚原因,只是把选项都试了试这个效果最好。

这个变化真真是超明显的。下面放对比图,左边是没有seamlessclone的,右边是seamlessClone的。可以看左边的树的间隙(好明显的异样感),右边是用seamlessclone之后,瞬间就无痕了。

这样看起来右边就已经挺自然的了。不过还缺了点“动漫感”,为什么呢,因为没有调色。

调色滤镜

其实这玩意卡了我很久,因为压根没在网上看到“教教我怎么做滤镜”这样的教程。一搜一大把都是用着那些很基本的函数弄来弄去,都是些很丑很土气的滤镜效果

那么多美图应用都提供了什么“和风滤镜”,“小清新滤镜”,“午后阳光滤镜”,Blabla…………

有木有人可以告诉我他们都是咋做的?

谢谢大神,虽然完全没有感受到手把手的教(擦泪),但是连猜带蒙的我还是给整出来了。

就让我来手把手的教大家一下(擦泪)。

首先,有一张(被公认很标准的)色卡图,当原始颜色映射表,左图是原始颜色表,右图是对应着某个色彩滤镜“比如和风”的滤镜色卡表。

这两个色卡表说是表,其实就是图片,就是一堆有RGB通道的像素点集。

我说下滤镜的思想:

要给一张图片刷滤镜,遍历它的每个像素点,比如坐标(0,0)的像素点,它的颜色是(123,132,231)先在表1查颜色(123,132,231)对应的色卡表位置(坐标),再去表二查出对位坐标的新的颜色值(RGB)替换掉当前像素点的颜色(RGB)。基本都是自行脑补出来的思路,原始色卡说白了就是一堆数值,一堆有规律的数值。

我们需要跟着输入图的各个像素点上的RGB值,找到它位于原始色卡的坐标。那么就是要找到原始色卡每个点的RGB值和它的坐标的对应关系。这个原石色卡表当然是有规律的,它每个坐标上的RGB数值都是和坐标挂钩的,是有规则的。

经过一段时间的归纳总结我推出来了映射公式:(AB二维是坐标,xyz是三个颜色通道)

A = y/4 + (x/32)*64

B = z/4 + ((x%32)/4)*64

这个公式我验证了完全正确,用网上给出的一个示例色卡,能刷出滤镜色如下。

是不是看起来挺高级?有点美图秀秀的feel了吧!

可能有人想问??右边那个对应新滤镜的色卡是怎么来的?

答:我在网上下载的。(好吧,专业的滤镜制作公司应该会需要艺术家?设计师来做那张色卡)这是艺术范畴了我等程序猿只要知道怎么怎么进行映射,怎么写代码转换风格就可以了。不过,毕竟是冲着实现你的名字同款滤镜的目标做的。那你的名字同款色调也是必须的。

那么我来介绍一下我制作右侧色卡的方法把。。

……

感觉说出来会很丢人。

……

但不失为一个好办法。

【把左侧的原始色卡存到手机里,放到任意一个美图应用里 “刷一下” ,刷哪个滤镜,就出哪个滤镜的色卡。等于是复刻色卡】

如果是盈利性质的这样做肯定是不行的,应该让设计师设计,咱们宅着自己练技术玩,这方法还不错。

下面是我对色卡操作的代码:

整合前三块

最后就是简单的加法,把前三块串起来就Ok了

可以大概看看最终效果,我觉得还挺梦幻的,不过因为天空提取的算法太简单,所以有些图片的天空的表现很辣鸡就是了。。Just for fun!

嘿嘿嘿我要写简书当然是放好看的效果了。至于不好看的,就不展示了

批量测试的结果(100张图):

好看的结果普遍在50%左右,能看(不保证好看)的结果在80%以上。不能看的在15%左右。不能看图就是固定的几张,都是因为天空区域提取出错了(多选/少选)。如果想做成专业应用,在天空区域提取这步肯定不能像我写的方法A这么随意。

以上。

谢谢阅读~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.2-控制单元CU的微程序设计

【README】 1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 2.微指令:1条微指令就是多个bit位,如8个bit,每个bit位表示一种微操作&#xff1b…

微服务的误读与误解

微服务确实很受欢迎,但是对于微服务的误解也是事实,本文对这些误解一一来介绍下: 一、微服务不够“微”? 尽管微服务定义的很明确,但是开发者社区对它的解释却颇有争议,主要的一些问题如下: 1.它是否是单体架构的代表…

Hibernate注解(二)之映射简单的属性

翻译自 Hibernate Annotations2. 映射简单的属性 2.1.声明基本的属性映射每个非静态非瞬态属性(取决于访问类型的字段或方法)都被认为是持久性的,除非您将其注释为Transient。没有为您的财产注释等同于适当的 Basic注释。该Basic 注释允许…

进程与服务的签名_苹果app签名需要注意哪几点

现在部分的智能手机系统设备和工作一个应用软件,都需求证书的签名认证。未经任何签名的程序是不能在智能手机上设备和工作的。验证签名的底子进程则:智能手机操作系统或软件渠道对收到的原始数据选用相同的杂凑运算得到消息摘要,将与被签署时分的消息摘要…

8.4-中断系统

【README】 1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐; 2.采用一问一答的方式对中断进行总结(中断7问题),refer2 8.4-中断系统小结&…

ASP.NET Core的配置(1):读取配置信息

提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中。到了.NET Core的时候,很多我们…

EL调用java方法

一、jstl函数 jstl函数自定义二、调用方法的值成变量 第一种使用request对象 <% request.setAttribute(“isOperate”,isShowOperate()); %> 第二种使用标签变量 <c:set var"isOperate" value"<%isShowOperate()%>" />转换成变量使用<…

wordcloud python3.7_[原创]win7/64位系统+python3.7.2下安装wordcloud库失败之解决——一个莫名其妙的方法...

当前环境&#xff1a;win7/64位系统python3.7.2pip-19.2.1使用pip install wordcould安装时出现错误&#xff0c;提示&#xff1a;尝试方法①&#xff1a;考虑更换其他安装源提示没有变化&#xff0c;仍然提示没有找到分发版本-----------强行插入的分割线-------------------(…

1-计算机系统概论

【README】 本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1.1】计算机软硬件概念 【1.2】计算机层次结构 【2】计算机基本组成 【2.1】冯诺依曼计算机特点&#xff08;重要*&#…

JetBrains 加入 .NET 基金会

在 BUILD 大会上&#xff0c;微软正式对外宣布&#xff0c;JetBrains 已经加入 .NET 基金会&#xff0c;详细情况可以查看 .NET Foundation 博客。 JetBrains 因为用户推荐、ReSharpe、ReSharper Ultimate 套件等原因&#xff0c;在 .NET 平台投入大量资源。而现在&#xff0c…

jstl中添加自定义的函数

转载自 jstl中添加自定义的函数由于jstl中提供的函数未必能够满足我们的要求&#xff0c;而我们又希望能够像jstl提供的函数那样能够轻松方便使用&#xff0c;那么可以通过自定义函数补充jsltl函数。给jstl添加自定义函数需要以下步骤&#xff1a;定义一个static的public的方…

多智能体强化学习_基于多智能体强化学习主宰星际争霸游戏

大家好&#xff0c;今天我们来介绍基于多智能体强化学习主宰星际争霸游戏这篇论文Grandmaster level in StarCraft II using multi-agent reinforcement learning​doi.org从Alphastar以后 利用强化学习的方法进行星际争霸2AI的又一大突破。Part1 前言游戏介绍(Introduction to…

2-计算机发展及应用

【README】 本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】计算机发展史 【1.1】计算机的产生和发展 【1.2】微型计算机的出现与发展 芯片上的晶体管的数量 与 cpu速度间 有没有关…

ASP.NET Core的配置(2):配置模型详解

在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式&#xff0c;其中涉及到三个重要的对象&#xff0c;它们分别是承载结构化配置信息的Configuration&#xff0c;提供原始配置源数据的ConfigurationProvider&#xff0c;以及作为“中间人”的ConfigurationBuilder。…

Mysql的安装与远程登录

一、安装 &#xff08;1&#xff09;linux版A.linux普通版http://www.jb51.net/article/104107.htmB.ubuntu版 1.安装 sudo apt-get install mysql-server apt-get isntall mysql-client sudo apt-get install libmysqlclient-dev2.设置密码cd /etc/mysql vi debian.cnf ,得…

sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

1 前言2 自定义规则实现2.1 规则功能2.2 实现规则的理论基础2.3 规则代码实现3 总结4 参考资料1 前言为了实现如标题所述的将多个静态库合并为一个动态库&#xff0c;内置的 Bazel 规则是没有这个功能的&#xff0c;Bazel C/C 相关的内置规则有&#xff1a;cc_binary &#xff…

(转)base64编码(严格说来,base64不算作加解密算法)

【README】 1.本文转自&#xff1a; Java base64加密解密 - xuwc - 博客园参考&#xff1a; https://www.cnblogs.com/luguo3000/p/3940197.html https://blog.csdn.net/jiahao1186/article/detailhttps://www.cnblogs.com/xuwc/p/14058183.htmlhttps://zh.wikipedia.org/wik…

JavaWeb的web.xml标签元素(一)

普通信息标签 &#xff08;1&#xff09;display-name 定义了WEB应用的名字,在servletContextConfig display-name* XML语法&#xff1a;<display-name>AppName</display-name> &#xff08;2&#xff09;description 可以使用description元素来提供有关部署描述符…

python3多线程第三方库_Python3 多线程

Python3 多线程多线程类似于同时执行多个不同程序&#xff0c;多线程运行有如下优点&#xff1a;使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人&#xff0c;比如用户点击了一个按钮去触发某些事件的处理&#xff0c;可以弹出一个进度条来显示…

采用MiniProfiler监控EF与.NET MVC项目

今天来说说EF与MVC项目的性能检测和监控&#xff0c;相对本篇文章&#xff0c;更推荐大家使用另一个类似组件 NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC MiniProfiler是Stack Ove…