朝鲜世界杯_2019篮球世界杯 - dyldrk.com

实用指南:Opencv(五): 腐蚀和膨胀

文章目录前言一、形态学变换的基本概念1. 什么是形态学变换2. 为什么要进行形态学处理二、结构元素(核)的定义与作用1. 什么是结构元素2. 核的选取原则三、腐蚀(Erosion)1. 腐蚀的原理2. 实验效果3. Python 实现四、膨胀(Dilation)1. 膨胀的原理2. 效果分析3. Python 实现五、开运算与闭运算1. 开运算(Opening)2. 闭运算(Closing)六、形态学操作的实验流程Step 1:读取图像并灰度化、二值化Step 2:定义核Step 3:执行不同形态学操作Step 4:展示结果七、参数与结构对结果的影响八、实验现象与分析九、形态学变换的应用场景十、总结

前言在图像处理领域中,“形态学变换(Morphological Transformations)” 是一类基于图像形状结构的处理方法,广泛应用于目标检测、图像分割、边缘提取、噪声去除等任务中。与传统的灰度或频域操作不同,形态学主要针对二值化图像进行几何结构的分析与修改。本文将从理论到实践,系统地讲解形态学的基本原理、常见操作以及 Python 实现方法。

一、形态学变换的基本概念1. 什么是形态学变换形态学变换是基于集合论和数学形态学理论的一种图像处理方式,其核心思想是通过一个被称为**结构元素(Structuring Element)**的核(kernel)在图像上滑动,对目标的形状进行分析和修改。简单来说,它可以“扩张”、“收缩”图像中的白色区域,从而实现去噪、填洞、提取边缘等效果。

形态学操作最初是为了解析二值图像而提出的,但在现代图像处理中,也被广泛用于灰度图像的结构分析。

2. 为什么要进行形态学处理在实际图像中,往往会因为光照变化、噪声干扰等原因导致二值图像出现断裂、毛刺或孔洞。此时,形态学操作可以有效地“修复”图像形态。例如:

腐蚀可以去除细小的噪声;膨胀可以填补物体内部的空洞;开运算可以去除孤立点;闭运算可以连接断裂的边缘。这些操作让图像在后续的目标识别或特征提取中更加干净、完整。

二、结构元素(核)的定义与作用1. 什么是结构元素结构元素可以理解为一个小窗口,在图像上滑动并与图像局部区域进行比较。常见的结构元素形状包括:

矩形核(Rectangular kernel)椭圆核(Elliptical kernel)十字形核(Cross kernel)核的大小通常为 3×3、5×5、7×7 等奇数矩阵。核越大,形态学操作的“影响范围”越广,结果变化越明显。

2. 核的选取原则如果目标物体呈规则形状(如矩形、圆形),可选择对应形状的核;若想保留较细节的边缘,建议选择较小的核;若目标被噪声干扰严重,可使用较大的核来平滑结构。在 OpenCV 中,我们可以通过 cv2.getStructuringElement() 函数生成结构元素:

import cv2

import numpy as np

# 创建不同形状的结构元素

kernel_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))

kernel_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))

kernel_cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (5,5))

三、腐蚀(Erosion)1. 腐蚀的原理腐蚀操作的含义是“侵蚀”或“缩小”白色区域。它会使前景物体的边界向内收缩,从而达到去除细小噪声或断开粘连物体的效果。

在数学上,腐蚀可以表示为:

其中,A 表示原始图像,B 表示结构元素。

通俗理解:核在图像上滑动时,只有当核所覆盖的区域全部为白色(255)时,中心像素才保持白色,否则变为黑色。

2. 实验效果原图(Binary) → 腐蚀后:

亮区域(白色)被“吃掉”,边界收缩;小的白点噪声被完全去除;图像结构变得更加“瘦”。3. Python 实现

import cv2

if __name__ == "__main__":

path = "./test.png"

image_np = cv2.imread(path)

image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY) # 转为灰度图

ret, image_np_thresh = cv2.threshold(image_np_gray, 127, 255, cv2.THRESH_BINARY) # 进行二值化

# 形态学操作

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

morph_images = cv2.erode(image_np_thresh, kernel)

# 返回处理正确后的内容

cv2.imshow("morph_images", morph_images)

cv2.waitKey(0)

