基础篇14-二值图像数学形态学(上)--基本操作算子

数学形态学是一种应用数学工具,它可用于处理二值图像和灰度图像。本节将介绍与二值图像形态学处理相关的基本操作算子,包括腐蚀、膨胀算子。

目录

1.  引言

2. 构建结构元 

2.1 矩形结构元

2.2 圆形/扇形结构元

2.3 椭圆形/扇形结构元

3. 基本操作 

3.1 腐蚀操作

3.2 膨胀操作

 3.  复合算子

3.1 开运算

3.2 闭运算

3.3 击中击不中运算

4.  小结

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中实现腐蚀操作的有两个算子:erosion1erosion2,用于对二值图像或区域进行腐蚀操作。与 erosion1 不同的是,erosion2 允许使用自定义的结构元素,并且可以指定结构元素的参考点(Anchor Point)。另外,还使用erosion_circleerosion_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中实现膨胀操作的有两个算子:dilation1dilation2,用于对二值图像或区域进行膨胀操作。与 dilation1 不同的是,dilation2 允许使用自定义的结构元素,并且可以指定结构元素的参考点(Anchor Point)。另外,还使用dilation_circledilation_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中使用openingopening_circleopening_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中使用closingclosing_circleclosing_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_golayhit_or_miss_seq

4.  小结

本节介绍了形态学处理的基本概念,以及构建结构元的算子,还有两种基本的形态学操作:腐蚀和膨胀,,以及复合算子开、闭、击中击不中。

在这些算子基础上实现的形态学操作,将在下一节详细介绍。

(初稿完成,最新更新2025-03-13)

本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材基本保持一致。作为学习和实践DIP技术的入门教程。

感谢大家的支持和浏览,本专栏将持续更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。

在专栏全部完成之前,所有内容将一直免费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值