形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版

chengsenw 项目开发评论2阅读模式

形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版

形态学腐蚀算法

前言概念原理步骤效果生成测试图片源码具体算法实现源码总结

前言

形态学腐蚀是数学形态学的基本操作之一,用于处理二值图像。腐蚀操作会收缩图像中的前景区域,消除小的噪声和细连接。该算法在图像预处理、特征提取、边缘检测等领域有重要应用。腐蚀效果取决于结构元素的形状和大小,通过调整参数可以控制腐蚀的强度。形态学操作简单直观,计算效率高,是图像处理中的常用技术。


计算机视觉技术算法 概念+原理+实现

微信视频号:计算机视觉技术

微信公众号:计算机视觉技术

形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版
计算机视觉技术算法 概念+原理+实现Python版

形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版
微信视频号:计算机视觉技术

形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版
微信公众号:计算机视觉技术

感谢您的关注!

形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版
计算机视觉技术

概念

形态学腐蚀是数学形态学中的基本操作,用于处理二值图像。腐蚀操作使用一个结构元素(通常为矩形或圆形)扫描图像。对于图像中的每个像素位置,如果结构元素覆盖区域内的所有像素都是前景(白色),则该位置保留为前景;否则设为背景(黑色)。

腐蚀操作的效果是收缩前景区域。细小的白色区域会被完全腐蚀掉,较厚的区域会变薄。两个原本相连的白色区域,如果连接部分较窄,腐蚀后可能分离。结构元素的大小决定腐蚀的强度,较大的结构元素会产生更强的腐蚀效果。

原理

形态学腐蚀的基本原理是基于集合论中的腐蚀运算。假设A是图像中的前景区域,B是结构元素。腐蚀操作定义为A被B腐蚀的结果,记为A⊖B,是所有满足B平移后完全包含在A中的位置的集合。

在实际实现中,对于图像中的每个像素,检查以该像素为中心的结构元素覆盖区域。如果该区域内的所有像素都是前景(值为255),则输出图像的对应位置设为255;否则设为0。结构元素的形状和大小会影响腐蚀效果。矩形结构元素会产生规则的收缩效果,圆形结构元素会产生平滑的收缩效果。

腐蚀操作的主要功能包括:消除小的白色噪声点、分离连接的对象、细化粗线条、收缩前景区域。腐蚀的程度与结构元素的大小直接相关,结构元素越大,腐蚀效果越强。

步骤

实现形态学腐蚀算法的具体步骤如下:

  1. 读取二值图像,获取图像的高度和宽度。

  2. 创建一个与原图大小相同的输出图像矩阵,数据类型为无符号八位整数。

  3. 设定结构元素的大小。常用的结构元素为3×3或5×5的正方形。

  4. 遍历图像中的每个像素(边缘像素除外,避免索引越界)。

  5. 对于当前像素,提取其邻域窗口内的所有像素值,邻域窗口的大小由结构元素决定。

  6. 检查邻域窗口内的所有像素是否都是前景(值为255)。

  7. 如果所有像素都是前景,将输出图像的对应位置设为255;否则设为0。

  8. 对所有像素完成上述处理后,保存输出图像。

  9. 可选步骤:显示原始图像和腐蚀后图像的对比,评估腐蚀效果。

效果

形态学腐蚀算法 计算机视觉技术算法 概念+原理+实现Python版
形态学腐蚀算法

从上图可以看出,腐蚀操作使图像中的白色区域收缩。上半部的多条长条形在腐蚀后明显变短、变窄,端部收缩效果清晰可见。较粗的线条(厚度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, (5050), (20080), 255-1)cv2.rectangle(image, (25050), (40080), 255-1)cv2.rectangle(image, (45050), (60080), 255-1)cv2.rectangle(image, (65050), (75080), 255-1)cv2.rectangle(image, (50100), (200180), 255-1)cv2.rectangle(image, (250100), (400180), 255-1)cv2.rectangle(image, (450100), (600180), 255-1)cv2.rectangle(image, (650100), (750180), 255-1)cv2.rectangle(image, (50200), (200220), 255-1)cv2.rectangle(image, (250200), (400220), 255-1)cv2.rectangle(image, (450200), (600220), 255-1)cv2.rectangle(image, (650200), (750220), 255-1)cv2.rectangle(image, (50250), (750320), 2556)cv2.line(image, (50350), (750350), 2556)cv2.line(image, (400250), (400320), 2556)cv2.rectangle(image, (50370), (150380), 255-1)cv2.rectangle(image, (200370), (300380), 255-1)cv2.rectangle(image, (350370), (450380), 255-1)cv2.rectangle(image, (500370), (600380), 255-1)cv2.rectangle(image, (650370), (750380), 255-1)cv2.rectangle(image, (50400), (750420), 2554)cv2.circle(image, (125440), 8255-1)cv2.circle(image, (325440), 8255-1)cv2.circle(image, (525440), 8255-1)cv2.circle(image, (700440), 8255-1)cv2.rectangle(image, (50460), (200470), 255-1)cv2.rectangle(image, (250460), (400470), 255-1)cv2.rectangle(image, (450460), (600470), 255-1)cv2.rectangle(image, (650460), (750470), 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=(1024))    plt.subplot(211)    plt.imshow(input_image, cmap='gray', vmin=0, vmax=255)    plt.title('Original Image', fontsize=14)    plt.axis('off')    plt.subplot(212)    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()

总结

形态学腐蚀算法通过结构元素收缩图像中的前景区域,是数学形态学的基本操作。算法简单直观,计算效率高,在图像预处理、噪声去除、特征提取等领域有广泛应用。腐蚀操作能够消除小的噪声点、细化粗线条、分离连接的对象。腐蚀效果取决于结构元素的形状和大小,通过调整参数可以控制腐蚀的强度。该算法与膨胀、开运算、闭运算等形态学操作配合使用,可以实现更复杂的图像处理任务。

 
chengsenw
  • 本文由 chengsenw 发表于 2026年2月1日 18:19:33
  • 转载请务必保留本文链接:https://www.gewo168.com/10913.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: