opencv 形态学-腐蚀操作

7 min read

在图像处理和计算机视觉中,形态学是一种广泛应用的工具,特别是在二值或二进制图像处理中。腐蚀(Erosion)是形态学操作中的一种。

腐蚀操作的基本思想是用一个结构元素(structuring element)在原始图像上滑动,如果结构元素内所有的像素点都是1(对于二进制图像,1代表白色,0代表黑色),则保留该中心像素点的值,否则将该像素点设为0。结构元素可以是任何形状和大小,常见的有圆形、方形和十字形。

通过腐蚀操作,可以实现以下几点:

消除小的噪声点:如果一些小的噪声点(像素)小于结构元素的大小,那么它们将被消除。
分离相互接触的物体:如果两个物体在图像中接触,那么腐蚀可以帮助将它们分离。
减小物体的大小:通过腐蚀,物体的边缘部分将被"腐蚀"掉,导致物体整体减小。
对应的,形态学中还有一种相反的操作叫做膨胀(Dilation),它会增加物体的大小并连接靠近的物体。常常,腐蚀和膨胀会联合使用,形成开运算(Opening)和闭运算(Closing)以达到更多的图像处理目标。

在 OpenCV 中,腐蚀操作可以使用函数 cv2.erode() 实现。它的语法是:

dst = cv2.erode(src, kernel, iterations=None, anchor=None, borderType=None, borderValue=None)

其中,参数 src 是原始图像,kernel 是结构元素,iterations 是腐蚀操作的迭代次数,anchor 是锚点的位置,可以是 (-1,-1) 表示位置在结构元素的中心,borderType 和 borderValue 是扩展边界的条件和值,常使用的是 cv2.BORDER_CONSTANT 和 0。

下面的代码演示了如何在 OpenCV 中实现腐蚀操作:

import cv2
import numpy as np

img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
kernel = np.ones((5,5), np.uint8)
dst = cv2.erode(img, kernel, iterations=1)

cv2.imshow('Erosion', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

首先,读入一张灰度图像。创建一个 5x5 的圆形结构元素,并将其作为参数传入 cv2.erode() 函数中。迭代次数为 1,也可以根据需要进行调整。最后,使用 cv2.imshow() 显示腐蚀后的图像。

下图分别是原始图像和经过腐蚀后的图像:

image