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 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
python实现在windows下操作word的方法
Apr 28 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
python字符类型的一些方法小结
May 16 Python
python 转换 Javascript %u 字符串为python unicode的代码
Sep 06 Python
Python 操作MySQL详解及实例
Apr 30 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
Python如何使用字符打印照片
Jan 03 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 编写的 25个游戏脚本
2009/05/11 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
php获取字段名示例分享
2014/03/03 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
jquery实现用户打分评分特效
2015/05/28 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
2020/01/03 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
深圳-东方伟业笔试部分
2015/02/11 面试题
家长评语大全
2014/01/22 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
外国人来华邀请函
2015/01/31 职场文书
学校国庆节活动总结
2015/03/23 职场文书
电影雷锋观后感
2015/06/10 职场文书
听课评课活动心得体会
2016/01/15 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
Django如何与Ajax交互
2021/04/29 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
springboot layui hutool Excel导入的实现
2022/03/31 Java/Android