形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版
形态学腐蚀算法
前言概念原理步骤效果生成测试图片源码具体算法实现源码总结
前言
形态学腐蚀是数学形态学的基本操作之一,用于处理二值图像。腐蚀操作会收缩图像中的前景区域,消除小的噪声和细连接。该算法在图像预处理、特征提取、边缘检测等领域有重要应用。腐蚀效果取决于结构元素的形状和大小,通过调整参数可以控制腐蚀的强度。形态学操作简单直观,计算效率高,是图像处理中的常用技术。
计算机视觉技术算法 概念+原理+实现
微信视频号:计算机视觉技术
微信公众号:计算机视觉技术




概念
形态学腐蚀是数学形态学中的基本操作,用于处理二值图像。腐蚀操作使用一个结构元素(通常为矩形或圆形)扫描图像。对于图像中的每个像素位置,如果结构元素覆盖区域内的所有像素都是前景(白色),则该位置保留为前景;否则设为背景(黑色)。
腐蚀操作的效果是收缩前景区域。细小的白色区域会被完全腐蚀掉,较厚的区域会变薄。两个原本相连的白色区域,如果连接部分较窄,腐蚀后可能分离。结构元素的大小决定腐蚀的强度,较大的结构元素会产生更强的腐蚀效果。
原理
形态学腐蚀的基本原理是基于集合论中的腐蚀运算。假设A是图像中的前景区域,B是结构元素。腐蚀操作定义为A被B腐蚀的结果,记为A⊖B,是所有满足B平移后完全包含在A中的位置的集合。
在实际实现中,对于图像中的每个像素,检查以该像素为中心的结构元素覆盖区域。如果该区域内的所有像素都是前景(值为255),则输出图像的对应位置设为255;否则设为0。结构元素的形状和大小会影响腐蚀效果。矩形结构元素会产生规则的收缩效果,圆形结构元素会产生平滑的收缩效果。
腐蚀操作的主要功能包括:消除小的白色噪声点、分离连接的对象、细化粗线条、收缩前景区域。腐蚀的程度与结构元素的大小直接相关,结构元素越大,腐蚀效果越强。
步骤
实现形态学腐蚀算法的具体步骤如下:
-
读取二值图像,获取图像的高度和宽度。
-
创建一个与原图大小相同的输出图像矩阵,数据类型为无符号八位整数。
-
设定结构元素的大小。常用的结构元素为3×3或5×5的正方形。
-
遍历图像中的每个像素(边缘像素除外,避免索引越界)。
-
对于当前像素,提取其邻域窗口内的所有像素值,邻域窗口的大小由结构元素决定。
-
检查邻域窗口内的所有像素是否都是前景(值为255)。
-
如果所有像素都是前景,将输出图像的对应位置设为255;否则设为0。
-
对所有像素完成上述处理后,保存输出图像。
-
可选步骤:显示原始图像和腐蚀后图像的对比,评估腐蚀效果。
效果

