前言
在数字图像处理领域,形态学变换是一种强大的工具,它通过对图像进行数学上的形态操作,可以有效地提取图像特征、增强图像对比度、去除噪声等。形态学变换基于数学形态学理论,其核心思想是利用结构元素与图像进行对比和运算,从而得到具有特定形态特征的新图像。
形态学变换包括膨胀、腐蚀、开运算、闭运算、顶帽运算和黑帽运算等。这些变换在图像处理中具有广泛的应用,如边缘检测、噪声去除、特征提取、图像分割等。
本文将介绍形态学变换的基本原理和常见算法,以及它们在实际应用中的重要作用。通过深入探讨形态学变换的原理和应用,读者可以更好地理解形态学变换在图像处理中的作用,并在实际工作中更好地运用这一技术。
一、形态学变换是什么?
形态学变换是一种基于数学形态学的图像处理技术,它通过对图像进行结构元素与像素值之间的运算,实现对图像特征的提取和图像质量的改善。形态学变换通常有以下几种情况。
- 膨胀:膨胀是形态学变换中最基本的操作,通过将结构元素在图像上移动,并将结构元素覆盖的像素值与结构元素的值进行逻辑与运算,得到膨胀后的图像。膨胀可以用于去除噪声和填补空洞。
- 腐蚀:腐蚀是膨胀的逆运算,通过将结构元素在图像上移动,并将结构元素覆盖的像素值与结构元素的值进行逻辑与运算,得到腐蚀后的图像。腐蚀可以用于提取图像的轮廓和骨架。
- 开运算:开运算是由膨胀和腐蚀组成的复合运算,先进行腐蚀,再进行膨胀。开运算可以用于去除图像中的小噪声和细节,同时保持较大的结构。
- 闭运算:闭运算是由腐蚀和膨胀组成的复合运算,先进行膨胀,再进行腐蚀。闭运算可以用于填补图像中的空洞和细节,同时保持较大的结构。
- 顶帽运算:顶帽运算是由膨胀和原图像组成的复合运算,先进行膨胀,再从原图像中减去膨胀后的图像。顶帽运算可以用于增强图像中的暗部细节。
- 黑帽运算:黑帽运算是由腐蚀和原图像组成的复合运算,先进行腐蚀,再从原图像中减去腐蚀后的图像。黑帽运算可以用于增强图像中的亮部细节。
形态学变换在图像处理中具有广泛的应用,如噪声去除、特征提取、图像分割等。通过合理选择结构元素和运算顺序,可以实现对图像的有效处理。
二、腐蚀与膨胀
腐蚀与膨胀是形态学变换中的两种基本操作, 它们互为对偶的运算。腐蚀的作用是将目标图像收缩,而膨胀是将图像扩大,它们都基于数学形态学原理,用于改变图像的形状和结构。
2.1 腐蚀
腐蚀是一种侵蚀性操作,它通过将一个结构元素(通常是方形或圆形)在图像上滑动,并对每个像素点应用该结构元素。在腐蚀过程中,结构元素的中心像素值与图像上相应位置的像素值进行比较,如果图像上的像素值小于结构元素中心像素值,则将该像素值替换为结构元素中心像素值,否则保持不变。
用卷积来描述腐蚀操作,结构元素 B 是中心为 1、其它为 0 的卷积模板(核):
(1)卷积核 B 沿着图像滑动,扫描图像 A 的每一个像素;
(2)用结构元素与其覆盖的二值图像进行与运算即如果图像与卷积核对应区域的所有像素值都是 1,则图像的该像素值仍为 1;否则为 0。
在opencv中实现腐蚀操作的函数为:dst = cv2.erode(src, kernel, iterations=1, borderType=cv2.BORDER_DEFAULT, dst=None)
参数说明
src: 输入图像,可以是灰度图像或者彩色图像。
kernel: 腐蚀使用的结构元素。它是一个二维数组,代表了腐蚀操作的形状和大小。
iterations: 腐蚀操作的迭代次数。默认值为 1,表示进行一次腐蚀操作。
borderType: 边界类型,用于处理图像边界。默认值为 cv2.BORDER_DEFAULT。
dst: 输出图像,可以是一个预先分配的图像,如果不指定,则函数会自动分配。
2.2 膨胀
膨胀是一种扩张性操作,它同样使用一个结构元素在图像上滑动,但与腐蚀相反,如果结构元素覆盖的像素值小于或等于结构元素中心像素值,则将该像素值替换为结构元素中心像素值。
膨胀同样用卷积来描述膨胀操作,结构元素 B 是中心为 1、其它为 0 的卷积模板(核):
(1)卷积核 B 沿着图像滑动,扫描图像 A 的每一个像素;
(2)用结构元素与其覆盖的二值图像进行或运算即如果图像与卷积核对应区域的所有像素值都是 0,则图像的该像素值仍为 0;否则为 1。
示意图:
opencv函数为:dst = cv2.dilate(src, kernel, iterations=1, borderType=cv2.BORDER_DEFAULT, dst=None)
参数说明
src: 输入图像,可以是灰度图像或者彩色图像。
kernel: 膨胀使用的结构元素。它是一个二维数组,代表了膨胀操作的形状和大小。
iterations: 膨胀操作的迭代次数。默认值为 1,表示进行一次膨胀操作。
borderType: 边界类型,用于处理图像边界。默认值为 cv2.BORDER_DEFAULT。
dst: 输出图像,可以是一个预先分配的图像,如果不指定,则函数会自动分配。
三、开运算与闭运算
开运算和闭运算都是形态学变换中的复合操作,它们结合了腐蚀和膨胀两种基本操作,用于在图像处理中实现特定的效果。
开运算是由腐蚀操作和膨胀操作组成的复合操作。它首先对图像应用腐蚀操作,然后对腐蚀后的结果应用膨胀操作。其可以用来消除小物体、在纤细点处分离物体、并且在平滑较大物体的边界的同时并不明显改变其面积,消除物体表面的突起。
闭运算与开运算相反,闭运算是由膨胀操作和腐蚀操作组成的复合操作。它首先对图像应用膨胀操作,然后对膨胀后的结果应用腐蚀操作。闭运算的作用是能够填充图像中的空洞,同时保留较大的结构。它通常用于预处理步骤,如在边缘检测之前填充空洞,以提高边缘检测的准确性。
在opencv中实现开闭运算的函数为dst = cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, borderType=None)
函数介绍:
rc: 输入图像,可以是灰度图像或者彩色图像。
op: 操作类型,可以是以下几种:
cv2.MORPH_OPEN:开运算。
cv2.MORPH_CLOSE:闭运算。
cv2.MORPH_GRADIENT:形态学梯度。
cv2.MORPH_TOPHAT:顶帽运算。
cv2.MORPH_BLACKHAT:黑帽运算。
cv2.MORPH_HITMISS:击中击不中变换。
kernel: 结构元素,用于形态学操作。
dst: 输出图像,可以是一个预先分配的图像,如果不指定,则函数会自动分配。
anchor: 结构元素的锚点位置,默认值为 (-1, -1),表示锚点位于核中心。
borderType: 边界类型,用于处理图像边界,默认值为 cv2.BORDER_DEFAULT。
使用案例:
import os
import cv2
# 不同的结构元 大小为5*5
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
img = cv2.resize(cv2.imread(r"E:\PS\1701054563143.png",0), (256,256))
img2 = cv2.resize(cv2.imread(r"E:\PS\1701054586943.png",0), (256,256))
open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel1) # 对图像img进行开运算
close = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, kernel1) # 对图像img2进行闭运算
grad1 = dia - erode # 计算图像梯度
cv2.imshow("open",open)
cv2.imshow("close",close)
cv2.waitKey(0)
效果: