Python实现将照片变成卡通图片的方法【基于实现将照片变成卡通图片的方法【基于opencv】】
主要介绍了Python实现将照片变成卡通图片的方法,涉及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步:合并轮廓与彩色图片步:合并轮廓与彩色图片