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解析xml中dom元素的方法
Mar 12 Python
详解Python网络爬虫功能的基本写法
Jan 28 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
python自动化之Ansible的安装教程
Jun 13 Python
树莓派使用USB摄像头和motion实现监控
Jun 22 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 Python
Python request操作步骤及代码实例
Apr 13 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
php防攻击代码升级版
2010/12/29 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
Javascript数组与字典用法分析
2014/12/13 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
javascript中的面向对象
2017/03/30 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
详解js 创建对象的几种方法
2019/03/08 Javascript
javascript导出csv文件(excel)的方法示例
2019/08/25 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
Python中的Descriptor描述符学习教程
2016/06/02 Python
Python3 中文文件读写方法
2018/01/23 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
python配置文件写入过程详解
2019/10/19 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
2015年车间管理工作总结
2015/07/23 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP