原文链接:http://www.juzicode.com/python-funny-opencv-cartoon-profile-photo/

hello,大家好,我是桔子菌。

桔子菌前面发布了一些OpenCV方面的教程文章,稍显枯燥乏味了些,今天我们用OpenCV做个好玩的东东,看看怎么将普通的照片变成卡通化一些。

我们先来观察下卡通图像的特点,再根据卡通图像的特点从普通图像反推处理过程。

上图是一张典型的卡通人物头像,从图像可以看到人脸的轮廓非常分明,脸颊、下巴等和背景、头发区分明显,但是人脸内部则颜色比较均匀一致,转换成图像处理的行话就是边界明显、内部平滑。

所以拿到一张图像首先是要做边缘检测找到边界,然后就是平滑处理,最后将二者结合,下面介绍下具体的处理过程。

如果没有安装过OpenCV第三方库,先用pip命令进行安装:

pip install opencv-python

首先是一些预处理,从文件中获取图像,然后对图片做缩放,图像高度统一缩放到一定的高度值,宽度则做同比例缩放。

    #读取图片img_raw = cv2.imread(fn_raw)     #缩放图片HEIGHT_MAX = 500height,width,_ = img_raw.shaperation = HEIGHT_MAX/heightwidth = int(width * ration)height = HEIGHT_MAXimg_resize = cv2.resize(img_raw,(width,height))   

然后转换成灰度图,做一次中值滤波(平滑),去除掉一些噪声,避免边界点太多,为接下来的边缘检测做准备。

    #灰度图img_gray = cv2.cvtColor(img_resize,cv2.COLOR_BGR2GRAY)#去噪img_blur = cv2.medianBlur(img_gray,5)cv2.imshow('img_blur',img_blur)

接下来就是找边界,我们可以用Canny,Laplacian、Sobel等方法,这里尝试下各种不同的边缘检测算法最后对比下效果如何。

    #边缘检测if edge == 'Laplacian':img_edge = cv2.Laplacian(img_blur,cv2.CV_8U,ksize=5)elif edge == 'Scharr':img_edge1=cv2.Scharr(img_gray,cv2.CV_8U,1,0,1,0)img_edge2=cv2.Scharr(img_gray,cv2.CV_8U,0,1,1,0)img_edge = cv2.add(img_edge1,img_edge2)elif edge == 'Sobel':img_edge1=cv2.Sobel(img_gray,cv2.CV_8U,1,0,ksize=3)img_edge2=cv2.Sobel(img_gray,cv2.CV_8U,0,1,ksize=3) img_edge = cv2.add(img_edge1,img_edge2)        else:img_edge = cv2.Canny(img_blur,80,160,apertureSize=3)cv2.imshow('img_edge',img_edge)

再将找到的边界做二值化,再转换为彩色图像暂存,转换为彩色图像是因为后面进行与操作时需要保证和原图通道数一致,如果原图是单通道的,这里就没有必要做色彩空间转换。

    #计算mask_,img_mask= cv2.threshold(img_edge,100,255,cv2.THRESH_BINARY_INV)img_mask = cv2.cvtColor(img_mask,cv2.COLOR_GRAY2BGR)cv2.imshow('img_mask',img_mask)

然后就是对图像做平滑处理,这里用到了双边平滑算法,并且连续做了多次,也可以实验测试下medianBlur等其他的平滑算法。

    #平滑处理img_cartoon = img_resizefor x in range(11):ksize,sigma_color,sigma_space = 21,11,11img_cartoon = cv2.bilateralFilter(img_cartoon,ksize,sigma_color,sigma_space)

接下来就是将平滑后的图像和前面得到的边缘进行与操作,凸显出边界来,得到最后的卡通图像:

    #掩码    img_cartoon = cv2.bitwise_and(img_cartoon,img_mask)cv2.imshow('cartoon-'+edge,img_cartoon)

下面是原图和Laplacian、Sobel、Canny等几种不同边缘检测算法的对比:

完整的代码如下:

import cv2
import os,sys,timedef cartoon(fn_raw,edge='Canny'):#读取图片img_raw = cv2.imread(fn_raw)     #缩放图片HEIGHT_MAX = 500height,width,_ = img_raw.shaperation = HEIGHT_MAX/heightwidth = int(width * ration)height = HEIGHT_MAXprint('width,height:',width,height)img_resize = cv2.resize(img_raw,(width,height))   cv2.imshow('img_resize',img_resize)#灰度图img_gray = cv2.cvtColor(img_resize,cv2.COLOR_BGR2GRAY)#去噪img_blur = cv2.medianBlur(img_gray,5)#img_blur = cv2.blur(img_gray,(5,5))cv2.imshow('img_blur',img_blur)#边缘检测if edge == 'Laplacian':img_edge = cv2.Laplacian(img_blur,cv2.CV_8U,ksize=5)elif edge == 'Scharr':img_edge1=cv2.Scharr(img_gray,cv2.CV_8U,1,0,1,0)img_edge2=cv2.Scharr(img_gray,cv2.CV_8U,0,1,1,0)img_edge = cv2.add(img_edge1,img_edge2)elif edge == 'Sobel':img_edge1=cv2.Sobel(img_gray,cv2.CV_8U,1,0,ksize=3)img_edge2=cv2.Sobel(img_gray,cv2.CV_8U,0,1,ksize=3) img_edge = cv2.add(img_edge1,img_edge2)        else: #Cannyimg_edge = cv2.Canny(img_blur,80,160,apertureSize=3)cv2.imshow('img_edge',img_edge)#计算mask_,img_mask= cv2.threshold(img_edge,100,255,cv2.THRESH_BINARY_INV)img_mask = cv2.cvtColor(img_mask,cv2.COLOR_GRAY2BGR)cv2.imshow('img_mask',img_mask)#平滑处理img_cartoon = img_resizeprint('img_cartoon.shape:',img_cartoon.shape)for x in range(11):ksize,sigma_color,sigma_space = 21,11,11img_cartoon = cv2.bilateralFilter(img_cartoon,ksize,sigma_color,sigma_space)#cv2.imshow('cartoon-temp',img_cartoon)#cv2.waitKey(100)#掩码img_cartoon = cv2.bitwise_and(img_cartoon,img_mask)cv2.imshow('cartoon-'+edge,img_cartoon)cv2.imwrite("cartoon-" + fn_raw , img_cartoon)cv2.waitKey()cv2.destroyAllWindows()if __name__ == '__main__':cartoon('lvyi11.jpg',edge='Canny')

