OpenCV图片漫画效果的实现示例


Posted in Python onAugust 18, 2020

我们随手拍摄的照片,很难达到摄影师的水准,因此不管是手机上还是电脑内,都有一些软件可以添加特效让照片更好看,手机拍摄时也有即时的美化效果。不过我比较好奇漫画特效,但是一直在网上看到别人的成品而找不到针对性的软件,因此只有自己实现一下,虽然跟专业的还有差距,但效果还不错。

本次使用 OpenCV,采用 Python 实现。

对比现实中的画画,一般是先画出边缘轮廓使整体规划好,再填充颜色使其完整,因此在这里我们也采用这种方式。不过对图片直接操作与从零开始着笔不一样,要将原始图片进行两次不同的处理,再将处理后的两个图片叠加。

边缘轮廓

漫画中不管是人物还是风景,刻画的细节有限,因此需要把重要以及有特色的部分体现出来,数量要适当。

轮廓通过四步操作:

import cv2

img = cv2.imread("example.jpg")
img_copy = img

# 灰度处理
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 平滑操作,去除噪声
img_blur = cv2.medianBlur(img_gray, 5)
# 通过阈值提取轮廓
img_edge = cv2.adaptiveThreshold(img_blur,
                 255,
                 cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                 cv2.THRESH_BINARY,
                 blockSize=9,
                 C=3)
# 将灰度图片变成 3 通道,用于后续合并
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2BGR)

这里通过二值化的方式将轮廓提取出来,采用自适应阈值二值化函数,基于像素周围的小区域确定像素的阈值,可以将有区别的部分的界限提取出来,恰如漫画对象中黑色粗体轮廓,且细节得当。因阈值处理只能针对灰度图像,因此需要先将彩色图像转换为单通道的灰度图像,且为了去除描绘对象内部的冗余细节,还要对图像进行平滑处理,使颜色过度得缓慢一些,毕竟漫画中颜色的应用没有现实生活中那么复杂,这样得出的轮廓就比较好。

看一下效果:

OpenCV图片漫画效果的实现示例

对比原图:

OpenCV图片漫画效果的实现示例

将两个重要的方法介绍一下:

中值滤波:cv2.medianBlur(img, ksize)
主要是后面的参数,代表内核区域的边长,必须是大于1的奇数,如3、5、7……方法提取内核区域下所有像素的中值,并将中心元素替换为该中值

自适应阈值二值化:cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • dst: 输出图
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • thresh_type: 阈值的计算方法,包含以下2种类型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
  • type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
  • Block Size: 图片中分块的大小
  • C :阈值计算方法中的常数项

颜色填充

边缘轮廓已经描绘好了,再添加颜料后就完整了。这里就比较简单了,只需要将原图片的颜色细致度降低些就行了。

代码如下:

for _ in range(2)
	# 降低分辨率
  img_copy = cv2.pyrDown(img_copy)
for _ in range(5):
	# 图像平滑,保留边缘
  img_copy = cv2.bilateralFilter(img_copy, d=9, sigmaColor=9, sigmaSpace=7)
img_copy = cv2.resize(img_copy, (img.shape[1], img.shape[0]),
            interpolation=cv2.INTER_CUBIC)

颜色要比较平滑,不能像现实生活中这么细致,先采用图像金字塔将分辨率降低,并采用双边滤波去除噪声,可以平滑平面区域,同时保持边缘清晰。分辨率降低后图像会变小,因此最后要将图像放大为原来的大小,虽然图像金字塔有专门的方法可以将图像放大,但是尺寸可能会有一两点变化,合并过程中要两个图像完全一样大,所以这里直接按尺寸放大。

看一下效果:

OpenCV图片漫画效果的实现示例

将两个重要的方法介绍一下:

分辨率降低:cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)
一般只需要输入图像就行了,它会直接将图像长宽减半

双边滤波:cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

  • src:输入图像
  • d:过滤时周围每个像素领域的直径
  • sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。
  • sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。

合并

img_cartoon = cv2.bitwise_and(img_copy, img_edge)
cv2.imshow("cartoon", img_cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.bitwise_and() 是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作:1&1=1,1&0=0,0&1=0,0&0=0

最后结果:

OpenCV图片漫画效果的实现示例

到此这篇关于OpenCV图片漫画效果的实现示例的文章就介绍到这了,更多相关OpenCV 图片漫画内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python中使用语句导入模块或包的机制研究
Mar 30 Python
Python赋值语句后逗号的作用分析
Jun 08 Python
Python导入oracle数据的方法
Jul 10 Python
详解supervisor使用教程
Nov 21 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
Python CVXOPT模块安装及使用解析
Aug 01 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
如何使用 Flask 做一个评论系统
Nov 27 Python
Django DRF APIView源码运行流程详解
Aug 17 #Python
Django CBV模型源码运行流程详解
Aug 17 #Python
无惧面试,带你搞懂python 装饰器
Aug 17 #Python
Python Request类源码实现方法及原理解析
Aug 17 #Python
浅谈Python 钉钉报警必备知识系统讲解
Aug 17 #Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 #Python
Django DRF认证组件流程实现原理详解
Aug 17 #Python
You might like
php 保留小数点
2009/04/21 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
Javascript this 的一些学习总结
2012/08/31 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
2016/09/23 Javascript
Angularjs自定义指令实现三级联动 选择地理位置
2017/02/13 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
举例详解Python中yield生成器的用法
2015/08/05 Python
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
python读取LMDB中图像的方法
2018/07/02 Python
解决pycharm运行时interpreter为空的问题
2018/10/29 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
通过代码实例了解Python sys模块
2020/09/14 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
戴森英国官网:Dyson英国
2019/05/07 全球购物
艾滋病宣传标语
2014/06/25 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android