原文为段立辉翻译,感谢Linux公社
此文档为自学转述,如有侵权请联系本人。

目标:

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

• 学习的函数有:cv2.erode(),cv2.dilate(),cv2.morphologyEx() 等

形态学转换原理:一般情况下对二值化图像进行操作。需要两个参数,一个是原始图像,第二个被称为结构化元素或者核,它是用来决定操作的性质的。基本操作为腐蚀和膨胀,他们的变体构成了开运算,闭运算,梯度等。

1、腐蚀

把前景物体的边界腐蚀掉,但是前景仍然是白色的。卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为零。根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪音很有用,也可以用来断开两个连在一块的物体。

erosion = cv2.erode(img, kernel, iterations=1)

2、膨胀

与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1。所以这个操作会增加图像中白色区域(前景)。一般在去噪音时先腐蚀再膨胀,因为腐蚀再去掉白噪音的同时,也会使前景对象变小,所以我们再膨胀。这时噪音已经被去除,不会再回来了,但是前景还在并会增加,膨胀也可以用来连接两个分开的物体。

dilation = cv2.dilate(img, kernel, iterations=1)

3、开运算

先进行腐蚀再进行膨胀就叫做开运算。被用来去除噪音,函数可以使用cv2.morphotogyEx()

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

4、闭运算

先膨胀再腐蚀。被用来填充前景物体中的小洞,或者前景上的小黑点。

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

5、形态学梯度

其实就是一幅图像膨胀与腐蚀的差别。结果看上去就像前景物体的轮廓。

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

6、礼帽

原始图像与进行开运算之后得到的图像的差。

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

7、黑帽

进行闭运算之后得到的图像与原始图像的差。

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
import cv2
import numpy as np img = cv2.imread('./opencv_learn/image3.png',0) kernel = np.ones((5,5),np.uint8)
# 腐蚀
erosion = cv2.erode(img, kernel, iterations=1)
# 膨胀
dilation = cv2.dilate(img, kernel, iterations=1)
# 开运算,先腐蚀在膨胀
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 闭运算,先膨胀在腐蚀
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 形态学梯度,腐蚀和膨胀的差别
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 礼貌,开运算后与原图的差
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 黑帽, 闭运算后与原图的差
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) while(1):
cv2.imshow('img',img)
cv2.imshow('erosion',erosion)
cv2.imshow('dilation', dilation)
cv2.imshow('opening', opening)
cv2.imshow('closing',closing)
cv2.imshow('gradient',gradient)
cv2.imshow('tophat', tophat)
cv2.imshow('blackhat', blackhat)
k = cv2.waitKey(1)
if k == ord('q'):
break cv2.destroyAllWindows()

结构化元素

之前的例子都是使用numpy构建了结构化元素,但是是正方形的,若需要构建椭圆或者圆形的核,可以使用OpenCV提供的函数cv2.getStructuringElemenet(),只需要告诉它你需要的核的形状和大小。

【OpenCV-Python】-图像形态学转化的更多相关文章

  1. Python图像处理丨三种实现图像形态学转化运算模式

    摘要:本篇文章主要讲解Python调用OpenCV实现图像形态学转化,包括图像开运算.图像闭运算和梯度运算 本文分享自华为云社区<[Python图像处理] 九.形态学之图像开运算.闭运算.梯度运 ...

  2. opencv python 图像二值化/简单阈值化/大津阈值法

    pip install matplotlib 1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表 ...

  3. 11、OpenCV Python 图像金字塔

    __author__ = "WSX" import cv2 as cv import numpy as np # 高斯金字塔 #金字塔 原理 ==> 高斯模糊+ 降采样 #金 ...

  4. 10、OpenCV Python 图像二值化

    __author__ = "WSX" import cv2 as cv import numpy as np #-----------二值化(黑0和白 255)---------- ...

  5. 8、OpenCV Python 图像直方图

    __author__ = "WSX" import cv2 as cv import numpy as np from matplotlib import pyplot as pl ...

  6. 1、OpenCV Python 图像加载和保存

    __author__ = "WSX" import cv2 as cv # 这里的文件是图片或者视频 def Save_File( image ): cv.imwrite(&quo ...

  7. 12、OpenCV Python 图像梯度

    __author__ = "WSX" import cv2 as cv import numpy as np def lapalian_demo(image): #拉普拉斯算子 # ...

  8. 2、OpenCV Python 图像属性获取

    __author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...

  9. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

随机推荐

  1. Linux-在新买的阿里云服务器上部署Tomcat并支持外网访问的配置(步骤记录)

    一.首先你得有一台外网上的服务器 华为.腾讯.阿里都有云服务售卖,我这里是在阿里云打折时购买的. 二.使用Xshell和XFTP连接上云服务 当然了,连接工具有很多种,可随意.购买服务器之后,你会收到 ...

  2. ORB_SLAM2_Android

    链接:https://github.com/FangGet/ORB_SLAM2_Android README.md 说明文件 This Project is out of date 该工程过时了 Th ...

  3. CSS 学习-文本 段落

    段落. 首行缩进 text-indent属性 比如缩进  <p style="text-indent: 2em;">这里是内容....</p> 这里是内容这 ...

  4. 微信小程序中使用阿里字体图标

    在微信小程序中使用阿里字体图标 ,不通过转换成base64的方式实现. 为了美化微信小程序,可以适当的使用一些小图标,这样体验也更友好些,于是决定使用常用的字体图标. 下载图标 首先在阿里字体图标查找 ...

  5. redis整理の安全认证

    设置客户端连接后进行任何其他指定前需要使用的密码. tips:因为 redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进 行 150K 次的密码尝试,这意味着你需要指定非常 ...

  6. delphi中的sql语句中空格问题

    sql语句中的冒号 ‘’,在delphi中需要用四个冒号表示 ‘’‘’,delphi中的两个冒号只代表一个冒号

  7. Transaction And Lock--由Lookup导致的死锁情况

    存在这样情况:1.表TB1有一列建立索引2.事务A对表进行更新,先获取对表的X锁以更新基本表中数据,然后对索引申请X锁以更新索引数据.3.事务B对表进行更新,先获取索引上S锁以使用索引进行Loopup ...

  8. Jenkins Pipeline+Maven+Gitlab持续集成构建问题集锦

    问题 1.全局配置一定要写正确,之前where git 给的地址时E:\Git\cmd\git.exe一直报错,其实Windows真正的git.exe在bin目录下 如果是Linux中,使用where ...

  9. Spring Boot - Spring Cache

    缓存 服务器自身(内存)的缓存 利用java程序中的变量 简单 集群环境中多个实例无法共享同步 缓存服务器(一般支持集群.分布式) Redis Memcached Spring中使用注解使用缓存 启动 ...

  10. 用Visual Studio 2015 编译张帆的第一个NT式驱动,并且成功安装到Windows XP里面!!!

    开发工具:Visual Studio 2015 企业版 目 标 机:Windows XP X86 前提:我们已经成功安装了Visual Studio 2015以及WDK,而且更重要一点是一定要SDK版 ...