计算机视觉基础|第 6 章 形态学操作(膨胀、腐蚀、开闭、梯度、顶帽黑帽)
目录
承接第 5 章视频处理。形态学操作主要针对二值图像,依靠卷积核(结构元)对图像像素做形态变换,常用于去噪、填充孔洞、提取物体轮廓,是 OpenCV 非常经典的图像处理工具。
6.1 本章学习目标
- 理解形态学操作基础:结构元(核)的概念
- 掌握腐蚀、膨胀两种最基础运算
- 理解开运算、闭运算的作用与使用场景
- 学会梯度运算、顶帽运算、黑帽运算
- 能够区分不同形态学操作,根据需求选择合适算子
6.2 前置理论知识
6.2.1 二值图像
图像像素只有两种取值:0 黑色、255 白色。形态学操作一般作用在二值图上。
6.2.2 结构元(卷积核 kernel)
形态学所有运算都依赖结构元,就是一个np.uint8矩阵,常用cv2.getStructuringElement()生成。
结构元在图像上滑动,根据核覆盖区域内像素,输出新像素。
# 生成3×3矩形结构元
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
- MORPH_RECT:矩形核,最常用
- MORPH_ELLIPSE:椭圆核
- MORPH_CROSS:十字核
6.3 基础运算:腐蚀与膨胀
| 腐蚀、膨胀是所有形态学操作的底层基础。 |
6.3.1 腐蚀 cv2.erode ()
原理:结构元滑过图像,核覆盖区域只要存在黑色像素 (0),输出就为黑色。
效果:白色物体缩小,吃掉物体边缘,消除细小白色噪点。
适用场景:去除小的白色毛刺、断开细小粘连。
6.3.2 膨胀 cv2.dilate ()
原理:结构元滑过图像,核覆盖区域只要存在白色像素 (255),输出就为白色。
效果:白色物体扩大,填充小孔洞。
适用场景:填补物体内部小黑洞,连接临近断开的物体。
代码示例
import cv2
import numpy as np
img = cv2.imread("test.png",0)
#创建5×5矩形核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
#腐蚀
erode_img = cv2.erode(img, kernel, iterations=1)
#膨胀
dilate_img = cv2.dilate(img, kernel, iterations=1)
cv2.imshow("origin",img)
cv2.imshow("erode腐蚀",erode_img)
cv2.imshow("dilate膨胀",dilate_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
| 参数iterations代表迭代次数,次数越大腐蚀 / 膨胀效果越强。 |
6.4 开运算与闭运算
开、闭运算 = 腐蚀、膨胀的组合运算,直接调用cv2.morphologyEx()。
6.4.1 开运算 cv2.MORPH_OPEN
| 先腐蚀,后膨胀 |
6.4.2 闭运算 cv2.MORPH_CLOSE
| 先膨胀,后腐蚀 |
代码示例
import cv2
import numpy as np
img = cv2.imread("test.png",0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
#开运算:去外部小白噪点
open_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
#闭运算:填补内部黑洞
close_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow("open开运算", open_img)
cv2.imshow("close闭运算", close_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6.5 梯度运算
| 梯度 = 膨胀图像 − 腐蚀图像 |
作用:提取二值图像中物体轮廓。
import cv2
import numpy as np
img = cv2.imread("test.png",0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
gradient_img = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("gradient梯度(轮廓)", gradient_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6.6 顶帽运算、黑帽运算
同样使用cv2.morphologyEx()
6.6.1 顶帽运算 cv2.MORPH_TOPHAT
| 顶帽 = 原图 − 开运算结果 |
6.6.2 黑帽运算 cv2.MORPH_BLACKHAT
| 黑帽 = 闭运算结果 − 原图 |
代码示例
import cv2
import numpy as np
img = cv2.imread("test.png",0)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(7,7))
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow("tophat顶帽(提取小白点)",tophat)
cv2.imshow("blackhat黑帽(提取内部黑洞)",blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
6.7 全部形态学操作对照表
| 操作 | 公式 | 核心作用 |
| 腐蚀 erode | 原图被核腐蚀 | 收缩白色,消除小白毛刺 |
| 膨胀 dilate | 原图被核膨胀 | 扩大白色,填充小黑缝隙 |
| 开运算 OPEN | 先腐蚀→后膨胀 | 去除图像外部白色噪点 |
| 闭运算 CLOSE | 先膨胀→后腐蚀 | 填补物体内部黑色孔洞 |
| 梯度 GRADIENT | 膨胀 − 腐蚀 | 提取物体轮廓边缘 |
| 顶帽 TOPHAT | 原图 − 开运算 | 提取微小白色亮点 |
| 黑帽 BLACKHAT | 闭运算 − 原图 | 提取内部小黑孔洞 / 裂缝 |
6.8 注意
- 形态学最适合二值图像,彩色图一般先转灰度再二值化再做形态学。
- 核kernel大小会直接影响效果,核越大作用越强,根据目标物体大小选择。
- iterations迭代次数,次数越高腐蚀膨胀程度越强。
- 顶帽、黑帽对核尺寸很敏感,核要略大于你想要提取的噪点 / 孔洞。
6.9 本章小结
- 腐蚀、膨胀是形态学基础,其余操作都是二者组合。
- cv2.morphologyEx()是统一接口,传入不同标志实现开、闭、梯度、顶帽、黑帽。
- 开运算去外噪,闭运算填内洞;梯度拿轮廓;顶帽找小白点,黑帽找小黑缺陷。
更多推荐



所有评论(0)