众所周知,最近大热的蔡徐坤蔡老师是一位非常全能的老师,喜欢唱、跳、Rap、篮球,但其实他还会用OpenCV!今天就让我们跟着蔡老师一起用OpenCV实现素描效果吧!

OpenCV素描效果https://www.zhihu.com/video/1101816705877209088

1. 安装Python版OpenCV

首先我们装上Python版本的OpenCV,在命令行/终端输入

pip install opencv-python

如果是已经自带Python2.7的系统(Mac等)记得加上3:

pip3 install opencv-python

2. 读取图片并显示

首先截取视频中的一帧图像保存为cxk.jpg,放在代码同一目录下面。

接下来就让我们新建一个Python文件开始写吧!

首先导入OpenCV模块:

import 

接下来读取并显示cxk.jpg图片

import 

当你运行这段代码后就会弹出一个窗口显示这张图片啦,如下:

稍微解释一下上面的代码,我们利用cv2.imread('cxk.jpg')读取了这张图片,保存到img_origin这个变量里面。

接下来用cv2.imshow('origin', img_origin)将这张照片通过一个窗口显示出来,并且这个窗口的名称叫做origin。

然后我们用cv2.waitKey(0)来等待用户的按键操作,waitKey(n)里的n表示等待多少毫秒的时间,超过这个时间程序就会继续运行下去。我们把它设为0表示无限等待下去,也就是只要用户没有在这个窗口内按下任何按键,程序就会一直停在这里。

最后,当用户按下任意按键,程序执行cv2.destroyAllWindows(),把窗口都关掉,程序结束。

OK!我们继续!

3. 彩色图片转成灰度图

接下来我们要把彩色图片转换成灰度图:

import 

没错,将彩色RGB图片转换成灰度图用

cv2.cvtColor(img_origin, cv2.COLOR_RGB2GRAY)

就可以啦。但是要注意这里我们用的是cv2.COLOR_RGB2GRAY,对于一些老版本的OpenCV或者其他模块可能还是采用BGR的通道顺序,也就是cv2.COLOR_BGR2GRAY,这里如果出问题了记得看看是不是彩色通道顺序问题。

上面这段代码执行后我们就多了一个窗口,里面显示的是灰色的蔡老师:

4. 对灰度图进行高斯模糊

接下来让我们对这张灰度图进行高斯模糊:

import 

在这里,我们用

cv2.GaussianBlur(img_gray, (5, 5), 0)

完成了图像的高斯模糊,那么模糊效果是如何实现的呢?其实很简单,我们从最简单的模糊效果说起,假设图片中有一块区域如下:

我们要对中间5这个像素进行模糊,最简单的方式就是直接和周围八个像素一起取平均值嘛!中间值=(8*1+5)/9=1.44444……

高斯模糊也是类似,只不过不是简单的取平均值,而是通过高斯函数计算对应的数值,有兴趣的同学可以去了解,这里不多讲啦。

那么我们在

cv2.GaussianBlur(img_gray, (5, 5), 0)

使用的(5,5)参数就表示高斯核的尺寸,这个核尺寸越大图像越模糊。但是记住尺寸得是奇数!这是为了保证中心位置是一个像素而不是四个像素。

4*4
3*3

这样我们就得到一个模糊的蔡老师:

5. 图像二值化

接下来到关键的一步啦!让我们对这张模糊过的图片进行二值化:

import 

二值化的概念其实很简单,就是对一张图片上的点,像素值大于等于某个值的都直接设为最大值,小于这个值的都直接设为最小值,这样这张图片上每个点都只可能是最大值或最小值其中之一了,其中我们比较的这个数值就是阈值。

当然如果对整张图片都规定同一个阈值,可能会出现下图右上的效果,因为实际图片还有阴影之类的问题会影响,这样就出现了自适应二值化的方法,如下图下排两张图。

在代码中我们用cv2.adaptiveThreshold()来实现这种自适应二值化方法。其中参数255表示我们二值化后图像的最大值,cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示我们采用的自适应方法,cv2.THRESH_BINARY表示我们是将大于阈值的像素点的值变成最大值,反之这里如果使用cv2.THRESH_BINARY_INV表示我们是将大于阈值的像素点的值变成0,倒数第二个参数5表示我们用多大尺寸的区块来计算阈值,倒数第一个参数2表示计算周边像素点均值时待减去的常数C。

运行后就可以得到一个二值化的蔡老师:

6.再次对二值化图像进行模糊

