原理
像处理中的腐蚀和膨胀是形态学操作的两个基本概念,它们广泛应用于图像预处理、特征提取和其他图像分析任务。
腐蚀(Erosion)
腐蚀操作可以看作是图像中形状的"收缩"。其基本原理是使用一个结构元素(通常是一个小的矩阵,例如 3x3、5x5 的矩阵),该结构元素在输入图像上滑动,并将结构元素覆盖区域内的像素与结构元素进行比较。
二值图像:对于二值图像,如果结构元素与图像在该区域的像素完全匹配(通常意味着所有对应的像素均为1),则将输出图像中相应的像素设置为1(或保持不变);否则,设置为0(即腐蚀)。
灰度图像:对于灰度图像,腐蚀通常意味着取结构元素覆盖区域内所有像素的最小值。
腐蚀操作的效果是缩小图像中的亮区域并增大暗区域,有助于去除小的白噪声、断开相邻对象和消除细小的 protrusions。
膨胀(Dilation)
膨胀是腐蚀的对偶操作,可以看作是图像中形状的"扩张"。它同样使用一个结构元素在输入图像上滑动,但操作的效果恰恰相反。
二值图像:在二值图像中,只要结构元素与图像在该区域的像素重叠部分包含至少一个1,输出图像中相应的像素就会被设置为1(即膨胀)。
灰度图像:在灰度图像中,膨胀通常取结构元素覆盖区域内所有像素的最大值。
膨胀操作的效果是增大图像中的亮区域并减小暗区域,有助于连接近邻对象、填充对象内的小孔和增加对象边界的尺寸。
综合应用
腐蚀和膨胀通常联合使用以实现更复杂的形态学操作,如开运算(先腐蚀后膨胀)和闭运算(先膨胀后腐蚀)。这些操作对于改善图像数据的结构特征非常有效,广泛应用于图像分割、边缘检测和图像噪声过滤等领域。
代码实现下图
提示
结果图显示了对第一幅图采用不同大小(11,15,45)的方形结构元进行腐蚀和对第二幅图采用大小为3×3的十字形结构元进行膨胀的结果。腐蚀可以通过函数cv2.erode实现,膨胀可以通过函数cv2.dilate实现,结构元可以通过函数cv2.getStructuringElement来定义。
python代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('Fig0905.tif')
img2 = cv2.imread('Fig0907.tif')
img_list = [img1]
img_name_list = ['original']
kernel_size = [11, 15, 45]
for size in kernel_size:
kernel = np.ones((size, size), dtype=np.uint8)
img = cv2.erode(img1, kernel)
img_list.append(img)
img_name_list.append('size=' + str(size))
_, axs = plt.subplots(1, 4)
for i in range(4):
axs[i].imshow(img_list[i], cmap='gray')
axs[i].set_title(img_name_list[i])
axs[i].axis('off')
plt.savefig('erode.jpg')
plt.show()
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
img = cv2.dilate(img2, kernel)
plt.subplot(1, 2, 1)
plt.imshow(img2, cmap='gray')
plt.axis('off')
plt.title('original')
plt.subplot(1, 2, 2)
plt.imshow(img)
plt.axis('off')
plt.title('dilate')
plt.show()
结果展示
总结
形态学操作主要包含:腐蚀,膨胀,开运算,闭运算,形态学梯度运算,顶帽运算,黑帽运算等操作。腐蚀操作与膨胀操作是形态学的运算基础,将腐蚀与膨胀结合,就可以实现开运算,闭运算,形态学梯度等不同形式的运算。
腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩,也可以将小于指定结构体元素的部分去除。腐蚀主要用来“收缩”或者“细化”二值图像中的前景,借此实现去噪声,元素分割等功能。
在腐蚀的过程中,通常使用一个结构元来逐个像素地扫描要被腐蚀的图像,并根据结构元和被腐蚀的图像的关系来确定腐蚀结果。膨胀与腐蚀正好相反,膨胀能对图像的边界进行扩张。膨胀操作将与当前的对象(前景)接触到的背景点合并到当前对象内,从而实现将图像边界点向外扩张。如果图像内的两个对象距离较近,可能在膨胀后连接到一起。