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常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
Python中对元组和列表按条件进行排序的方法示例
Nov 10 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
python在每个字符后添加空格的实例
May 07 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
django2.0扩展用户字段示例
Feb 13 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
Python socket 套接字实现通信详解
Aug 27 Python
关于Python 常用获取元素 Driver 总结
Nov 24 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 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
一个查看session内容的函数
2006/10/09 PHP
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
Python中用format函数格式化字符串的用法
2015/04/08 Python
python基础教程之五种数据类型详解
2017/01/12 Python
python中map()函数的使用方法示例
2017/09/29 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
银行实习的自我鉴定
2013/12/10 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
职工趣味运动会方案
2014/02/10 职场文书
集体婚礼策划方案
2014/02/22 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
应用外语系自荐信
2014/06/26 职场文书
学校四风对照检查材料
2014/08/28 职场文书
职工年度考核评语
2014/12/31 职场文书
银行员工考核评语
2014/12/31 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
Fluentd搭建日志收集服务
2022/09/23 Servers