数学形态学是一种应用数学工具,它可用于处理二值图像和灰度图像。本节将介绍与二值图像形态学处理相关的组合操作算子,包括开、闭、击中击不中,以及在此基础上实现的形态学操作。
目录
1. 形态学操作
使用上一节介绍的形态学各种基本操作,可以衍生出许多高级形态学处理方法,如边界提取、剪枝、骨架化、细化、粗化、顶帽/底帽变换等。
基于形态学基本操作的高级处理方法在图像处理中具有广泛的应用,包括:
- 边界提取:用于获取物体轮廓。
- 剪枝:用于去除细小分支。
- 顶帽变换和底帽变换:用于提取细小亮区域或暗区域。
Halcon中提供的形态学算子,一部分来自,另一部分来自Legacy/Morphology/目录下。
1.1 边界提取
Halcon使用boundary算子用于从区域中提取边界(轮廓)。它通过形态学操作实现,能够生成单像素宽度的边界。
算子声明:
- boundary ( Region : RegionBorder : BoundaryType : )
参数说明:
- Region(输入参数):输入的区域,表示需要提取边界的对象。
- BoundaryRegion(输出参数):输出的边界区域,表示提取的边界。
- BoundaryType(输入参数):边界提取的类型,支持以下选项:
'inner':提取内部边界(默认值)。
'outer':提取外部边界。
'inner_filled':提取内部边界并填充内部区域。
'outer_filled':提取外部边界并填充外部区域。
实例代码:
* 读取图像
read_image(Image, 'example.png')
* 将图像转换为区域
threshold(Image, Region, 128, 255)
* 提取内部边界
boundary(Region, InnerBoundary, 'inner')
* 提取外部边界
boundary(Region, OuterBoundary, 'outer')
* 提取内部边界并填充内部区域
boundary(Region, InnerFilledBoundary, 'inner_filled')
* 提取外部边界并填充外部区域
boundary(Region, OuterFilledBoundary, 'outer_filled')
* 显示结果
dev_display(Image)
dev_set_color('red')
dev_display(InnerBoundary)
dev_set_color('green')
dev_display(OuterBoundary)
dev_set_color('blue')
dev_display(InnerFilledBoundary)
dev_set_color('yellow')
dev_display(OuterFilledBoundary)
使用说明:
- 'inner':提取区域的内部边界,即物体与背景的交界处。结果是一个单像素宽度的轮廓。
- 'outer':提取区域的外部边界,即物体外部的轮廓。结果是一个单像素宽度的轮廓。
- 'inner filled':提取内部边界,并填充边界内部的区域。结果是边界及其内部区域。
- 'outer_filled':提取外部边界,并填充边界外部的区域。结果是边界及其外部区域。
注意事项:
- boundary 算子只能处理区域(Region),不能直接处理图像(Image)。如果输入是图像,需要先通过 threshold、connection 等算子生成区域。
- 提取的边界是单像素宽度的,适合用于精确的轮廓分析。
- 如果需要更复杂的边界处理(如多像素宽度边界),可以结合 dilation 或 erosion 算子实现。
1.2 孔洞填充
Halcon使用fill_up算子和fill_up_shape算子填充区域或区域中的孔洞的算子。它们的主要区别在于填充的条件和方式。
算子声明:
- fill_up ( Region : RegionFillUp : : )
- fill_up_shape ( Region : RegionFillUp : Feature, Min, Max : )
参数说明:
- Region: 输入区域。
- RegionFillUp: 输出的填充区域。
- Feature: 区域特征,用于选择填充条件。常见特征包括:'area': 区域面积。'width': 区域宽。
'height': 区域高度。'compactness': 区域紧凑度。 - Min/Max: 特征的最小值和最大值。
使用方法:
- 条件填充:根据指定的区域特征(如面积、宽度等)填充符合条件的孔洞。
- 选择特征和条件:根据需求设置特征(如面积)和范围(如最小值和最大值)。
实例代码:
read_image(Image, 'example_image') // 读取图像
threshold(Image, Region, 128, 255) // 阈值分割,获取区域
fill_up(Region, RegionFillUp) // 填充区域中的孔洞
fill_up_shape(Region, RegionFillUp, 'area', 'and', 100, 1000) // 填充面积在100到1000之间的孔洞
两者比较:
- fill_up:简单填充所有孔洞。适用于不需要条件限制的填充任务。
- fill_up_shape:根据区域特征(如面积、宽度等)有条件地填充孔洞。适用于需要精确控制的填充任务。
1.3 剪枝
Halcon使用pruning算和子用于对骨架图像进行修剪,去除多余的分支,保留主要结构。它常用于图像处理中的骨架化操作后处理。
算子声明:
- pruning ( Region : RegionPrune : Length : )
参数说明:
- Region(输入参数):输入的区域,表示需要进行剪枝的对象。
- RegionPrune(输出参数):输出的剪枝结果。
- Length(输入参数):被去除的剪枝的长度,默认值是2:
实例代码:
* 读取图像
read_image(Image, 'example_image.png')
* 将图像转换为灰度图像
rgb1_to_gray(Image, GrayImage)
* 对图像进行二值化处理
threshold(GrayImage, Region, 128, 255)
* 对二值化后的区域进行骨架化处理
morph_skeleton(Region, Skeleton)
* 对骨架图像进行修剪,移除长度为10的分支
pruning(Skeleton, RegionPruned, 10)
* 显示原始骨架图像和修剪后的图像
dev_display(Skeleton)
dev_display(PrunedRegion)
1.4 骨架化
Halcon使用morph_skeleton算子计算区域的形态学骨架信息。形态学骨架是区域的一种简化表示,能够保留区域的拓扑结构和形状特征,同时去除冗余信息。它通常用于图像分析、形状识别等任务。
算子声明:
- morph_skeleton ( Region : RegionSkeleton : : )
参数说明:
- Region: 输入的区域(Region),通常是二值化后的区域。
- Skeleton: 输出的形态学骨架区域。
实例代码:
* 读取图像
read_image(Image, 'example_image.png')
* 将图像转换为灰度图像
rgb1_to_gray(Image, GrayImage)
* 对图像进行二值化处理
threshold(GrayImage, Region, 128, 255)
* 计算形态学骨架
morph_skeleton(Region, Skeleton)
* 显示原始区域和形态学骨架
dev_display(Region)
dev_display(Skeleton)
注意事项:
- 输入区域:morph_skeleton的输入区域应为二值化后的区域(Region),即只有前景和背景的区域。
- 输出骨架:输出的骨架区域是单像素宽度的线条,保留了原始区域的拓扑结构和形状特征。
- 与skeleton算子的区别:skeleton算子计算的是拓扑骨架,适用于任何区域。morph_skeleton算子基于形态学操作,计算的是形态学骨架,通常更适用于规则的形状。
1.5 细化
Halcon使用thinning算子用于从区域中提取边界(轮廓)。它通过形态学操作实现,能够生成单像素宽度的边界,最终生成一个单像素宽度的线条,同时保留区域的连通性。
算子声明:
- thinning ( Region, StructElement1, StructElement2 : RegionThin : Row, Column, Iterations : )
参数说明:
- Region(输入参数):输入的区域,表示需要细化的对象。
- StructElement1(输入参数):用于处理前景的结构元。
- StructElement2(输入参数):用于处理背景的结构元。
- RegionThin(输出参数):细化处理结果。
- Row/Column(输入参数):参考点的水平/垂直坐标。
- Iterations (输入参数):处理的迭代次数。
除了thinning算子之外,还有两个算子用于特殊的细化操作,分别是thinning_golay和thinning_seq。
1.6 粗化
Halcon使用thickening算子用于从区域中提取边界(轮廓)。它通过形态学操作逐步增加区域的厚度,通常用于填充区域的空洞或增强区域的连通性。
算子声明:
- thickening ( Region, StructElement1, StructElement2 : RegionThin : Row, Column, Iterations : )
参数说明:
- Region(输入参数):输入的区域,表示需要粗化的对象。
- StructElement1(输入参数):用于处理前景的结构元。
- StructElement2(输入参数):用于处理背景的结构元。
- RegionThin(输出参数):粗化处理结果。
- Row/Column(输入参数):参考点的水平/垂直坐标。
- Iterations (输入参数):处理的迭代次数。
除了thickening算子之外,还有两个算子用于特殊的粗化操作,分别是thickening_golay和thickening_seq。
1.7 顶帽变换
Halcon使用bottom_hat算子用于顶帽变换。用于提取比结构元素小的亮区域。常用于图像分割和特征提取。
算子声明:
- top_hat ( Region, StructElement : RegionTopHat : : )
参数说明:
- Region(输入参数):输入的区域,用于进行顶帽的对象。
- StructElement(输入参数):用于顶帽变换所需的结构元。
- RegionTopHat(输出参数):输出的顶帽变换处理结果。
1.8 底帽变换
Halcon使用bottom_hat算子用于底帽变换。底帽变换是形态学操作的一种,用于提取图像中比结构元素小的暗区域。
算子声明:
- bottom_hat ( Region, StructElement : RegionBottomHat : : )
参数说明:
- Region(输入参数):输入的区域,用于进行底帽的对象。
- StructElement(输入参数):用于底帽变换所需的结构元。
- RegionBottomHat(输出参数):输出的底帽变换处理结果。
1.9 联合顶帽-底帽变换
Halcon使用morph_hat算子用于从区域中提取边界(轮廓)。它通过形态学操作实现,能够生成单像素宽度的边界。
算子声明:
- morph_hat ( Region, StructElement : RegionMorphHat : : )
参数说明:
- Region(输入参数):输入的区域,表示需要提取边界的对象。
- StructElement(输入参数):用于顶帽/底帽变换所需的结构元。
- RegionMorphHat (输出参数):输出的处理结果。
1.10 适合
Halcon中的fitting算子使用多个结构元依次进行开运算和闭运算。
算子声明:
- fitting ( Region, StructElements : RegionFitted : : )
参数说明:
- Region(输入参数):输入的区域。
- StructElements(输入参数):形态学所用的结构元。
- RegionFitted(输出参数):适合操作的结果。
2. 小结
本节介绍多种典型的形态学操作,包括细化、粗化、骨架化、边界提取、剪枝、以及顶帽变换和底帽变换。
(初稿完成,最新更新2025-03-17)
本专栏将介绍基于Halcon的各种传统经典的数字图像处理技术,所介绍内容基本与Gonzalez的教材基本保持一致。作为学习和实践DIP技术的入门教程。
感谢大家的支持和浏览,本专栏将持续更新(每周至少更新1篇),每篇的篇幅控制在5000字左右,这样大家阅读起来也比较轻松。估计2025年上半年完成全部内容,欢迎加收藏。但由于到了假期,更新的速度不会很快。
在专栏全部完成之前,所有内容将一直免费。