图像形态学操作是一种用于处理图像的技术,腐蚀(Erosion)是其中之一,它可以使图像中的物体边缘变得模糊或缩小。腐蚀操作利用结构元素(Kernel)在图像上滑动,将该结构元素覆盖区域内的像素值更新为邻域内像素值的最小值。这样可以减少图像中物体边缘的尺寸,去除小的噪点或连接物体等。结构元素的大小和形状会影响腐蚀的效果,更大的结构元素会导致更明显的腐蚀效果,而不同形状的结构元素也会对腐蚀产生不同的影响。
在数学上,腐蚀操作可以用数学形式表示为:
Output
(
x
,
y
)
=
min
(
s
,
t
)
∈
kernel
Input
(
x
+
s
,
y
+
t
)
\text{Output}(x, y) = \min_{(s, t) \in \text{kernel}} \text{Input}(x + s, y + t)
Output(x,y)=(s,t)∈kernelminInput(x+s,y+t)
其中
Input
(
x
,
y
)
\text{Input}(x, y)
Input(x,y) 是原始图像在位置
(
x
,
y
)
(x, y)
(x,y) 的像素值,
Output
(
x
,
y
)
\text{Output}(x, y)
Output(x,y) 是腐蚀后的图像在位置
(
x
,
y
)
(x, y)
(x,y) 的像素值。
(
s
,
t
)
(s, t)
(s,t) 是结构元素(Kernel)中的坐标。
适用场景:
- 去除小的噪点或细小的物体;
- 缩小物体的尺寸或断开连接的部分;
- 分割图像中的物体。
下面是使用 Python 和 OpenCV 库进行腐蚀操作的示例代码:
import cv2
import numpy as np
def show_images(image):
cv2.namedWindow('image',cv2.WINDOW_KEEPRATIO)
cv2.imshow('image',image)
cv2.waitKey()
cv2.destroyAllWindows()
def Erosion(image):
# 定义结构元素(这里使用一个 5x5 的正方形结构元素)
kernel = np.ones((5, 5), np.uint8)
# 进行腐蚀操作
erosion = cv2.erode(image, kernel, iterations=1)
return erosion
if __name__ == '__main__':
# 读取图像
img = cv2.imread('cat-dog.png', flags=0)
re_img=Erosion(img)
# top_row = np.hstack((img, re_img[0]))
# bottom_row = np.hstack((re_img[1], re_img[2])) #水平
# combined_img = np.vstack((img, re_img))# 垂直
combined_img=np.hstack((img,re_img))
show_images(combined_img)