← 返回首页
形态学变换
发表时间:2025-02-14 08:13:50
形态学变换

形态学变换是一种基于形状的图像处理技术,主要应用于二值化图像。基本操作包括膨胀和腐蚀,它们的组合形成开运算、闭运算和形态学梯度等高级操作。膨胀使亮区扩大,腐蚀则减小亮区。开运算用于消除小物体,闭运算填补内部空洞并连接物体。形态学梯度则有助于保留边缘轮廓。

1.腐蚀与膨胀

形态学处理又可理解为形态学变换(Morphological Transformations),是一种基于形状的简单变换。它的处理对象通常是二值化图像(也常用于彩色图像)。通常,形态学变换有两个输入,一个输出:

形态学变换的两个基本操作就是腐蚀与膨胀。

腐蚀(Erosion):相当于给图片里的物体“减肥”。同样把结构元素放在图像上,如果结构元素覆盖的区域没有目标物体,就把结构元素覆盖的区域里的目标物体去掉。这样物体的边界会向内收缩,看起来变小了。比如,一个粗大的线条在腐蚀后会变细。

膨胀(Dilation):就像给图片里的物体“长胖”。把结构元素放在图像上,如果结构元素覆盖的区域有目标物体(比如黑色的物体在白色背景上),就把结构元素覆盖的区域都变成目标物体,这样物体的边界会向外扩展,看起来更大了。比如,一个细小的裂缝在膨胀后会变宽。

这两种操作可以用来去除图像中的噪声、填补小孔、分离粘连的物体等。

2.腐蚀与膨胀实现

腐蚀/膨胀核常见有以下三种形式:

以5*5的腐蚀核为例,下图从左到右依次是矩形结构元素(膨胀后的图像细节为矩形)、十字结构元素(膨胀后的图像细节为十字)和椭圆结构元素(膨胀后的图像细节为椭圆形):

腐蚀算法步骤: 1)扫描原图,找到第一个像素值为1的目标点。 2)将预设好形状及原点位置的结构元素的原点移到该点。 3)判断该结构元素所覆盖的像素值是否全部为1。 是: 腐蚀后图像中相同位置上像素值为1。 否: 腐蚀后图像中相同位置上像素值为0。 4)重复2和3,直到所有原图中像素处理完成。

代码实现:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('./images/jpg/yongzi.jpg', 0)  # 0 表示以灰度模式读取

# 定义结构元素,这里使用矩形结构元素
kernel = np.ones((15,15), np.uint8)

# 应用腐蚀操作
eroded_image = cv2.erode(image, kernel, iterations=1)

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Eroded Image', eroded_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀算法步骤:

1)扫描原图,找到第一个像素值为0的背景点; 2)将预先设定好形状以及原点位置的结构元素的原点移到该点; 3)判断该结构元素所覆盖的像素值是否存在为1的目标点: 是:膨胀后图像中的相同位置上的像素值为1; 否:膨胀后图像中的相同位置上的像素值为0; 4)重复2)和3),直到所有原图中像素处理完成。

可以看出膨胀算法与腐蚀算法仅第一步有所不同,它们是一对逆运算。

代码实现:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('./images/jpg/yongzi.jpg', 0)  # 0表示以灰度模式读取

# 定义结构元素
kernel = np.ones((15, 15), np.uint8)

# 应用膨胀操作
dilated_image = cv2.dilate(image, kernel, iterations=1)

# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Dilated Image', dilated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()