目标:

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

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

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

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

如下5*5的卷积核

 import cv2
import numpy as np img = cv2.imread('9.jpg',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 2) cv2.imshow('img',img)
cv2.imshow('ero',erosion) cv2.waitKey(0)

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

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

 import cv2
import numpy as np img = cv2.imread('9.jpg',0)
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(img,kernel,iterations = 1) cv2.imshow('img',img)
cv2.imshow('dil',dilation) cv2.waitKey(0)

左边为膨胀

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

函数是 cv2.morphologyEx()

 import cv2
import numpy as np img = cv2.imread('9.jpg',0)
kernel = np.ones((5,5),np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) cv2.imshow('img',img)
cv2.imshow('opening',opening) cv2.waitKey(0)

结果略

闭运算:

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

 import cv2
import numpy as np img = cv2.imread('9.jpg',0)
kernel = np.ones((5,5),np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) cv2.imshow('img',img)
cv2.imshow('closing',closing) cv2.waitKey(0)

形态学梯度

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

 import cv2
import numpy as np img = cv2.imread('9.jpg',0)
kernel = np.ones((5,5),np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) cv2.imshow('img',img)
cv2.imshow('gradient',gradient) cv2.waitKey(0)

礼帽:

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

 import cv2
import numpy as np img = cv2.imread('9.jpg',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) cv2.imshow('img',img)
cv2.imshow('tophat',tophat) cv2.waitKey(0)

黑帽:

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

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

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

 # 矩形核
>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8) # 椭圆形核
>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype=uint8) # 十字形核
>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))
array([[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]], dtype=uint8)

最新文章

  1. [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)
  2. java 13-6 Char的包装类Character
  3. Autodesk 2015全套密钥
  4. 实体框架Entity Framework 4.1快速入门
  5. Maximum Submatrix 2
  6. JAVA-FileInputStream之read方法
  7. Trunk Club:颠覆男士时装零售的创业公司_第1页_福布斯中文网
  8. 集群/分布式环境下5种session处理策略
  9. js实现图片旋转、模板文件查看图片大图之记录篇[二]
  10. Git相关操作二
  11. Java数字签名——DSA算法
  12. 利用Apache配置本地 自定义域名
  13. Get Form type using javascript in CRM 2011
  14. Ubuntu 开机自动挂载硬盘
  15. Hadoop伪分布式模式安装
  16. Spring MVC 注解
  17. js 正则判断字符串下划线的长度
  18. JDK JRE JVM的区别
  19. 『算法设计_伪代码』贪心算法_最短路径Dijkstra算法
  20. input标签(图像域和隐藏域)

热门文章

  1. 2018ICPC赛后总结
  2. 数学建模 数据包络分析(DEA) Lingo实现
  3. Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)
  4. Java并发编程原理与实战二十一:线程通信wait&notify&join
  5. js 替换部分内容为星号
  6. 【AtCoder】ARC095 E - Symmetric Grid 模拟
  7. HDU 1027 Ignatius and the Princess II 排列生成
  8. Macaca(一) - 环境配置
  9. java 面试算法题
  10. javascript多投事件的处理 (转)