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

本文实例讲述了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数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

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

您可能感兴趣的文章:

  • 利用python爬取斗鱼app中照片方法实例
  • 用python找出那些被“标记”的照片
  • Python实现获取照片拍摄日期并重命名的方法
  • Python+Opencv识别两张相似图片
  • python通过opencv实现批量剪切图片
  • python使用opencv读取图片的实例
  • python结合opencv实现人脸检测与跟踪
  • python中使用OpenCV进行人脸检测的例子
  • python-opencv在有噪音的情况下提取图像的轮廓实例
  • python+opencv实现的简单人脸识别代码示例
  • OpenCV-Python实现轮廓检测实例分析
(0)

相关推荐

  • 用python找出那些被“标记”的照片

    源码传送门 环境准备 下面的两个第三方模块都可以直接通过pip快速安装,这里使用py36作为运行环境. python3.6 requests exifread 思路 遍历目录 拉取数据集合 遍历集合取得exif exif信息整理,并获取实体地址 拷贝文件到结果样本目录 生成json报告文件 基础知识 下面是现今相片中会存在与GPS相关的关键字,大牛亦可一比带过~ [参考] { "GPSVersionID": "GPS版本", "GPSLatitudeRef

  • OpenCV-Python实现轮廓检测实例分析

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV检测并绘制轮廓. 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍在OpenCV-Python中检测并绘制轮廓的方法. 本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识.笔者推荐清华大学出版社的<图像处理与计算机视觉算法及应用(第2版)>. 轮廓检测 轮廓检测也是图像处理中经常用到的.Ope

  • python通过opencv实现批量剪切图片

    上一篇文章中,我们介绍了python实现图片处理和特征提取详解,这里我们再来看看Python通过OpenCV实现批量剪切图片,具体如下. 做图像处理需要大批量的修改图片尺寸来做训练样本,为此本程序借助opencv来实现大批量的剪切图片. import cv2 import os def cutimage(dir,suffix): for root,dirs,files in os.walk(dir): for file in files: filepath = os.path.join(root

  • python使用opencv读取图片的实例

    安装好环境后,开始了第一个Hello word 例子,如何读取图片,保存图品 import cv2 import numpy as np import matplotlib.pyplot as plt #读取图片代码 img = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE) #IMREAD_COLOR = 1 #IMREAD_UNCHANGED = -1 #展示图片 cv2.imshow('image',img) cv2.waitKey(0) cv2.d

  • Python+Opencv识别两张相似图片

    在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简单几句就说清,所以本文只作基本算法的科普向. 看到一篇博客是介绍这个,但他用的是PIL中的Image实现的,感觉比较麻烦,于是利用Opencv库进行了更简洁化的实现. 相关背景 要识别两张相似图像,我们从感性上来谈是怎么样的一个过程?首先我们会区分这两张相片的类型,例如是风景照,还是人物照.风景照中

  • Python实现获取照片拍摄日期并重命名的方法

    本文实例讲述了Python实现获取照片拍摄日期并重命名的方法.分享给大家供大家参考,具体如下: python获取照片的拍摄日期并重命名.不支持重复处理的中断. 重命名为:拍摄日期__原文件名 import os import exifread def getExif(filename): FIELD = 'EXIF DateTimeOriginal' fd = open(filename, 'rb') tags = exifread.process_file(fd) fd.close() if

  • python-opencv在有噪音的情况下提取图像的轮廓实例

    对于一般的图像提取轮廓,介绍了一个很好的方法,但是对于有噪声的图像,并不能很好地捕获到目标物体. 比如对于我的鼠标,提取的轮廓效果并不好,因为噪声很多: 所以本文增加了去掉噪声的部分. 首先加载原始图像,并显示图像 img = cv2.imread("temp.jpg") #载入图像 h, w = img.shape[:2] #获取图像的高和宽 cv2.imshow("Origin", img) 然后进行低通滤波处理,进行降噪 blured = cv2.blur(i

  • 利用python爬取斗鱼app中照片方法实例

    前言 没想到python是如此强大,令人着迷,以前看见图片总是一张一张复制粘贴,现在好了,学会python就可以用程序将一张张图片,保存下来. 最近看到斗鱼里的照片都不错,决定用最新学习的python技术进行爬取,下面将实现的过程分享出来供大家参考,下面话不多说了,来一起看看详细的介绍吧. 方法如下: 首先下载一个斗鱼(不下载也可以,url都在这了对吧) 通过抓包,抓取到一个json的数据包,得到下面的地址 观察测试可知,通过修改offset值就是相当于app的翻页 访问这个url,返回得到的是

  • python结合opencv实现人脸检测与跟踪

    模式识别课上老师留了个实验,在VC++环境下利用OpenCV库编程实现人脸检测与跟踪. 然后就开始下载opencv和vs2012,再然后,配置了好几次还是配置不成功,这里不得不吐槽下微软,软件做这么大,这么难用真的好吗? 于是就尝试了一下使用python完成实验任务,大概过程就是这样子的: 首先,配置运行环境: 下载opencv和python的比较新的版本,推荐opencv2.4.X和python2.7.X. 直接去官网下载就ok了,python安装时一路next就行,下载的opencv.exe

  • python中使用OpenCV进行人脸检测的例子

    OpenCV的人脸检测功能在一般场合还是不错的.而ubuntu正好提供了python-opencv这个包,用它可以方便地实现人脸检测的代码. 写代码之前应该先安装python-opencv: 复制代码 代码如下: $ sudo apt-get install python-opencv 具体原理就不多说了,可以参考一下这篇文章.直接上源码. 复制代码 代码如下: #!/usr/bin/python# -*- coding: UTF-8 -*- # face_detect.py # Face De

  • python+opencv实现的简单人脸识别代码示例

    # 源码如下: #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv def detect_object(image): '''检测图片,获取人脸在图片中的坐标''' grayscale = cv.CreateImage((image.width, image.height), 8, 1) cv.CvtColor(image, grayscale, cv.CV_BGR2GR

随机推荐