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

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

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

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

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

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

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

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

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

  然后转换成灰度图

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

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

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

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

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

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

  全部代码如下

  1. #coding=utf-8
  2. import cv2
  3. import numpy as np
  4.  
  5. img = cv2.imread("temp.jpg") #载入图像
  6. h, w = img.shape[:2] #获取图像的高和宽
  7. cv2.imshow("Origin", img) #显示原始图像
  8.  
  9. blured = cv2.blur(img,(5,5)) #进行滤波去掉噪声
  10. cv2.imshow("Blur", blured) #显示低通滤波后的图像
  11.  
  12. mask = np.zeros((h+2, w+2), np.uint8) #掩码长和宽都比输入图像多两个像素点,满水填充不会超出掩码的非零边缘
  13. #进行泛洪填充
  14. cv2.floodFill(blured, mask, (w-1,h-1), (255,255,255), (2,2,2),(3,3,3),8)
  15. cv2.imshow("floodfill", blured)
  16.  
  17. #得到灰度图
  18. gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)
  19. cv2.imshow("gray", gray)
  20.  
  21. #定义结构元素
  22. kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
  23. #开闭运算,先开运算去除背景噪声,再继续闭运算填充目标内的孔洞
  24. opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
  25. closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
  26. cv2.imshow("closed", closed)
  27.  
  28. #求二值图
  29. ret, binary = cv2.threshold(closed,250,255,cv2.THRESH_BINARY)
  30. cv2.imshow("binary", binary)
  31.  
  32. #找到轮廓
  33. _,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
  34. #绘制轮廓
  35.  
  36. cv2.drawContours(img,contours,-1,(0,0,255),3)
  37. #绘制结果
  38. cv2.imshow("result", img)
  39.  
  40. cv2.waitKey(0)
  41. cv2.destroyAllWindows()

python-opencv在有噪音的情况下提取图像的轮廓的更多相关文章

  1. ubuntu14.04 python + opencv 傻瓜式安装解决方案

    ubuntu14.04  python + opencv 傻瓜式安装解决方案 ubuntu下使python和opencv来做开发的话,总要花那么点时间来配置环境.我偶然间发现了一种傻瓜式安装办法希望快 ...

  2. Python openCV基础操作

    1.图片加载.显示和保存 import cv2 # 读取图片 img = cv2.imread("img1.jpg") # 生成灰色图片 imgGrey = cv2.imread( ...

  3. opencv学习笔记(九)Mat 访问图像像素的值

    对图像的像素进行访问,可以实现空间增强,反色,大部分图像特效系列都是基于像素操作的.图像容器Mat是一个矩阵的形式,一般情况下是二维的.单通道灰度图一般存放的是<uchar>类型,其数据存 ...

  4. linux 存在多个版本的情况下,切换python版本

    linux 存在多个版本的情况下 python 命令默认寻找 /usr/bin下的命令 所以先find / -name python* 找一下所有的Python版本 然后 sudo ln /usr/b ...

  5. Python多版本情况下四种快速进入交互式命令行的操作技巧

    因为工作需求或者学习需要等原因,部分小伙伴的电脑中同时安装了Python2和Python3,相信在Python多版本的切换中常常会遇到Python傻傻分不清楚的情况,今天小编整理了四个操作技巧,以帮助 ...

  6. 我大概知道他在说什么了,是对内存单元的竞争访问吧。Python有GIL,在执行伪码时是原子的。但是伪码之间不保证原子性。 UDP丢包,你是不是做了盲发?没有拥塞控制的情况下,确实会出现丢包严重的情况。你先看看发送速率,还有是否带有拥塞控制。

    我大概知道他在说什么了,是对内存单元的竞争访问吧.Python有GIL,在执行伪码时是原子的.但是伪码之间不保证原子性.   UDP丢包,你是不是做了盲发?没有拥塞控制的情况下,确实会出现丢包严重的情 ...

  7. Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

    联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ...

  8. Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?

    一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...

  9. 在Debian9(linux)上使用 的 python 3 IDLE(已经安装了python 2.7 的情况下)

    在Debian9(Stable)中默认安装了python2.7和pytohon3.5两个版本,但是没有IDLE,本人想用pytihon3.5的IDLE,将本次解决问题在此Mark一下, 首先,执行 s ...

随机推荐

  1. css动画属性--轮播图效果

    通过css的动画属性实现轮播图的显示效果 代码如下: 主体部分: <div id="move"> <ul> <li><img src=&q ...

  2. linux常用的监控命令

    转自:http://www.cnblogs.com/huangxm/p/6278615.html 1.  top 显示所有正在运行而且处于活动状态的实时进程, 而且会定期更新显示结果:它显示了CPU使 ...

  3. hadoop全分布式环境搭建

    本文主要介绍基本的hadoop的搭建过程.首先说下我的环境准备.我的笔记本使用的是Windows10专业版,装的虚拟机软件为VMware WorkStation Pro,虚拟机使用的系统为centos ...

  4. Nginx文档-初学者指南

    原文档: http://nginx.org/en/docs/beginners_guide.html 译者:Oopsguy 本指南旨在介绍nginx基本内容和一些在Nginx上可以完成的简单任务.这里 ...

  5. win7 远程桌面连接过程

    背景:在公司日常工作中经常需要是用到远程桌面的连接,在内网环境下,远程桌面连接比qq更加方便!可以考虑外网的连接. 1 准备工作 这里我实验的另一台机器的ip:168.33.51.198,本机ip:1 ...

  6. ES6数组扩展

    前面的话 数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入一些新方法来简化使用.ES6标准继续改进数组,添加了很多新功能.本文将详细介绍ES6数组扩 ...

  7. 实例化bean

    从bean.xml中<bean>标签内容可以看出bean其实是一个管理对象的东西,我们只需要修改xml配置文件,就可以改变对象之间的依赖关系,不需要去修改任何源代码.我觉得学习好sprin ...

  8. python中list总结

    转自python中list总结 一.list可以看做是一个数据结构,也是一个class, 用help(list)可以看见其方法,元素的增删改查都有各种现成的方法, 二.list操作包含以下函数:1.c ...

  9. CodeForces 816B Karen and Coffee(前缀和,大量查询)

    CodeForces 816B Karen and Coffee(前缀和,大量查询) Description Karen, a coffee aficionado, wants to know the ...

  10. 到底什么样的企业才适合实施SAP系统?

    SAP系统作为全宇宙第一的ERP,号称世界500强里面有80%的企业部署了SAP系统,总部位于德国沃尔多夫市,在全球拥有6万多名员工,遍布全球130个国家,并拥有覆盖全球11,500家企业的合作伙伴网 ...