数学形态学是一种应用数学工具,它可用于处理二值图像和灰度图像。本节将介绍与二值图像形态学处理相关的基本操作算子,包括腐蚀、膨胀算子。
目录
1. 引言
数学形态学(Mathematical Morphology)是一种基于集合论、格论和拓扑学的图像处理技术,主要用于分析和处理图像中的形状和结构。它通过定义一系列算子来提取图像中的有用信息,广泛应用于图像分割、边缘检测、噪声去除、形状分析等领域。
数学形态学的核心思想是利用一个称为结构元素(Structuring Element)的模板在图像上进行操作,通过结构元素与图像的相互作用来提取或修改图像的几何特征。结构元素通常是一个小的二值图像(如矩形、圆形等),其形状和大小决定了操作的效果。
数学形态学的基本操作包括:
- 膨胀(Dilation):去除小物体或细节,缩小图像中的亮区域,分离相连的物体。
- 腐蚀(Erosion):填充小孔洞或裂缝,扩大图像中的亮区域,连接断裂的物体。
- 开运算(Opening):去除小物体或噪声,平滑物体的轮廓,保留大物体的形状。
- 闭运算(Closing):填充小孔洞或裂缝,连接接近的物体,平滑物体的轮廓。
使用上述基本操作可以组合使用以实现更复杂的功能:
- 击中-击不中变换(Hit-or-Miss Transform):用于检测特定形状。
- 形态学梯度(Morphological Gradient):用于边缘检测。
- 顶帽变换(Top-Hat Transform):用于提取亮区域中的小物体。
- 底帽变换(Bottom-Hat Transform):用于提取暗区域中的小物体。
2. 构建结构元
结构元(Structuring Element)是数学形态学中的核心概念之一,用于探测和操作图像中的特定形状或结构。
结构元是一个小矩阵或模板,用于定义形态学操作中的邻域关系。它通常是一个二值图像,包含0和1,表示背景和前景。结构元的形状和大小决定了形态学操作的效果。
结构元的属性
- 形状:常见的形状包括矩形、圆形、十字形等,不同形状适用于不同的图像特征。
- 大小:结构元的大小决定了操作的尺度,较大的结构元可以捕捉更大范围的特征。
- 原点:结构元的原点通常位于中心,用于确定操作的位置。
Halcon中定义了多个算子用于创建常见形状的结构元。这些算子都被划归到Region/Creation/路径下。常见的结构元形状包括:圆形、椭圆形、矩形、多边形,以及任意指定形状。下面逐一介绍。
2.1 矩形结构元
Halcon中提供了两种矩形结构元,一种是与坐标轴平行的矩形区域,对应的算子是gen_rectangle1,另一种是任意角度的矩形区域,对应的算子是gen_rectangle2。
算子声明:
gen_rectangle1 ( : Rectangle : Row1, Column1, Row2, Column2 : )
gen_rectangle2 ( : Rectangle : Row, Column, Phi, Length1, Length2 : )
参数说明:
- Rectangle :输出的结构元。
- Row1, Column1:矩形左上角的坐标。
- Row2, Column2:矩形右下角的坐标。
- Row, Column:矩形中心的坐标。
- Phi:矩形的旋转角度(弧度)。
- Length1 和 Length2:矩形的半长和半宽。
2.2 圆形/扇形结构元
Halcon中使用gen_circle算子构建圆形结构元,使用gen_circle_sector算子构建扇形结构元。
算子声明:
gen_circle ( : Circle : Row, Column, Radius : )
gen_circle_sector ( : CircleSector : Row, Column, Radius, StartAngle, EndAngle : )
参数说明:
- Circle:输出的圆形结构元。
- Row 和 Column:圆心的坐标。
- Radius:圆的半径。
- CircleSector:输出的扇形结构元。
- StartAngle/EndAngle:扇形区域起始和结束的角度。
2.3 椭圆形/扇形结构元
Halcon中使用gen_ellipse算子构建椭圆形结构元,使用gen_ellipse_sector算子构建椭圆形扇形结构元。
算子声明:
gen_ellipse ( : Ellipse : Row, Column, Phi, Radius1, Radius2 : )
gen_ellipse_sector ( : EllipseSector : Row, Column, Phi, Radius1, Radius2, StartAngle, EndAngle : )
参数说明:
- Ellipse:输出的椭圆形结构元。
- Row 和 Column:圆心的坐标。
- Phi:长轴(对应Radius1)的方向。
- Radius1/Radius2:长轴/短轴。
- EllipseSector:输出的椭圆扇形结构元。
- StartAngle/EndAngle:椭圆扇形区域起始和结束的角度。
3. 基本操作
数学形态学的基本操作包括:腐蚀、膨胀、开运算、闭运算。每一种算子的定义式见相关文献。
下面逐一介绍各个算子在Halcon中的实现,这些算子都被划归到Morphology/Region/路径下。。
3.1 腐蚀操作
腐蚀操作通过结构元素在图像上滑动,保留结构元素完全包含在图像中的区域,从而去除小物体或细节,缩小图像中的亮区域。
Halcon中实现腐蚀操作的有两个算子:erosion1和erosion2,用于对二值图像或区域进行腐蚀操作。与 erosion1 不同的是,erosion2 允许使用自定义的结构元素,并且可以指定结构元素的参考点(Anchor Point)。另外,还使用erosion_circle和erosion_rectangle1 ,算子分别完成基于圆形结构元和矩形结构元的腐蚀处理。
以下是各个算子声明及使用方法的详细介绍。
算子声明:
erosion1 ( Region, StructElement : RegionErosion : Iterations : )
erosion2 ( Region, StructElement : RegionErosion : Row, Column, Iterations : )
erosion_circle ( Region : RegionErosion : Radius : )
erosion_rectangle1 ( Region : RegionErosion : Width, Height : )
参数说明:
- Region(输入):输入的二值图像区域。
- StructElement(输入):结构元素,用于定义腐蚀操作的形状和大小。可以使用特定算子生成。
- RegionErosion(输出):腐蚀操作后的输出区域。
- Row, Column(输入):结构元素的参考点(Anchor Point),即结构元素的中心位置。默认值为结构元素的中心。
- Iterations(输入):腐蚀操作的迭代次数。迭代次数越多,腐蚀效果越强。
- Radius (输入):腐蚀操作所使用的圆形结构元的半径,默认值是3.5。
- Width, Height (输入):腐蚀操作所使用的矩形结构元的宽度和高度,默认值都是11。
实例代码:
* 读取图像并转换为二值图像
read_image(Image, 'example.png')
threshold(Image, Region, 128, 255)
* 生成一个矩形结构元素
gen_rectangle1(StructElement, 5, 5, 15, 15)
* 对输入区域进行腐蚀操作
erosion1(Region, StructElement, RegionErosion1, 1)
* 生成一个矩形结构元素
gen_rectangle2(StructElement, 10, 10, 0, 5, 5)
* 对输入区域进行腐蚀操作
erosion2(Region, StructElement, RegionErosion2, 10, 10, 1)
* 显示原始区域和腐蚀后的区域
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
dev_display(Region)
dev_set_color('red')
dev_display(RegionErosion1)
dev_set_color('blue')
dev_display(RegionErosion2)
参数选择:
- 结构元素的选择:结构元素的形状和大小直接影响腐蚀效果。较大的结构元素会导致更强烈的腐蚀效果。常见的结构元素包括矩形、圆形、十字形等。
- 迭代次数的选择:迭代次数越多,腐蚀效果越强。但过多的迭代次数可能导致目标区域完全消失。
3.2 膨胀操作
膨胀操作的主要目的是扩大图像中的亮区域(前景),并填充区域中的小孔或连接断裂的部分。
Halcon中实现膨胀操作的有两个算子:dilation1和dilation2,用于对二值图像或区域进行膨胀操作。与 dilation1 不同的是,dilation2 允许使用自定义的结构元素,并且可以指定结构元素的参考点(Anchor Point)。另外,还使用dilation_circle和dilation_rectangle1 ,算子分别完成基于圆形结构元和矩形结构元的膨胀处理。
以下是各个算子声明及使用方法的详细介绍。
算子声明:
dilation1 ( Region, StructElement : RegionDilation : Iterations : )
dilation2 ( Region, StructElement : RegionDilation : Row, Column, Iterations : )
dilation_circle ( Region : RegionDilation : Radius : )
dilation_rectangle1 ( Region : RegionDilation : Width, Height : )
参数说明:
- Region(输入):输入的二值图像区域。
- StructElement(输入):结构元素,用于定义腐蚀操作的形状和大小。可以使用特定算子生成。
- RegionDilation (输出):膨胀操作后的输出区域。
- Row, Column(输入):结构元素的参考点(Anchor Point),即结构元素的中心位置。默认值为结构元素的中心。
- Iterations(输入):膨胀操作的迭代次数。迭代次数越多,膨胀效果越强。
- Radius (输入):膨胀操作所使用的圆形结构元的半径,默认值是3.5。
- Width, Height (输入):膨胀操作所使用的矩形结构元的宽度和高度,默认值都是11。
实例代码:
* 读取图像并转换为二值图像
read_image(Image, 'example.png')
threshold(Image, Region, 128, 255)
* 生成一个矩形结构元素
gen_rectangle1(StructElement, 5, 5, 15, 15)
* 对输入区域进行膨胀操作
dilation1(Region, StructElement, RegionDilation1, 1)
* 生成一个矩形结构元素
gen_rectangle2(StructElement, 10, 10, 0, 5, 5)
* 对输入区域进行膨胀操作
dilation2(Region, StructElement, RegionDilation2, 10, 10, 1)
* 显示原始区域和膨胀后的区域
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
dev_display(Region)
dev_set_color('red')
dev_display(RegionDilation1)
dev_set_color('blue')
dev_display(RegionDilation2)
参数选择:
- 结构元素的选择:结构元素的形状和大小直接影响膨胀效果。较大的结构元素会导致更强烈的膨胀效果。常见的结构元素包括矩形、圆形、十字形等。
- 迭代次数的选择:迭代次数越多,膨胀效果越强。但过多的迭代次数可能导致目标区域的凹陷或内部孔洞完全填充。
3. 复合算子
在形态学操作中,复合算子是由基本形态学运算(如膨胀和腐蚀)组合而成的复杂操作,常用于图像处理中的形状分析和特征提取。
下面依次介绍三种常见的复合算子:开运算、闭运算和击中击不中变换。
3.1 开运算
开运算是先对图像进行腐蚀操作,再进行膨胀操作。其作用是消除图像中的细小噪声、断开狭窄的连接部分,同时保留图像的主要结构特征。开运算常用于平滑物体边界、去除小物体或分离相邻物体。
在Halcon中使用opening、opening_circle和opening_rectangle1几个算子用于开运算,它们之间的差异主要是结构元的形状方面。
算子声明:
- opening ( Region, StructElement : RegionOpening : : )
- opening_circle ( Region : RegionOpening : Radius : )
- opening_rectangle1 ( Region : RegionOpening : Width, Height : )
参数说明:
- Region:输入区域(Region)。
- StructElement:结构元素,用于定义开运算所使用的结构元形状和大小。
- RegionOpening:输出区域,即开运算后的结果。
- Radius:圆形结构元素的半径。
- Width:矩形结构元素的宽度。
- Height:矩形结构元素的高度。
实例代码:
* 读取图像并生成区域
read_image(Image, 'example.png')
threshold(Image, Region, 128, 255)
* 定义结构元素(例如矩形)
gen_rectangle1(StructElement, 5, 5, 15, 15)
* 执行开运算
opening(Region, StructElement, RegionOpening)
* 执行开运算(使用矩形结构元素)
opening_rectangle1(Region, 10, 10, RegionOpening)
* 执行开运算(使用圆形结构元素)
opening_circle(Region, 10, RegionOpening)
3.2 闭运算
闭运算是先对图像进行膨胀操作,再进行腐蚀操作。其作用是填充物体内部的小孔、连接邻近的物体,并平滑物体边界。
闭运算常用于修复断裂的边缘或填充物体内部的空隙。闭运算与开运算互为对偶操作,二者结合可以有效地处理图像中的噪声和形状缺陷。
在Halcon中使用closing、closing_circle和closing_rectangle1几个算子用于闭运算,它们之间的差异主要是结构元的形状方面。
算子声明:
- closing ( Region, StructElement : RegionClosing: : )
- closing_circle ( Region : RegionClosing: Radius : )
- closing_rectangle1 ( Region : RegionClosing: Width, Height : )
参数说明:
- Region:输入区域(Region)。
- StructElement:结构元素,用于定义闭运算所使用的结构元形状和大小。
- RegionOpening:输出区域,即闭运算后的结果。
- Radius:圆形结构元素的半径。
- Width:矩形结构元素的宽度。
- Height:矩形结构元素的高度。
实例代码:
* 读取图像并生成区域
read_image(Image, 'example.png')
threshold(Image, Region, 128, 255)
* 定义结构元素(例如矩形)
gen_rectangle1(StructElement, 5, 5, 15, 15)
* 执行开运算
closing(Region, StructElement, RegionClosing)
* 执行开运算(使用矩形结构元素)
closing_rectangle1(Region, 10, 10, RegionClosing)
* 执行开运算(使用圆形结构元素)
closing_circle(Region, 10, RegionClosing)
3.3 击中击不中运算
击中击不中变换是一种用于检测特定形状或模式的形态学操作。它通过同时匹配图像中的前景和背景结构来定位目标。该操作需要两个结构元素:一个用于匹配前景(击中),另一个用于匹配背景(击不中)。击中击不中变换在形状识别和模板匹配中具有重要应用。
在Halcon中使用hit_or_miss几个算子用于HMT运算。
算子声明:
hit_or_miss ( Region, StructElement1, StructElement2 : RegionHitMiss : Row, Column : )
参数说明:
- Region:输入图像。
- StructElement1:用于匹配前景的结构元素(击中部分)。
- StructElement2:用于匹配背景的结构元素(击不中部分)。
- Row/Column:参考点的坐标,默认值都是16。
- RegionHitMiss:输出区域,即击中击不中变换的结果。
实例代码:
* 读取图像并生成区域
read_image(Image, 'example.png')
threshold(Image, Region, 128, 255)
* 定义前景和背景结构元素
gen_struct_elements(StructElement1, 'rectangle', 5, 5)
gen_struct_elements(StructElement2, 'rectangle', 10, 10)
* 执行击中击不中变换
hit_or_miss(Region, StructElement1, StructElement2, RegionHitMiss)
注:除hit_or_mis算子之外,Halcon还提供了另外两种实现方式,所涉及的算子分别是hit_or_miss_golay和hit_or_miss_seq。
4. 小结
本节介绍了形态学处理的基本概念,以及构建结构元的算子,还有两种基本的形态学操作:腐蚀和膨胀,,以及复合算子开、闭、击中击不中。
在这些算子基础上实现的形态学操作,将在下一节详细介绍。
(初稿完成,最新更新2025-03-13)
本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材基本保持一致。作为学习和实践DIP技术的入门教程。
感谢大家的支持和浏览,本专栏将持续更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。
在专栏全部完成之前,所有内容将一直免费。