总结起来整个处理过程如下:

step1:原图转换为灰度图像,利用边缘检测算法得到图像的边缘,二值化后得到一张掩码图;
step2:用双边滤波器多次处理原图得到平滑后的图像,图像看起来更“丝滑”;
step3:将step1得到的掩码图作用到step2得到的平滑图像上得到了卡通化图像

参考:https://github.com/MasteringOpenCV/code/

论如何把自己变成卡通人物(OpenCV制作卡通化头像)相关推荐

  1. [python ][opencv][图片卡通化]

    按顺序:               处理后的图片                待处理图片                源文件 下面是代码: import os import cv2def car ...

  2. 追忆童年,教你用Python画出儿时卡通人物

    作者 | 张同学 来源 | 凹凸数据 大家好,我是张同学. 又到一年一度的国际儿童节,作为逢节必过的程序猿,怎么可以放过这个学习技能的机会呢? 于是,今天我们来学习 Python 的 Turtle 库 ...

  3. python画卡通人物_追忆童年,教你用Python画出儿时卡通人物

    作者 | 张同学 来源 | 凹凸数据 大家好,我是张同学. 又到一年一度的国际儿童节,作为逢节必过的程序猿,怎么可以放过这个学习技能的机会呢? 于是,今天我们来学习 Python 的 Turtle 库 ...

  4. HTML打造动漫人物,19个搭配很酷的卡通人物网站设计欣赏

    19个搭配很酷的卡通人物网站设计欣赏 11月 6, 2014 评论 Sponsor 使用插画.卡通人物这些设计元素来搭配网站是很不错的idea,因为他很容易让用户记住你的网站,特别是绘制有趣的卡通人物 ...

  5. php 照片变成卡通照片,怎么把照片做成q版卡通 照片变q版卡通人物 q版卡通头像制作...

    想要把自己的头像变成真人q版卡通漫画,偷偷问了一个漫画家怎么制作的,他说用电脑手绘,得有画画基础才行,小编这下子就打了退堂鼓了,照片制作视频容易,但是自己画画太难了.有什么比较容易方法把照片做成q版卡 ...

  6. 计算机图形学实验——二维卡通人物交互

    计算机图形学实验1.2卡通人物交互 OpenGL卡通人物交互 基础"图元"绘制 OpenGL拾取物体 反走样 略提反走样问题 OpenGL实现二维反走样 放缩.旋转和拖动 小结 O ...

  7. 如何在博客园首页设置卡通人物

    第一步:点击管理 第二步:点击设置,然后添加代码,保存 在本页面,找到博客侧边栏公告(支持HTML代码)(支持JS代码) <!DOCTYPE html> <html lang=&qu ...

  8. Hexo博客添加live2d卡通人物

    实现效果 先看一下实现效果,右下角的小可爱就是添加的live2d卡通人物,而且她还会眨眼睛,头会随着鼠标的移动而转动 1.安装hexo-helper-live2d $ npm install --sa ...

  9. 《Turtle绘图》Python用Turtle库绘制多啦爱梦、小猪佩奇、皮卡丘等卡通人物

    声明 本文仅在CSDN发布,未经允许请勿转载或引用! 本文链接:https://blog.csdn.net/meenr/article/details/107245170 目录 利用Turtle库绘制 ...

最新文章

  1. power python_在 Power BI Desktop 中运行 Python 脚本
  2. this、new、模式工厂、创建新的构造函数
  3. 23种设计模式C++源码与UML实现--工厂模式
  4. 计算机网络原理第一章习题3-24 3-25
  5. Ubuntu18.04没有WiFi怎么解决(图文详解)
  6. 学习一些和redux一样作用的mobx知识
  7. blender风格化草地
  8. 修复被osx86破坏的网卡
  9. 蓝桥ROS机器人之v-rep_pro_edu_v3_6_2
  10. 全网无损音乐免费下载!
  11. python debug配置launch.json例子
  12. 【萌新教学】ESP8266项目初试网页聊天室(附源码)
  13. 朝花夕拾——动态规划
  14. 视频剪辑技巧,给每个视频添加不同背景图
  15. 解决谷歌浏览器form表单自动填充
  16. 播放音乐的开始暂停用一张图片
  17. python列表题目_Python列表练习题
  18. 微信公众平台第三方平台全网发布 java
  19. amd运行android studio,彻底解决AMD 无法运行android studio原生模拟器
  20. 球的半径和体积:输入球的中心点和球上某一点的坐标,计算球的半径和体积

热门文章

  1. Mysql解决微信特殊符号昵称入库报错乱码
  2. 【数据结构】稀疏数组
  3. 企业如何提高客户转化率、复购率?用快鲸scrm效果突出
  4. Go初始化变量的招式
  5. Linux 短链timeout状态,Linux命令——timeout
  6. zk选举机制和分布式一致性原理
  7. 青春不是用来抱怨,而是用来奋斗的
  8. 为什么需要工作流调度系统?
  9. PHP语法基础篇——除法取整和取余数
  10. 【总结整理】产品经理技术