Python实现将照片变成卡通图片的方法【基于opencv】


Posted in Python onJanuary 17, 2018

本文实例讲述了Python实现将照片变成卡通图片的方法。分享给大家供大家参考,具体如下:

之前的文章介绍了使用Photoshop将照片变成卡通图片,今次介绍用代码来实现这项任务,可以就此探查各种滤镜的内部机制。

制作环境:Windows10,Python2.7,Anaconda

任务描述:将D盘某文件夹中的所有图片使用代码进行卡通化,然后保存到另一文件夹中。

如前文所述,卡通化的关键是强化边缘与减少色彩,所以使用Photoshop进行卡通化的时候就使用了照亮边缘和干笔画的滤镜来处理。使用代码处理图片的时候也是在对边缘和色彩上做文章。以下使用OpenCV库来对照片处理,大致分为四步来完成。

1. 应用双边滤波器来减少图像的色彩
2. 将彩色图像转换为灰度,应用中值滤波器减少图像中的图像噪点
3. 使用自适应阈值处理灰度图像创建轮廓
4. 将来自步骤1的彩色图像与来自步骤3的轮廓叠加

第1步:减少图像色彩

因为双边滤波器平滑平坦区域同时能保持边缘清晰,所以很适合于将RGB图像转换为卡通。虽然速度好像慢一些一个技巧是重复(例如,通过num_bilateral = 7七次)应用小双边滤波器,而不是只用一次大双边滤波器。

import cv2
num_down = 2  # 缩减像素采样的数目
num_bilateral = 7 # 定义双边滤波的数目
img_rgb = cv2.imread("img_example.jpg")
# 用高斯金字塔降低取样
img_color = img_rgb
for _ in xrange(num_down):
 img_color = cv2.pyrDown(img_color)
# 重复使用小的双边滤波代替一个大的滤波
for _ in xrange(num_bilateral):
 img_color = cv2.bilateralFilter(img_color, d=9,
         sigmaColor=9,
         sigmaSpace=7)
# 升采样图片到原始大小
for _ in xrange(num_down):
 img_color = cv2.pyrUp(img_color)

cv2.bilateralFilter中的三个参数控制像素邻域的直径(d)和颜色空间中的滤波器的标准偏差(sigmaColor)以及坐标空间(sigmaSpace)。

第2步:转换为灰度,并使用中值滤波器减少噪点

OpenCV在边缘检测方面提供了多种选择,自适应阈值处理的优点是可以检测图像的每个小领域中最突出的特征,独立于图像的整体属性。

应用中值滤波器减少图像的色彩。将原始的彩色图片转换为灰度图片,接着应用中值模糊来减少灰度图像中的噪声。

# 转换为灰度并使其产生中等的模糊
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
img_blur = cv2.medianBlur(img_gray, 7)

第3步:创建轮廓

在降噪之后,就可以安全地应用自适应阈值来创建轮廓。 即使存在一些图像噪声,blockSize = 9的cv2.ADAPTIVE_THRESH_MEAN_C算法也会确保将阈值应用于9x9邻域的平均值减去C = 2。

# 检测到边缘并且增强其效果
img_edge = cv2.adaptiveThreshold(img_blur, 255,
         cv2.ADAPTIVE_THRESH_MEAN_C,
         cv2.THRESH_BINARY,
         blockSize=9,
         C=2)

第4步:合并轮廓与彩色图片

最后一步是将经处理的彩色图像(img_color)与边缘掩码(img_edge)组合。至此,一个可以卡通化图片的原始代码就写好了。图片效果有点理工的审美,不够文艺,效果上输给了Photoshop,但是在效率上扳回一城。

# 转换回彩色图像
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)
img_cartoon = cv2.bitwise_and(img_color, img_edge)
# 显示图片
cv2.imshow("cartoon", img_cartoon)

最后将上述代码封装成函数。导入python的os模块来方便文件处理。

# -*- coding: utf-8 -*-
import cv2
import os
def cartoonise(picture_name):
 imgInput_FileName = picture_name
 imgOutput_FileName = "D:\pythonpractice\CartoonImage\cartoon" + picture_name
 num_down = 2   #缩减像素采样的数目
 num_bilateral = 7 #定义双边滤波的数目
 img_rgb = cv2.imread(imgInput_FileName)  #读取图片
 #用高斯金字塔降低取样
 img_color = img_rgb
 for _ in xrange(num_down):
  img_color = cv2.pyrDown(img_color)
 #重复使用小的双边滤波代替一个大的滤波
 for _ in xrange(num_bilateral):
  img_color = cv2.bilateralFilter(img_color,d=9,sigmaColor=9,sigmaSpace=7)
 #升采样图片到原始大小
 for _ in xrange(num_down):
  img_color = cv2.pyrUp(img_color)
 #转换为灰度并且使其产生中等的模糊
 img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
 img_blur = cv2.medianBlur(img_gray, 7)
 #检测到边缘并且增强其效果
 img_edge = cv2.adaptiveThreshold(img_blur,255,
          cv2.ADAPTIVE_THRESH_MEAN_C,
          cv2.THRESH_BINARY,
          blockSize=9,
          C=2)
 #转换回彩色图像
 img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)
 img_cartoon = cv2.bitwise_and(img_color, img_edge)
 # 保存转换后的图片
 cv2.imwrite(imgOutput_FileName, img_cartoon)
ImageList = [] #建立空的List
#循环读取"D:\pythonpractice\Image"中的文件名
for filename in os.listdir(r"D:\pythonpractice\Image"):
 ImageList.append(filename)  #将文件名添加到ImageList
for i in ImageList: #循环读取ImageList中的文件名,将其进行卡通化处理
 print("正在卡通化" + i)
 cartoonise(i)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
python使用xlrd与xlwt对excel的读写和格式设定
Jan 21 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
Puppeteer使用示例详解
Jun 20 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
Nov 06 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
Python实现文件信息进行合并实例代码
Jan 17 #Python
python实现用户答题功能
Jan 17 #Python
python编程培训 python培训靠谱吗
Jan 17 #Python
Python温度转换实例分析
Jan 17 #Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
Jan 17 #Python
python+matplotlib绘制3D条形图实例代码
Jan 17 #Python
《Python学习手册》学习总结
Jan 17 #Python
You might like
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
kmock javascript 单元测试代码
2011/02/06 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
JavaScript中的object转换成number或string规则介绍
2014/12/31 Javascript
JavaScript获取页面上被选中文字的方法技巧
2015/03/13 Javascript
jQuery解决浏览器兼容性问题案例分析
2016/04/15 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
vue多次循环操作示例
2019/02/08 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python实现ATM系统
2020/02/17 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
十佳大学生村官事迹
2014/01/09 职场文书
助学贷款贫困证明
2014/09/23 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
中层干部考核评语
2015/01/04 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书