您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

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

时间:2020-09-21 10:32:09  来源:  作者:

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

 

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

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

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

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

 

还有一张在最上方。

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

图像转素描原理与实现

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

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

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

 

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

图像转素描流程如下:

  1. 图像去色(上图教程中通过调小饱和度)
  2. 图像取反
  3. 取反后的图像进行高斯滤波
  4. 去色后的图像和取反滤波后的图像以混合模式为颜色减淡进行融合

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

下面我们看看如何用Python/ target=_blank class=infotextkey>Python实现,仍然用我们最熟悉的OpenCV。

1. 备图

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

import cv2
img_path = "/小/姐/姐/美/图.jpg"
img = cv2.imread(img_path)
任意图像转素描:Python分分钟实现

 

2. 去色

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

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
任意图像转素描:Python分分钟实现

 

3. 图像取反

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

inv = 255 - gray

过于简单了?看效果吧。

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

 

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

4. 高斯滤波

最基础的滤波,不多说。

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

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

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

 

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

5. 颜色减淡混合

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

res = cv2.divide(gray, 255 - blur, scale=255)
任意图像转素描:Python分分钟实现

 

梳理一下

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

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

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

 

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

开始玩

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

  • 支持动态图
  • 素全图
  • 素左边
  • 素右边
  • 素上边
  • 素下边
任意图像转素描:Python分分钟实现

 


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

 

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

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

 



Tags:Python 图像转素描   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
看到这个标题你可能觉得,我这次终于开始标题党了。然而众所周知,我是标图党~,一般不会做标题党这种事情,既然说了分分钟实现,那就说明——代码在十行左右。代码虽少,但...【详细内容】
2020-09-21  Tags: Python 图像转素描  点击:(87)  评论:(0)  加入收藏
▌简易百科推荐
近几年 Web3 被炒得火热,但是大部分人可能还不清楚什么是 Web3,今天就让w3cschool编程狮小师妹带你了解下 Web3 是什么?与我们熟知的 Web1 和 Web2 又有什么区别呢?web3.0什么是...【详细内容】
2022-07-15  编程狮W3Cschool    Tags:Web3.0   点击:(2)  评论:(0)  加入收藏
1、让我们一起来看下吧,直接上图。 第一眼看到是不是觉得很高逼格,暗黑画风,这很大佬。其实它就是------AidLearning。一个运行在安卓平台的linux系统,而且还包含了许多非常强大...【详细内容】
2022-07-15  IT智能化专栏    Tags:AidLearning   点击:(2)  评论:(0)  加入收藏
真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天说的这个软件是一款基于Python+vue的自动化运维、完全开源的云管理平台。二、实现功能 基于RBAC权限系统 录像回放 ...【详细内容】
2022-07-14  菜鸟程序猿    Tags:Python   点击:(3)  评论:(0)  加入收藏
前言今天笔者想和大家来聊聊python接口自动化的MySQL数据连接,废话不多说咱们直接进入主题吧。 一、什么是 PyMySQL?PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,P...【详细内容】
2022-07-11  测试架构师百里    Tags:python   点击:(19)  评论:(0)  加入收藏
aiohttp什么是 aiohttp?一个异步的 HTTP 客户端\服务端框架,基于 asyncio 的异步模块。可用于实现异步爬虫,更快于 requests 的同步爬虫。安装pip install aiohttpaiohttp 和 r...【详细内容】
2022-07-11  VT漫步    Tags:aiohttp   点击:(15)  评论:(0)  加入收藏
今天我们学习下 Queue 的进阶用法。生产者消费者模型在并发编程中,比如爬虫,有的线程负责爬取数据,有的线程负责对爬取到的数据做处理(清洗、分类和入库)。假如他们是直接交互的,...【详细内容】
2022-07-06  VT漫步    Tags:Python Queue   点击:(34)  评论:(0)  加入收藏
继承:是面向对象编程最重要的特性之一,例如,我们每个人都从祖辈和父母那里继承了一些体貌特征,但每个人却又不同于父母,有自己独有的一些特性。在面向对象中被继承的类是父类或基...【详细内容】
2022-07-06  至尊小狸子    Tags:python   点击:(25)  评论:(0)  加入收藏
点击上方头像关注我,每周上午 09:00准时推送,每月不定期赠送技术书籍。本文1553字,阅读约需4分钟 Hi,大家好,我是CoCo。在上一篇Python自动化测试系列文章:Python自动化测试之P...【详细内容】
2022-07-05  CoCo的软件测试小栈    Tags:Python   点击:(27)  评论:(0)  加入收藏
第一种方式:res = requests.get(url, params=data, headers = headers)第二种方式:res = requests.get(url, data=data, headers = headers)注意:1.url格式入参只支持第一种方...【详细内容】
2022-07-05  独钓寒江雪之IT    Tags:Python request   点击:(19)  评论:(0)  加入收藏
什么是python类的多态python的多态,可以为不同的类实例,或者说不同的数据处理方式,提供统一的接口。用比喻的方式理解python类的多态比如,同一个苹果(统一的接口)在孩子的眼里(类实...【详细内容】
2022-07-04  写小说的程序员    Tags:python类   点击:(28)  评论:(0)  加入收藏
站内最新
站内热门
站内头条