由于采用了自适应二值化的方法,原本深色衣服的地方也自适应地变成了白色,实现了一个简单描边效果。现在我们已经初步实现了素描效果,但是还不够,让我们继续完善一下,让边线更宽,噪点更少一些。

import 

和刚才一样我们用cv2.GaussianBlur()完成了高斯模糊,这样我们就可以得到一个模糊的描边蔡老师:

7.再次进行二值化

接下来我们对这张图片再次进行二值化:

import 

和刚才不一样的是,由于这张图片已经比较干净没有什么阴影,我们直接采用最简单的二值化方法

cv2.threshold(img_threshold1_blurred, 200, 255, cv2.THRESH_BINARY)。其中200表示将图片中像素值为200以上的点都变成255,255就是白色。这样我们就能得到一个边线更宽的二值化效果:

8.图像开运算

下面让我们去掉图片中一些细小的噪点,这种效果可以通过图像的开运算来实现:

import 

要理解图像的开运算就要知道图像的腐蚀和膨胀,所谓的图像腐蚀就是如下的操作,类似于把一个胖子缩小一圈变瘦的感觉:

图片来源:https://homepages.inf.ed.ac.uk/rbf/HIPR2/erode.htm

图像膨胀就是腐蚀的反向操作,把图像中的区块变大一圈,把瘦子变成胖子。

因此当我们对一个图像先腐蚀再膨胀的时候,一些小的区块就会由于腐蚀而消失,再膨胀回来的时候大块区域的边线的宽度没有发生变化,这样就起到了消除小的噪点的效果。图像先腐蚀再膨胀的操作就叫做开运算。

回到我们的代码,首先开运算要有一个运算的核,我们通过:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))

可以得到一个3*3的核。

然后通过

cv2.morphologyEx(cv2.bitwise_not(img_threshold2), cv2.MORPH_OPEN, kernel)

来进行图像的开运算。

这里需要注意的是我们没有直接对img_threshold2进行开运算,而是对cv2.bitwise_not(img_threshold2)进行运算,那么cv2.bitwise_not(img_threshold2)又是干啥的呢?

cv2.bitwise_not()其实就是对图像进行一个简单的操作,原来是0的像素点变成最大值,原来是最大值的像素点变成0。相当于黑色的地方变成白色,白色的地方变成黑色。

那么为什么我们要把图像反色一下再进行开运算呢?首先要知道图像中一般0表示黑色,255表示白色,我们看到的大片的白色底少部分黑色线其实从数值上来看是图片大部分地方是255少部分地方是0。但是开运算的操作是对有数值的地方进行缩小,这样就必须先将图片反色一下,使得大部分地方是0而少部分线的地方是255,然后再进行开运算就能得到正确的结果了。

这样我们就得到一个更少噪点蔡老师啦:

9.第三次对图像进行高斯模糊

接下来我们对这张二值化的图像再简单进行高斯模糊,让图片更接近素描的效果。

import 

这样下来我们就可以实现对一张彩色图片转换成素描的效果啦:

10.读取并处理视频中的图像

搞定了单张图片,对视频进行处理就非常简单了,只需要将视频里每一帧都做同样的处理再输出即可。

首先在开头位置加上读取视频的语句:

cap 

然后创建一个while循环,将图像处理的语句都放进去:

while 

其中,cap.read()用来读取视频每一帧的数据,每一次调用就读取一帧图像,当读取到的frame是None时就说明视频结束,可以直接退出while循环。

在while循环的最后我们用cv2.waitKey(40) & 0xFF == ord('q')来判断用户有没有按下键盘上的q键,如果按下了就直接退出while循环。

而cv2.waitKey(40)中我们填40表示等待40毫秒,也就相当于每两张图片之间间隔40毫秒,即25帧/秒。

最后,完整的代码如下:

import 

那么,今天的蔡老师小课堂就到这里了,各位小朋友你们学会了吗?


我是毕老师,依然不会定时给你们分享一些有趣好玩实用的东西,欢迎关注~

警察蜀黍!就是这个人!脑子简直有泡!还不赶紧关注一下!