输出结果为:原图像为:

腐蚀后为:

参数解释:

iterations 表示腐蚀的次数;次数越多,腐蚀程度越深。四、膨胀(Dilation)1. 膨胀的原理膨胀与腐蚀相反,是一种扩张白色区域的操作。当核覆盖区域内只要有一个白色像素(255),中心像素就会被设为白色。这会导致前景物体“变胖”,并且可以填补孔洞或连接断裂区域。

公式表示为:

2. 效果分析膨胀可以让细线变粗,让断裂的部分连接起来,但也可能导致相邻物体粘连。

3. Python 实现

import cv2

if __name__ == "__main__":

path = "./test.png"

image_np = cv2.imread(path)

image_np_gray = cv2.cvtColor(image_np, cv2.COLOR_BGR2GRAY) # 转为灰度图

ret, image_np_thresh = cv2.threshold(image_np_gray, 127, 255, cv2.THRESH_BINARY) # 进行二值化

# 形态学操作

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

morph_images = cv2.dilate(image_np_thresh, kernel)

# 返回处理正确后的内容

cv2.imshow("morph_images", morph_images)

cv2.waitKey(0)

输出结果为:原图像还是不变

五、开运算与闭运算1. 开运算(Opening)开运算 = 先腐蚀再膨胀 其主要功能是去除噪声,保留主要结构。

opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

应用:用于消除小型白点噪声而不影响整体结构。

2. 闭运算(Closing)闭运算 = 先膨胀再腐蚀 它的主要功能是填补物体内部的小孔或连接细小断裂。

closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

应用:可平滑物体边缘、修复断裂区域。

六、形态学操作的实验流程下面以一个简单实验为例,展示完整的处理步骤。

Step 1:读取图像并灰度化、二值化

img = cv2.imread('demo.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

Step 2:定义核

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))

Step 3:执行不同形态学操作

erosion = cv2.erode(binary, kernel)

dilation = cv2.dilate(binary, kernel)

opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)

closing = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)

Step 4:展示结果

cv2.imshow('Original', binary)

cv2.imshow('Erosion', erosion)

cv2.imshow('Dilation', dilation)

cv2.imshow('Opening', opening)

cv2.imshow('Closing', closing)

cv2.waitKey(0)

cv2.destroyAllWindows()

七、参数与结构对结果的影响通过调整核的大小、形状和迭代次数,可以显著改变结果。例如:

核大小腐蚀效果膨胀效果3×3边缘轻微收缩轻微扩张5×5明显收缩明显扩张7×7丢失细节容易粘连核形状的选择也很关键:

矩形核:通用型,适合大多数目标;椭圆核:平滑边缘;十字核:保留线条状结构。八、实验现象与分析通过对比腐蚀、膨胀、开运算、闭运算的结果,我们可以观察到:

腐蚀使目标“变瘦”,噪声减少;膨胀让目标“变胖”,填补空洞;开运算去除孤立白点;闭运算修复断裂边缘;当核尺寸过大时,细节损失严重;适当调整迭代次数,可以平衡噪声抑制与形态保留。实验中常见的问题:

若二值化阈值过低,形态学操作会放大噪声;若图像边缘过细,腐蚀后可能导致目标断裂;若核过大,膨胀后目标容易粘连。九、形态学变换的应用场景形态学操作是许多图像分析任务的“前置清洗”步骤:

噪声去除 开运算常用于消除小白点或孤立噪声。

边缘提取 通过膨胀与腐蚀的差值可以提取目标边缘:

edge = cv2.absdiff(cv2.dilate(binary, kernel), cv2.erode(binary, kernel)) 目标分割 在分水岭算法、连通域分析前,通过形态学变换可提升目标的连贯性。

OCR 预处理 对文本图像进行闭运算,可有效连接断裂的笔画,提升识别率。

车道线检测、医学影像分析 形态学操作在细线提取、组织边界识别等任务中都发挥重要作用。

十、总结形态学变换是图像处理中的重要基础工具,它以结构化的方式从几何形态层面修正图像。腐蚀、膨胀、开闭运算等基本操作的组合,为各种视觉算法提供了强大的支持。在实际工程中,熟练掌握这些操作及其参数调节方法,能够显著提升图像质量与识别效果。