Python+OpenCV之形态学操作详解
作者:锦鲤AI幸运 发布时间:2021-11-24 23:37:58
标签:Python,OpenCV,形态学,操作
一、 腐蚀与膨胀
1.1 腐蚀操作
import cv2
import numpy as np
img = cv2.imread('DataPreprocessing/img/dige.png')
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
dige.png原图1展示(注: 没有原图的可以截图下来保存本地。):
腐蚀1轮次之后~ (iterations = 1)
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erosion', erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
腐蚀结果展示图2:
腐蚀圆多次的效果,以及腐蚀原理
pie = cv2.imread('DataPreprocessing/img/pie.png')
cv2.imshow('pie', pie)
cv2.waitKey(0)
cv2.destroyAllWindows()
pie.png原图3:
腐蚀原理, 其中滤波器的大小越大腐蚀的程度越大 图4:
kernel = np.ones((30, 30), np.uint8)
erosion_1 = cv2.erode(pie, kernel, iterations=1)
erosion_2 = cv2.erode(pie, kernel, iterations=2)
erosion_3 = cv2.erode(pie, kernel, iterations=3)
res = np.hstack((erosion_1, erosion_2, erosion_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
圆腐蚀三次结果展示图5:
1.2 膨胀操作
kernel = np.ones((3, 3), np.uint8)
dige_dilate = erosion
dige_dilate = cv2.dilate(erosion, kernel, iterations=1)
cv2.imshow('dilate', dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨胀之前图2,发现线条变粗,跟原图对比的线条相差无几,但是没了那些长须装的噪音,图6:
膨胀圆多次的效果,以及膨胀原理与腐蚀相反,有白色点的滤波器则滤波器内数据全变为白色。
pie = cv2.imread('DataPreprocessing/img/pie.png')
kernel = np.ones((30, 30), np.uint8)
dilate_1 = cv2.dilate(pie, kernel, iterations=1)
dilate_2 = cv2.dilate(pie, kernel, iterations=2)
dilate_3 = cv2.dilate(pie, kernel, iterations=3)
res = np.hstack((dilate_1, dilate_2, dilate_3))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
膨胀圆3次的结果展示,图7:
二、 开运算与闭运算
2.1 开运算
# 开:先腐蚀,再膨胀
img = cv2.imread('DataPreprocessing/img/dige.png')
kernel = np.ones((5, 5), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
将原图1,先腐蚀,再膨胀,得到开运算结果图8:
2.2 闭运算
# 闭:先膨胀,再腐蚀
img = cv2.imread('DataPreprocessing/img/dige.png')
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()
将原图1,先膨胀,再腐蚀,得到开运算结果图9:
三、梯度运算
拿原图3的圆,做5次膨胀,5次腐蚀,相减得到其轮廓。
# 梯度=膨胀-腐蚀
pie = cv2.imread('DataPreprocessing/img/pie.png')
kernel = np.ones((7, 7), np.uint8)
dilate = cv2.dilate(pie, kernel, iterations=5)
erosion = cv2.erode(pie, kernel, iterations=5)
res = np.hstack((dilate, erosion))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()
得到梯度运算结果图10:
四、礼帽与黑帽
4.1 礼帽
礼帽 = 原始输入-开运算结果
# 礼帽
img = cv2.imread('DataPreprocessing/img/dige.png')
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()
得到礼帽结果图11:
4.2 黑帽
黑帽 = 闭运算-原始输入
# 黑帽
img = cv2.imread('DataPreprocessing/img/dige.png')
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
得到礼帽结果图12:
来源:https://blog.csdn.net/qq_37700257/article/details/127039846


猜你喜欢
- 这里讲解是图片上传和图片预览。主要是围绕我们常用功能的列子做讲解 ,并且没有格外引入其他js 所以你复制过去做简单修改便可以看到效果效果图:
- 有时候需要在终端显示彩色的字符,即根据需要显示不同颜色的字符串,比如我们要在终端打印一行错误提示信息,要把它弄成红色的。其实这个在Pytho
- 本文实例讲述了Python实现公历(阳历)转农历(阴历)的方法。分享给大家供大家参考,具体如下:两个要点:1、公历转农历用了查表法(第126
- 初步介绍 当然,我知道现在有成千上万个关于 用CSS处理圆角 的教程,但不管怎么说,我仍然想把这篇文章展示给您。也希望您会发现这篇文章会非常
- Vue中keep-alive的使用我总结的有两种方式应用:首先简述一下keep-alive的作用,kee-alive可以缓存不活动的的组件。
- Python中的数据类型共有六个,分别是:字符串,数字,布尔类型,列表,元祖,字典,集合其中分为可变的类型和不可变的:可变类型:列表,字典,
- 我之前想写路由器的密码暴力破解器,我手上只有极路由,发现极路由有安全限制,只能允许连续10密码错误,所以我改拿博客园练手。博客园的博客有个功
- 因为函数或类都是对象,它们也能被四处传递。它们又是可变对象,可以被更改。在函数或类对象创建后但绑定到名字前更改之的行为为装饰(decorat
- 原则:1. 我们测试的是产品可用性,不是使用者的个人能力2. 尽量不要打断用户的操作3. &
- 我们在使用Django过程中,数据库往往是离不开的,比较长常用的是MySQL数据库,但在使用过程中,对Python不同的版本对用的库也不一样
- 在JavaScript中,可以用三种方法来遍历对象的property:1.for/in。可以使用for/in语句遍历对象自身的propert
- 开发工具**Python版本:**3.6.4相关模块:pyecharts模块;以及一些Python自带的模块。环境搭建安装Python并添加
- QQ影音新版发布官网Banner经过两周的酝酿、脑爆与设计调整,于20日顺利上线,连续7天,经历了昨天激动人心的最后发布,到此告一段落,这里
- 摘要如何用beautifulsoup4解析各种情况的网页beautifulsoup4的使用关于beautifulsoup4,官网已经讲的很详
- 先来看一下效果吧,只要有足够的照片素材,捕获女神的心就指日可待怎么样,看起来还可以吧下面就一起来完成吧数据准备首先是测试图片的获取,毕竟萝卜
- cv2.getStructuringElement()函数的作用是返回一个结构元素(卷积核),具体解析如下:kernel = cv2.get
- 1.1.propety动态属性在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法。在python中他们对应的分别是属
- 关于用鼠标滚动到某个位置我们就去加载数据,这样的场景与业务需求现在越来越常见,现在来分析下《vue.js 实战》中作者的一个解决策略:1.
- 我们小组讨论的话题是tab(标签)在使用时的禁忌。在讨论的开始,大家很快产生了六个感兴趣的话题:如何处理海量的tab?在浏览器中关掉tab之
- 一、创建一个进程要创建一个进程,最简单的方式是用一个目标函数实例化一个Process对象,然后与threading一样调用start()函数