【642】Python 实现膨胀、腐蚀、提取边线
[1] python实现膨胀与腐蚀
[3] OpenCV 图像处理之膨胀与腐蚀【推荐】
-
膨胀
cv2.dilate(img, kernel, 1)
-
腐蚀
cv2.erode(img, kernel, iterations=1)
-
开运算
开运算:先腐蚀,再膨胀
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)
-
闭运算
闭运算:先膨胀,再腐蚀
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
-
梯度计算:
膨胀的图像 - 腐蚀的图像
用大一圈的图像减去小一圈的图像正好就是边缘的信息。
cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
1. 基本概念
图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大;腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。
1.1 膨胀(或)
通过卷积运算,对于膨胀而言,结果是 0 的还是 0,结果大于 0 的就赋值为 1(针对二值图)
相当于 或 操作,只有 0 才为 0,其他都为 1(针对二值图)
更通俗的说法:这里我们指定范围为3*3的矩阵,kernel(卷积核核)指定为全为1的3*3矩阵,卷积计算后,该像素点的值等于以该像素点为中心的3*3范围内的最大值。如果是二值图像,只要包含周围白的部分,就变为白的。
1.2 腐蚀(与)
通过卷积运算,对于腐蚀而言,结果是 最大值 的才是 1,其他就赋值为 0(针对二值图)
相当于 与 操作,只有 最大值 才为 1,其他均赋值为 0(针对二值图)
举例:如果是 十字形,则需要卷积值为 5 才会赋值为 1,其他均赋值为 0(针对二值图)
更通俗的说法:腐蚀操作和膨胀操作相反,也就是将毛刺消除,判断方法为:在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。如果是二值图像,就是取0(黑色)。 总结: 只要原图片3 * 3范围内有黑的,该像素点就是黑的。
2. 实现过程
2.1 膨胀实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | img = cv2.imread( 'Pic/corrode.png' ) def cv_show(img): cv2.imshow('', img) cv2.waitKey( 0 ) cv2.destroyAllWindows() cv_show(img) kernel = np.ones(( 3 , 3 ), dtype = np.uint8) dilate = cv2.dilate(img, kernel, 1 ) # 1:迭代次数,也就是执行几次膨胀操作 cv_show(dilate) # 更改卷积核大小 kernel_2 = np.ones(( 4 , 4 ), dtype = np.uint8) # 卷积核变为4*4 dilate = cv2.dilate(img, kernel_2, 1 ) cv_show(dilate) # 更改迭代次数 kernel = np.ones(( 3 , 3 ), dtype = np.uint8) dilate = cv2.dilate(img, kernel, 2 ) # 更改迭代次数为2 ss = np.hstack((img, dilate)) cv_show(ss) |
2.2 腐蚀实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | kernel = np.ones(( 3 , 3 ), dtype = np.uint8) erosion = cv2.erode(img, kernel, iterations = 1 ) ss = np.hstack((img, erosion)) cv_show(ss) # 更改卷积核大小 kernel_2 = np.ones(( 4 , 4 ), dtype = np.uint8) erosion = cv2.erode(img, kernel_2, iterations = 1 ) ss = np.hstack((img, erosion)) cv_show(ss) # 更改迭代次数 kernel = np.ones(( 3 , 3 ), dtype = np.uint8) erosion = cv2.erode(img, kernel, iterations = 2 ) ss = np.hstack((img, erosion)) cv_show(ss) |
2.3 开运算与闭运算
1 2 3 4 5 6 7 8 9 10 11 | # 开运算 opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1 ) ss = np.hstack((img, opening)) cv_show(ss) # 闭运算 closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) ## 有缺陷,填补缺陷 ss = np.hstack((img, closing)) cv_show(ss) |
开运算可以用来去噪声
1 2 3 4 5 6 7 8 | img = cv2.imread( 'seg.png' ) kernel = np.ones(( 5 , 5 ), dtype = np.uint8) opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1 ) ss = np.hstack((img, opening)) show(ss) cv2.imwrite( 'seg_smooth.png' , opening) |
2.4 梯度运算
1 2 | gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) cv_show(gradient) |
具体实现
1 2 3 4 5 | img = cv2.imread( 'seg.png' ) kernel = np.ones(( 3 , 3 ), dtype = np.uint8) gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) ss = np.hstack((img, gradient)) show(ss) |
posted on 2021-08-12 11:34 McDelfino 阅读(1001) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2020-08-12 【476】ArcGIS表关联方式介绍(一)-Join、Relate
2016-08-12 【210】通过OleDb读写Excel数据到DataTable