任意图像转素描:Python分分钟实现

点击上方“小白学视觉”,选择加"星标"或“置顶

 
 
重磅干货,第一时间送达

图像转素描效果展示

4d7ee2da4634e7f1c66757bee447c906.png

看到这个标题你可能觉得,我这次终于开始标题党了。然而众所周知,我是标图党~,一般不会做标题党这种事情,既然说了分分钟实现,那就说明——代码在十行左右

代码虽少,但是效果确实一点都不含糊(即使含糊了....我也给出了调参的空间~)。

按照惯例,先看两张效果图:

f04c3e52af8cc9f94632c67089107e3c.png

还有一张在最上方。

我感觉我肯定是膨胀了,示例图片都敢不全放美女图片了。不全用美女示例图片的另一个原因是,之前做的AI小素只能做脸部的素描,其他部分的素描做的一塌糊涂(训练集只有脸部图片),这次换个天坛这种建筑图片,也能说明这个CV小素的能力要超过AI小素,能对不仅限于人脸人物的任意类型的图片做素描化。说任意类型可能有点夸大,不上线之前确实测试了不少类型的图片,效果都还可以。更多类型的图片效果,期待大家来测试,欢迎拍砖~

图像转素描原理与实现

做这个图像转素描的初衷是因为之前训练了一个肖像转素描的AI模型,还非常中二地命名为【AI小素】,不少小伙伴应该已经在网站上体验过AI小素的素描化效果了。但是AI小素限制太强,只能素描化人脸图片,其他图片则无能为力。因此,我就看了下怎么做任意图片的素描化。

大家一般用PS做图像转素描,谷歌搜索结果排第一的教程流程大概是这样的:

42d26c05be9f1fa6e46299ff4de3390a.png

这个教程一共有十六个步骤,但是其实上图展示的这些已经足以说明图像转素描的主要流程了。

图像转素描流程如下:

  1. 图像去色(上图教程中通过调小饱和度)

  2. 图像取反

  3. 取反后的图像进行高斯滤波

  4. 去色后的图像和取反滤波后的图像以混合模式为颜色减淡进行融合

看到这里,了解PS的小伙伴们可能已经知道怎么用PS做素描图了。

下面我们看看如何用Python实现,仍然用我们最熟悉的OpenCV

1. 备图

首先最基础的,准备一张小姐姐的图片,并读取出来备用:

import cv2

img_path = "/小/姐/姐/美/图.jpg"
img = cv2.imread(img_path)
c75fab1c261aff7438261b018b3fc705.png
2. 去色

说到去色,你可能立刻就想到了灰度化,是的,那就用灰度化吧。代码简单到无需注释和解释,还是直接上码上效果图吧:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
0e9b6da5311a0100e2a590a2e444a100.png

3. 图像取反

图像取反,乍一听好像很陌生,看完下面这一行更简单的代码你就明白了:

inv = 255 - gray

过于简单了?看效果吧。

a145a315a7eacc5e3299c3914657a047.png

状若女鬼,好像要向着恐怖片的方面发展......实际上只是图片中黑白易色,上图中的衣服体现的最为直观。

4. 高斯滤波

最基础的滤波,不多说。

blur = cv2.GaussianBlur(inv, ksize=(ksize, ksize), sigmaX=sigma, sigmaY=sigma)

ksizesigma两个参数可根据实际情况调节,我这里调参的觉得ksize=15, sigma=50效果还可以。你也可以调节下这两个参数,看看不同参数对最终素描化效果的影响。

194596382e6665899707e839e09aa68c.png

状若加了高斯滤镜的女鬼......

5. 颜色减淡混合

实际的混合模式的颜色减淡实现起来比较麻烦,而且速度较慢。有人说下面这一行代码就可以实现颜色减淡的效果,我是极为佩服的:

res = cv2.divide(gray, 255 - blur, scale=255)
a22e365ef3066b687131f72cb6132ec1.png

梳理一下

梳理一下上面的流程,相当于是,对于灰度图像中的每一个像素值x,用255 - x取反之后得到inv_x,再对此点进行高斯滤波得到blur_inv_x,然后用执行一下运算进行混合:

x / (255 - blur_inv_x) * 255

从上图可以看到,已经得到了效果不错的素描化图片了。对于有的图片可能素描化之后显得颜色有点淡,没关系,加个伽马变换调节一下就行了。

问题来了

上面是根据PS的流程转化的Python实现流程,感觉实际上起作用的就是这个公式x / (255 - blur_inv_x) * 255

上面的流程是:

灰度图->取反->高斯滤波->再取反(除法里面)->除法运算(divide)

我们看到,里面有两次取反操作,中间只是多了一个高斯滤波而已。众所周知,负负得正,取反两次相当于没有取反(我真是逻辑鬼才!)

那么问题来了,不取反行不行?行不行?试一下就知道了!

实验流程是下面这样的:

灰度图->高斯滤波->除法运算(divide)

公式是:x / blur_x * 255

最终的结果是下面这样的:

8e8d8ecf6512c9818428e61c03b06cea.png

与取反的差别在哪里呢?仔细看的话,取反的背景会更清晰一些,前景倒没有太大差别。

开始玩

上面已经介绍了素描化的完整实现,接下来就要开始各种玩了。我实现了几种基本的玩法,你看看有多基本:

  • 支持动态图

  • 素全图

  • 素左边

  • 素右边

  • 素上边

  • 素下边

2deb9e3460f2d7d29d3a1c64d24cce91.png 8c9fe55f1caeaef7a6ff1d4ecb0bfb81.png

参数可调,效果不好的话,可能需要你亲自动手调节一下:

54a30be592ace3493df5b9c91ce94a8a.png

a2116fed4e9f7ccab1578c6e2c57c8ff.gif

5f279239c43423d4ea57f9cda2da23d8.gif

ab0f6ab2190380aa500a4b24ac958da3.gif

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

e3d8fbf90256cb2cc593c9c7c080101b.png

966fa3dff336340d637d6939b7a96f94.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值