python-opencv在有噪音的情况下提取图像的轮廓
对于一般的图像提取轮廓,这篇博文介绍了一个很好的方法,但是对于有噪声的图像,并不能很好地捕获到目标物体。
比如对于我的鼠标,提取的轮廓效果并不好,因为噪声很多:
所以本文增加了去掉噪声的部分。
首先加载原始图像,并显示图像
- img = cv2.imread("temp.jpg") #载入图像
- h, w = img.shape[:2] #获取图像的高和宽
- cv2.imshow("Origin", img) #显示原始图像
然后进行低通滤波处理,进行降噪
- blured = cv2.blur(img,(5,5)) #进行滤波去掉噪声
- cv2.imshow("Blur", blured) #显示低通滤波后的图像
使用floodfill来去掉目标周围的背景,泛洪填充类始于ps的魔棒工具,这里用来清除背景。
- 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)
接着转换成二值图以便于获取图像的轮廓
最后进行轮廓提取,抓取到目标
- #找到轮廓
- _,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)
全部代码如下
- #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在有噪音的情况下提取图像的轮廓的更多相关文章
- ubuntu14.04 python + opencv 傻瓜式安装解决方案
ubuntu14.04 python + opencv 傻瓜式安装解决方案 ubuntu下使python和opencv来做开发的话,总要花那么点时间来配置环境.我偶然间发现了一种傻瓜式安装办法希望快 ...
- Python openCV基础操作
1.图片加载.显示和保存 import cv2 # 读取图片 img = cv2.imread("img1.jpg") # 生成灰色图片 imgGrey = cv2.imread( ...
- opencv学习笔记(九)Mat 访问图像像素的值
对图像的像素进行访问,可以实现空间增强,反色,大部分图像特效系列都是基于像素操作的.图像容器Mat是一个矩阵的形式,一般情况下是二维的.单通道灰度图一般存放的是<uchar>类型,其数据存 ...
- linux 存在多个版本的情况下,切换python版本
linux 存在多个版本的情况下 python 命令默认寻找 /usr/bin下的命令 所以先find / -name python* 找一下所有的Python版本 然后 sudo ln /usr/b ...
- Python多版本情况下四种快速进入交互式命令行的操作技巧
因为工作需求或者学习需要等原因,部分小伙伴的电脑中同时安装了Python2和Python3,相信在Python多版本的切换中常常会遇到Python傻傻分不清楚的情况,今天小编整理了四个操作技巧,以帮助 ...
- 我大概知道他在说什么了,是对内存单元的竞争访问吧。Python有GIL,在执行伪码时是原子的。但是伪码之间不保证原子性。 UDP丢包,你是不是做了盲发?没有拥塞控制的情况下,确实会出现丢包严重的情况。你先看看发送速率,还有是否带有拥塞控制。
我大概知道他在说什么了,是对内存单元的竞争访问吧.Python有GIL,在执行伪码时是原子的.但是伪码之间不保证原子性. UDP丢包,你是不是做了盲发?没有拥塞控制的情况下,确实会出现丢包严重的情 ...
- Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包
联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ...
- Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?
一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...
- 在Debian9(linux)上使用 的 python 3 IDLE(已经安装了python 2.7 的情况下)
在Debian9(Stable)中默认安装了python2.7和pytohon3.5两个版本,但是没有IDLE,本人想用pytihon3.5的IDLE,将本次解决问题在此Mark一下, 首先,执行 s ...
随机推荐
- css动画属性--轮播图效果
通过css的动画属性实现轮播图的显示效果 代码如下: 主体部分: <div id="move"> <ul> <li><img src=&q ...
- linux常用的监控命令
转自:http://www.cnblogs.com/huangxm/p/6278615.html 1. top 显示所有正在运行而且处于活动状态的实时进程, 而且会定期更新显示结果:它显示了CPU使 ...
- hadoop全分布式环境搭建
本文主要介绍基本的hadoop的搭建过程.首先说下我的环境准备.我的笔记本使用的是Windows10专业版,装的虚拟机软件为VMware WorkStation Pro,虚拟机使用的系统为centos ...
- Nginx文档-初学者指南
原文档: http://nginx.org/en/docs/beginners_guide.html 译者:Oopsguy 本指南旨在介绍nginx基本内容和一些在Nginx上可以完成的简单任务.这里 ...
- win7 远程桌面连接过程
背景:在公司日常工作中经常需要是用到远程桌面的连接,在内网环境下,远程桌面连接比qq更加方便!可以考虑外网的连接. 1 准备工作 这里我实验的另一台机器的ip:168.33.51.198,本机ip:1 ...
- ES6数组扩展
前面的话 数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入一些新方法来简化使用.ES6标准继续改进数组,添加了很多新功能.本文将详细介绍ES6数组扩 ...
- 实例化bean
从bean.xml中<bean>标签内容可以看出bean其实是一个管理对象的东西,我们只需要修改xml配置文件,就可以改变对象之间的依赖关系,不需要去修改任何源代码.我觉得学习好sprin ...
- python中list总结
转自python中list总结 一.list可以看做是一个数据结构,也是一个class, 用help(list)可以看见其方法,元素的增删改查都有各种现成的方法, 二.list操作包含以下函数:1.c ...
- CodeForces 816B Karen and Coffee(前缀和,大量查询)
CodeForces 816B Karen and Coffee(前缀和,大量查询) Description Karen, a coffee aficionado, wants to know the ...
- 到底什么样的企业才适合实施SAP系统?
SAP系统作为全宇宙第一的ERP,号称世界500强里面有80%的企业部署了SAP系统,总部位于德国沃尔多夫市,在全球拥有6万多名员工,遍布全球130个国家,并拥有覆盖全球11,500家企业的合作伙伴网 ...