目标:

  学习不同的形态操作 例如 腐蚀、膨胀、开运算、闭运算 等。

  我们要学习的函数有 cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等。

原理 :
一般对二值化图像进行形态学转换操作。输入的第一个参数为原始图像;第二个参数为结构化元素(核),该参数决定操作性质。两个基本形态学操作是腐蚀膨胀,衍生出了开运算、闭运算、梯度运算等等

腐蚀 :
腐蚀操作会把前景物体的边缘腐蚀掉。原理是卷积核沿着图像滑动,如果与卷积核对应的原图像像素值都是1,那么中心元素保持原值,否则为0. 
效果,靠近前景的像素被腐蚀为0,前景物体变小,图像白色区域减少,对于去除白噪声很有用,可以断开两个连接在一起的物体。 
(图像当中的白噪声大概意思就是随机噪声)

如下5*5的卷积核

  1. import cv2
  2. import numpy as np
  3.  
  4. img = cv2.imread('9.jpg',0)
  5. kernel = np.ones((5,5),np.uint8)
  6. erosion = cv2.erode(img,kernel,iterations = 2)
  7.  
  8. cv2.imshow('img',img)
  9. cv2.imshow('ero',erosion)
  10.  
  11. cv2.waitKey(0)

左侧为腐蚀后的图像,iterations为迭代运算次数

膨胀 :
与腐蚀相反,卷积核当中只要有一个值是1,中心元素值就是1。此操作会增加前景中的白色区域,一般在去噪声的时候都是先腐蚀再膨胀,腐蚀的过程会使得前景变小,使用膨胀操作使前景变换回来。膨胀也可以使相互分离的物体连接。

  1. import cv2
  2. import numpy as np
  3.  
  4. img = cv2.imread('9.jpg',0)
  5. kernel = np.ones((5,5),np.uint8)
  6. dilation = cv2.dilate(img,kernel,iterations = 1)
  7.  
  8. cv2.imshow('img',img)
  9. cv2.imshow('dil',dilation)
  10.  
  11. cv2.waitKey(0)

左边为膨胀

开运算 :
就是先腐蚀再膨胀,一般用来去除噪声

函数是 cv2.morphologyEx()

  1. import cv2
  2. import numpy as np
  3.  
  4. img = cv2.imread('9.jpg',0)
  5. kernel = np.ones((5,5),np.uint8)
  6.  
  7. opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
  8.  
  9. cv2.imshow('img',img)
  10. cv2.imshow('opening',opening)
  11.  
  12. cv2.waitKey(0)

结果略

闭运算:

先膨胀再腐蚀,一般用来填充黑色的小像素点

  1. import cv2
  2. import numpy as np
  3.  
  4. img = cv2.imread('9.jpg',0)
  5. kernel = np.ones((5,5),np.uint8)
  6. closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
  7.  
  8. cv2.imshow('img',img)
  9. cv2.imshow('closing',closing)
  10.  
  11. cv2.waitKey(0)

形态学梯度

此为膨胀和腐蚀的差别,结果为前景轮廓

  1. import cv2
  2. import numpy as np
  3.  
  4. img = cv2.imread('9.jpg',0)
  5. kernel = np.ones((5,5),np.uint8)
  6. gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
  7.  
  8. cv2.imshow('img',img)
  9. cv2.imshow('gradient',gradient)
  10.  
  11. cv2.waitKey(0)

礼帽:

原始图像与开运算图像的差 

  1. import cv2
  2. import numpy as np
  3.  
  4. img = cv2.imread('9.jpg',0)
  5. kernel = np.ones((5,5),np.uint8)
  6. tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
  7.  
  8. cv2.imshow('img',img)
  9. cv2.imshow('tophat',tophat)
  10.  
  11. cv2.waitKey(0)

黑帽:

闭运算与原始图像的差(注意是闭运算减去原始图像,与礼帽不相反)

  1. blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
  • 1

