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


Posted in Python onAugust 30, 2017

对于一般的图像提取轮廓,介绍了一个很好的方法,但是对于有噪声的图像,并不能很好地捕获到目标物体。

比如对于我的鼠标,提取的轮廓效果并不好,因为噪声很多:

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

所以本文增加了去掉噪声的部分。

首先加载原始图像,并显示图像

img = cv2.imread("temp.jpg")    #载入图像
h, w = img.shape[:2]      #获取图像的高和宽 
cv2.imshow("Origin", img)

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

然后进行低通滤波处理,进行降噪

blured = cv2.blur(img,(5,5))    #进行滤波去掉噪声
cv2.imshow("Blur", blured)     #显示低通滤波后的图像

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

使用floodfill来去掉目标周围的背景,泛洪填充类始于ps的魔棒工具,这里用来清除背景。

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

然后转换成灰度图

gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY) 
cv2.imshow("gray", gray)

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

此时目标图像周围有写不光滑,还有一些噪声,因此进行开闭运算,得到比较光滑的目标

#定义结构元素 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
#开闭运算,先开运算去除背景噪声,再继续闭运算填充目标内的孔洞
opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel) 
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel) 
cv2.imshow("closed", closed)

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

接着转换成二值图以便于获取图像的轮廓

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

最后进行轮廓提取,抓取到目标

#找到轮廓
_,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
#绘制轮廓
cv2.drawContours(img,contours,-1,(0,0,255),3) 
#绘制结果
cv2.imshow("result", img)

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

全部代码如下

#coding=utf-8 
import cv2 
import numpy as np

img = cv2.imread("temp.jpg")    #载入图像
h, w = img.shape[:2]      #获取图像的高和宽 
cv2.imshow("Origin", img)     #显示原始图像

blured = cv2.blur(img,(5,5))    #进行滤波去掉噪声
cv2.imshow("Blur", blured)     #显示低通滤波后的图像

mask = np.zeros((h+2, w+2), np.uint8)  #掩码长和宽都比输入图像多两个像素点,满水填充不会超出掩码的非零边缘 
#进行泛洪填充
cv2.floodFill(blured, mask, (w-1,h-1), (255,255,255), (2,2,2),(3,3,3),8)
cv2.imshow("floodfill", blured) 

#得到灰度图
gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY) 
cv2.imshow("gray", gray) 


#定义结构元素 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
#开闭运算,先开运算去除背景噪声,再继续闭运算填充目标内的孔洞
opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel) 
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel) 
cv2.imshow("closed", closed) 

#求二值图
ret, binary = cv2.threshold(closed,250,255,cv2.THRESH_BINARY) 
cv2.imshow("binary", binary) 

#找到轮廓
_,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
#绘制轮廓

cv2.drawContours(img,contours,-1,(0,0,255),3) 
#绘制结果
cv2.imshow("result", img)

cv2.waitKey(0) 
cv2.destroyAllWindows()

以上这篇python-opencv在有噪音的情况下提取图像的轮廓实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
解决Python requests 报错方法集锦
Mar 19 Python
python基于twisted框架编写简单聊天室
Jan 02 Python
selenium+python实现自动登录脚本
Apr 22 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
python清除函数占用的内存方法
Jun 25 Python
Linux下多个Python版本安装教程
Aug 15 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
浅析python函数式编程
Sep 26 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 Python
关于python的list相关知识(推荐)
Aug 30 #Python
Python编程实现正则删除命令功能
Aug 30 #Python
Python删除Java源文件中全部注释的实现方法
Aug 30 #Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
Aug 30 #Python
Python基于正则表达式实现文件内容替换的方法
Aug 30 #Python
Python导入模块时遇到的错误分析
Aug 30 #Python
简单学习Python多进程Multiprocessing
Aug 29 #Python
You might like
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
php实现无限级分类查询(递归、非递归)
2016/03/10 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
php的扩展写法总结
2019/05/14 PHP
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
[59:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第二局
2016/03/04 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
浅谈Python中的数据类型
2015/05/05 Python
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
Python做简单的字符串匹配详解
2017/03/21 Python
Python字符串处理实现单词反转
2017/06/14 Python
python实现数据库跨服务器迁移
2018/04/12 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
python requests库的使用
2021/01/06 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
python中if嵌套命令实例讲解
2021/02/25 Python
How to spawning asynchronous work in J2EE
2016/08/29 面试题
初中生考试作弊检讨书
2014/12/14 职场文书
五一劳动节活动总结
2015/02/09 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
python中使用redis用法详解
2022/12/24 Redis