目录

前言

6.1 本章学习目标

6.2 前置理论知识

6.2.1 二值图像

6.2.2 结构元(卷积核 kernel)

6.3 基础运算:腐蚀与膨胀

6.3.1 腐蚀 cv2.erode ()

6.3.2 膨胀 cv2.dilate ()

6.4 开运算与闭运算

6.4.1 开运算 cv2.MORPH_OPEN

6.4.2 闭运算 cv2.MORPH_CLOSE

6.5 梯度运算

6.6 顶帽运算、黑帽运算

6.6.1 顶帽运算 cv2.MORPH_TOPHAT

6.6.2 黑帽运算 cv2.MORPH_BLACKHAT

6.7 全部形态学操作对照表

6.8 注意

6.9 本章小结


承接第 5 章视频处理。形态学操作主要针对二值图像,依靠卷积核(结构元)对图像像素做形态变换,常用于去噪、填充孔洞、提取物体轮廓,是 OpenCV 非常经典的图像处理工具。

6.1 本章学习目标

  1. 理解形态学操作基础:结构元(核)的概念
  2. 掌握腐蚀、膨胀两种最基础运算
  3. 理解开运算、闭运算的作用与使用场景
  4. 学会梯度运算、顶帽运算、黑帽运算
  5. 能够区分不同形态学操作,根据需求选择合适算子

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 注意

  1. 形态学最适合二值图像,彩色图一般先转灰度再二值化再做形态学。
  2. 核kernel大小会直接影响效果,核越大作用越强,根据目标物体大小选择。
  3. iterations迭代次数,次数越高腐蚀膨胀程度越强。
  4. 顶帽、黑帽对核尺寸很敏感,核要略大于你想要提取的噪点 / 孔洞。

6.9 本章小结

  1. 腐蚀、膨胀是形态学基础,其余操作都是二者组合。
  2. cv2.morphologyEx()是统一接口,传入不同标志实现开、闭、梯度、顶帽、黑帽。
  3. 开运算去外噪,闭运算填内洞;梯度拿轮廓;顶帽找小白点,黑帽找小黑缺陷。

更多推荐