结构化元素 
前面使用numpy构建结构化元素,都是正方形的核。如果要构建圆形或者椭圆形的核,可以使用 cv2.getStructuringElement()函数。 
参数填入形状和大小

  1. # 矩形核
  2. >>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
  3. array([[1, 1, 1, 1, 1],
  4. [1, 1, 1, 1, 1],
  5. [1, 1, 1, 1, 1],
  6. [1, 1, 1, 1, 1],
  7. [1, 1, 1, 1, 1]], dtype=uint8)
  8.  
  9. # 椭圆形核
  10. >>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
  11. array([[0, 0, 1, 0, 0],
  12. [1, 1, 1, 1, 1],
  13. [1, 1, 1, 1, 1],
  14. [1, 1, 1, 1, 1],
  15. [0, 0, 1, 0, 0]], dtype=uint8)
  16.  
  17. # 十字形核
  18. >>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
  19. array([[0, 0, 1, 0, 0],
  20. [0, 0, 1, 0, 0],
  21. [1, 1, 1, 1, 1],
  22. [0, 0, 1, 0, 0],
  23. [0, 0, 1, 0, 0]], dtype=uint8)

python opencv入门-形态学转换的更多相关文章

  1. 【小工具系列】Python + OpenCV 图片序列转换成视频

    图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...

  2. OpenCV 入门

    1.入门攻略[安装用] https://www.cnblogs.com/linshuhe/p/5764394.html 2.VS2017配置opencv教程(超详细!!!) https://blog. ...

  3. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  4. python+opencv实现车牌定位

    写在前面 HIT大三上学期视听觉信号处理课程中视觉部分的实验三,经过和学长们实验的对比发现每一级实验要求都不一样,因此这里标明了是2019年秋季学期的视觉实验三. 由于时间紧张,代码没有进行任何优化, ...

  5. python opencv识别蓝牌车牌号 之 取出车牌号 (1/3)

    概述 车牌识别是计算机视频图像识别技术在车辆牌照识别中的一种应用,通常来讲如果结合opencv进行车牌识别主要分为四个大步骤,分别为: 图像采集 车牌定位 分割车牌字符 字符识别 当然,如果结合了机器 ...

  6. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  7. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...

  8. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

    http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...

  9. Python爬虫入门之正则表达式

    在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...

随机推荐

  1. Linux系统自动备份的Shell

    公司现在需要对现有的服务器进行定期备份,并将备份文件放置到正在使用的NAS中去: 为了备份的效率,还需要对备份的文件进行筛选,排除一些后缀名的文件: 实现方法如下: 1. 编写备份的shell文件 在 ...

  2. Storm实现实时大数据分析

    当今世界,公司的日常运营经常会生成TB级别的数据.数据来源囊括了互联网装置可以捕获的任何类型数据,网站.社交媒体.交易型商业数据以及其它商业环境中创建的数据.考虑到数据的生成量,实时处理成为了许多机构 ...

  3. MapReduce (MRV1)设计理念与基本架构

    MapReduce 是一个分布式计算框架,主要由两部分组成:编程模型和运行时环境. 其中,编程模型为用户提供了非常易用的编程接口,用户只需要像编写串行程序一样实现几个简单的函数即可实现一个分布式程序, ...

  4. vuex的安装

    可以启动vue ui 手动添加vuex. 或使用 cnpm install vuex 2.使用,import vuex from “vuex” vue.use(vuex) 3.安装插件, 首先键入谷歌 ...

  5. 关于java线程锁synchronized修饰普通方法与静态方法的区别

    最近研究线程方面问题,关于这个synchronized锁修饰的问题,先是修饰普通方法,然后通过两个线程,各自执行自己对象的锁,发现方法执行互不影响,代码如下: private static int n ...

  6. perl6 Net::HTTP 发送任意 url 请求例子

    只做个笔记, 用 HTTP::UserAgent 的话, url 中有特殊点的符号会请求不了, 用 Net::HTTP 能很好的发送请求. use Net::HTTP::GET; my $url = ...

  7. 【Andorid开发框架学习】之Volley入门

    Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮.Volley特别适合数据量不大但是通信频繁的场景.在listView显示图片这方面,使用volley也是比较好的,不必 ...

  8. Android性能测试工具之APT

    1.APT工具简介: APT是一个eclipse插件,可以实时监控Android手机上多个应用的CPU.内存数据曲线,并保存数据:另外还支持自动获取内存快照.PMAP文件分析等,方便开发人员自测或者测 ...

  9. pip install 升级时候 出现报asciii码错误的问题。

    原因是pip安装python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...

  10. jmter提交图片

    jmter提交图片 https://www.cnblogs.com/linglingyuese/p/4514808.html