看到这个标题你可能以为,我这次终于开始标题党了。
然而众所周知,我是标图党~,一样平常不会做标题党这种事情,既然说了分分钟实现,那就解释——代码在十行旁边。

代码虽少,但是效果确实一点都不暗昧(纵然暗昧了....我也给出了调参的空间~)。

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

还有一张在最上方。

随便率性图像转素描Python分分钟实现

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

图像转素描事理与实现

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

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

这个教程一共有十六个步骤,但是实在上图展示的这些已经足以解释图像转素描的紧张流程了。

图像转素描流程如下:

图像去色(上图教程中通过调小饱和度)图像取反取反后的图像进行高斯滤波去色后的图像和取反滤波后的图像以稠浊模式为颜色减淡进行领悟

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

下面我们看看如何用Python实现,仍旧用我们最熟习的OpenCV。

1. 备图

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

importcv2img_path="/小/姐/姐/美/图.jpg"img=cv2.imread(img_path)

2. 去色

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

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

3. 图像取反

图像取反,乍一听彷佛很陌生,看完下面这一行更大略的代码你就明白了:

inv=255-gray

过于大略了?看效果吧。

状若女鬼,彷佛要向着胆怯片的方面发展......实际上只是图片中黑白易色,上图中的衣服表示的最为直不雅观。

4. 高斯滤波

最根本的滤波,不多说。

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

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

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

5. 颜色减淡稠浊

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

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

梳理一下

梳理一下上面的流程,相称于是,对付灰度图像中的每一个像素值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。

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

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

开始玩

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

支持动态图素全图素左边素右边素上边素下边

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