cvtcolor python opencv_蔡徐坤教你用OpenCV实现素描效果相关推荐

  1. 蔡徐坤教你用OpenCV实现素描效果

    跟着知乎的文章做的,但最后的视频保存部分没有运行成功,试了好久都没成功,有知道错误的麻烦指点一下,谢谢! 蔡徐坤教你用OpenCV实现素描效果 - Maker毕的文章 - 知乎 import cv2 ...

  2. python篮球-用Python把蔡徐坤打篮球视频转换成字符动画!

    原标题:用Python把蔡徐坤打篮球视频转换成字符动画! 说到现在网络最火的梗,非"蔡徐坤打篮球"莫属.最近,蔡徐坤当仁不让地成为了娱乐圈被黑的最惨的明星. 自从2019年1月份, ...

  3. python动画篮球大小_用Python把蔡徐坤打篮球视频转换成字符动画!

    说到现在网络最火的梗,非"蔡徐坤打篮球"莫属.最近,蔡徐坤当仁不让地成为了娱乐圈被黑的最惨的明星. 自从2019年1月份,蔡徐坤成为了NBA官方形象代言人之后,他打篮球的视频片段被 ...

  4. Python 让蔡徐坤在我的命令行里打篮球!| 技术头条

    作者 | 雇个城管打天下 责编 | 伍杏玲 本文经授权转载自01二进制(ID:gh_d1999add1857) [CSDN 编者按]作者自称是一个经常逛 B 站的肥宅.最近 B 站上流行的视频素材除了 ...

  5. 用Python让蔡徐坤在我的命令行里打篮球!|附完整代码

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 来源 | 01二进制(ID:gh_d1999add1857) 编辑 | Jane [导语]作者自称是一个 ...

  6. python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 来源 | 01二进制(ID:gh_d1999add1857) 编辑 | Jane [导语]作者自称是一个 ...

  7. 用Python让蔡徐坤在我的命令行里打篮球!| 附完整代码

    作者自称是一个经常逛 B 站的肥宅.最近B站上流行的视频素材除了"换脸",其次就要属"蔡xx打球"视频了.有模仿的.对比的.手绘的... ...更过分的是,竟然 ...

  8. 用Python让蔡徐坤在我的命令行里打篮球~技术流追星!

    「2019 Python开发者日」倒计时三天,请扫码咨询 ↑↑↑ 作者 | 雇个城管打天下,理工男一枚.南京大学软件工程系硕士,一个还在做着拥有十万读者梦的互联网新人,或许一篇文章无法获得你的关注,但 ...

  9. Python 让蔡徐坤在我的命令行里打篮球!

    既然要开始做东西,首要的问题就是想好要怎么做,大家都知道视频是由一系列图片一帧一帧组成的,因此视频转字符动画最基本的便是图片转字符画. 在这里简单的说一下图片转字符画的原理:首先将图片转为灰度图,每个 ...

最新文章

  1. redis 大数据插入
  2. Qt 实现数据协议控制--组帧、组包、解析帧、解析包
  3. Oracle EM 配置常用命令
  4. [No0000142]Outlook通过添加签名 自动添加邮件模板
  5. 线上日志分析与其他一些脚本
  6. 关于shared_from_this的转换
  7. 计组之数据运算:3、定点数、浮点数
  8. BZOJ 3884 上帝与集合的正确用法
  9. semaphore性能问题_SQL Server性能调整– RESOURCE_SEMAPHORE等待
  10. python读取txt矩阵数据(转换为excel格式利用pandas读取)
  11. intouch写数据到MySQL_如何将intouch数据插入到SQL数据库
  12. cad计算机绘图等级考试,国家CAD等级考试介绍完整版.doc
  13. Flash Player不支持火狐_谷歌浏览器
  14. GPS卫星星历与历书
  15. Xcode可以清理哪些缓存?
  16. excel矩阵小tips
  17. leetcode 每天10道travl
  18. 光纤布线技术风暴——第一站:杭州
  19. 网络协议TCPIP、IPXSPX、NETBEUI简介
  20. 利用bootstrap写的后台管理系统主页模板

热门文章

  1. 奈奎斯特采样定理_通俗理解奈奎斯特带宽
  2. 算法与数据结构_数据结构与算法专题--算法基本概念
  3. 南京信息工程大学c语言真题,南京信息工程大学C语言试题库.doc
  4. Java黑皮书课后题第5章:**5.19(打印金字塔形的数字)编写一个嵌套的for循环,打印下面的输出
  5. Java黑皮书课后题第3章:*3.1(代数:解一元二次方程)可以使用下面的公式求一元二次方程ax2+bx+c=0,编写程序提示用户输入a b c的值,并显示基于判断式的结果
  6. 日常如何维护计算机,日常使用中,我们如何维护电脑?
  7. OpenGL 光照方程的计算
  8. Linux下使用NTFS格式移动硬盘
  9. saltstack批量加用户脚本
  10. 网络基础知识-TCP/IP协议各层详解