python opencv入门-形态学转换
2024-09-25 13:29:01
目标:
学习不同的形态操作 例如 腐蚀、膨胀、开运算、闭运算 等。
我们要学习的函数有 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)
最新文章
- [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)
- java 13-6 Char的包装类Character
- Autodesk 2015全套密钥
- 实体框架Entity Framework 4.1快速入门
- Maximum Submatrix 2
- JAVA-FileInputStream之read方法
- Trunk Club:颠覆男士时装零售的创业公司_第1页_福布斯中文网
- 集群/分布式环境下5种session处理策略
- js实现图片旋转、模板文件查看图片大图之记录篇[二]
- Git相关操作二
- Java数字签名——DSA算法
- 利用Apache配置本地 自定义域名
- Get Form type using javascript in CRM 2011
- Ubuntu 开机自动挂载硬盘
- Hadoop伪分布式模式安装
- Spring MVC 注解
- js 正则判断字符串下划线的长度
- JDK JRE JVM的区别
- 『算法设计_伪代码』贪心算法_最短路径Dijkstra算法
- input标签(图像域和隐藏域)
热门文章
- 2018ICPC赛后总结
- 数学建模 数据包络分析(DEA) Lingo实现
- Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)
- Java并发编程原理与实战二十一:线程通信wait&;notify&;join
- js 替换部分内容为星号
- 【AtCoder】ARC095 E - Symmetric Grid 模拟
- HDU 1027 Ignatius and the Princess II 排列生成
- Macaca(一) - 环境配置
- java 面试算法题
- javascript多投事件的处理 (转)