从上图可以看出,腐蚀操作使图像中的白色区域收缩。上半部的多条长条形在腐蚀后明显变短、变窄,端部收缩效果清晰可见。较粗的线条(厚度6像素)在腐蚀后明显变细,部分区域变得断续。五个小矩形和四个小圆点展示了腐蚀对小区域的消除效果,部分较小的元素被完全腐蚀掉。底部的水平线条(厚度4像素)在腐蚀后变得更细。这种效果体现了腐蚀操作的特性:收缩前景、消除细节、细化线条。腐蚀后的图像保留了主要结构,但去除了小的不重要细节。
生成测试图片源码
生成测试图片的程序创建了一个800×600像素的二值图像。上半部有12条长条形(4条横条、8条竖条),用于展示腐蚀操作对长条形端部和宽度的收缩效果。程序绘制了一个矩形框(厚度6像素)和两条粗线条(厚度6像素),用于展示腐蚀对较粗线条的细化作用。程序还绘制了五个小矩形和四个小圆点,用于展示腐蚀对小区域和噪声的消除作用。底部有一条水平线条(厚度4像素),用于展示腐蚀对不同厚度线条的影响。所有形状都使用白色(灰度值255)在黑色背景上绘制,便于观察腐蚀前后的变化。底部添加了BUTIANYUN.COM文本,距离底部200像素。
import cv2import numpy as npimage_width = 800image_height = 600image = np.zeros((image_height, image_width), dtype=np.uint8)cv2.rectangle(image, (50, 50), (200, 80), 255, -1)cv2.rectangle(image, (250, 50), (400, 80), 255, -1)cv2.rectangle(image, (450, 50), (600, 80), 255, -1)cv2.rectangle(image, (650, 50), (750, 80), 255, -1)cv2.rectangle(image, (50, 100), (200, 180), 255, -1)cv2.rectangle(image, (250, 100), (400, 180), 255, -1)cv2.rectangle(image, (450, 100), (600, 180), 255, -1)cv2.rectangle(image, (650, 100), (750, 180), 255, -1)cv2.rectangle(image, (50, 200), (200, 220), 255, -1)cv2.rectangle(image, (250, 200), (400, 220), 255, -1)cv2.rectangle(image, (450, 200), (600, 220), 255, -1)cv2.rectangle(image, (650, 200), (750, 220), 255, -1)cv2.rectangle(image, (50, 250), (750, 320), 255, 6)cv2.line(image, (50, 350), (750, 350), 255, 6)cv2.line(image, (400, 250), (400, 320), 255, 6)cv2.rectangle(image, (50, 370), (150, 380), 255, -1)cv2.rectangle(image, (200, 370), (300, 380), 255, -1)cv2.rectangle(image, (350, 370), (450, 380), 255, -1)cv2.rectangle(image, (500, 370), (600, 380), 255, -1)cv2.rectangle(image, (650, 370), (750, 380), 255, -1)cv2.rectangle(image, (50, 400), (750, 420), 255, 4)cv2.circle(image, (125, 440), 8, 255, -1)cv2.circle(image, (325, 440), 8, 255, -1)cv2.circle(image, (525, 440), 8, 255, -1)cv2.circle(image, (700, 440), 8, 255, -1)cv2.rectangle(image, (50, 460), (200, 470), 255, -1)cv2.rectangle(image, (250, 460), (400, 470), 255, -1)cv2.rectangle(image, (450, 460), (600, 470), 255, -1)cv2.rectangle(image, (650, 460), (750, 470), 255, -1)text = "BUTIANYUN.COM"text_position = (image_width // 2 - 180, image_height - 200)font_scale = 1.5font_color = 255font_thickness = 3cv2.putText(image, text, text_position, cv2.FONT_HERSHEY_SIMPLEX, font_scale, font_color, font_thickness)cv2.imwrite('butianyun_computer_vision_input.png', image)print('测试图片生成成功')
具体算法实现源码
算法实现的主体是morphological_erosion函数,该函数接收二值图像和结构元素大小作为输入,返回腐蚀后的图像。函数首先创建一个全零的输出图像矩阵,然后使用双重循环遍历图像中的每个像素。对于每个像素,提取其邻域窗口内的所有像素值,邻域窗口的大小由结构元素决定。函数检查邻域窗口内的所有像素是否都是前景(值为255)。如果所有像素都是前景,将输出图像的对应位置设为255;否则设为0。算法默认使用的结构元素大小为3×3。main函数负责读取输入图像、调用腐蚀函数、保存输出图像,并使用matplotlib绘制原图和腐蚀后图像的对比。
# 形态学腐蚀算法是数学形态学中的基础操作。算法使用结构元素(通常是矩形或圆形)# 扫描图像,对于每个像素位置,如果结构元素覆盖区域内的所有像素都是前景(白色),# 则该位置保留为前景,否则设为背景。腐蚀操作会使前景区域收缩,消除小的噪点和连接# 细线,分离连接的对象。腐蚀效果取决于结构元素的形状和大小,较大的结构元素会产生# 更强的腐蚀效果。该算法在图像预处理、特征提取、噪声去除等领域有广泛应用。############################################################# 微信公众号:计算机视觉技术# 微信视频号:计算机视觉技术# 网站 :BUTIANYUN.COM############################################################import cv2import numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']plt.rcParams['axes.unicode_minus'] = Falsedefmorphological_erosion(image, kernel_size=3): height, width = image.shape eroded = np.zeros((height, width), dtype=np.uint8) half = kernel_size // 2for i in range(half, height - half):for j in range(half, width - half): all_foreground = Truefor ki in range(-half, half + 1):for kj in range(-half, half + 1):if image[i + ki, j + kj] == 0: all_foreground = Falsebreakifnot all_foreground:breakif all_foreground: eroded[i, j] = 255else: eroded[i, j] = 0return erodeddefmain(): input_image = cv2.imread('butianyun_computer_vision_input.png', cv2.IMREAD_GRAYSCALE)if input_image isNone: print('无法读取输入图片')return eroded_image = morphological_erosion(input_image, kernel_size=3) cv2.imwrite('butianyun_computer_vision_output.png', eroded_image) plt.figure(figsize=(10, 24)) plt.subplot(2, 1, 1) plt.imshow(input_image, cmap='gray', vmin=0, vmax=255) plt.title('Original Image', fontsize=14) plt.axis('off') plt.subplot(2, 1, 2) plt.imshow(eroded_image, cmap='gray', vmin=0, vmax=255) plt.title('Eroded Image', fontsize=14) plt.axis('off') plt.subplots_adjust(left=0.1, right=0.9, top=0.92, bottom=0.08, hspace=0.2) plt.savefig('形态学腐蚀算法.png', dpi=150, bbox_inches='tight', pad_inches=0.2) plt.show()if __name__ == '__main__': main()
总结
形态学腐蚀算法通过结构元素收缩图像中的前景区域,是数学形态学的基本操作。算法简单直观,计算效率高,在图像预处理、噪声去除、特征提取等领域有广泛应用。腐蚀操作能够消除小的噪声点、细化粗线条、分离连接的对象。腐蚀效果取决于结构元素的形状和大小,通过调整参数可以控制腐蚀的强度。该算法与膨胀、开运算、闭运算等形态学操作配合使用,可以实现更复杂的图像处理任务。


评论