在HALCON图像处理库中,partition_dynamic算子是一个强大的区域分割工具,特别适用于对OCR字符区域或具有特定形状特征的区域进行分割。
原型:partition_dynamic (SelectedRegions, Partitioned, 25, 20)
一、原理
partition_dynamic算子的主要原理是根据输入区域的特征,在最小垂直跨度位置进行水平分割。它通过分析输入区域的垂直范围变化,找到最佳分割点,从而将区域分割成多个子区域。
SelectedRegions:输入区域,即待分割的原始区域。
Partitioned:输出区域,即经过partition_dynamic算子处理后,被分割成多个子区域的集合。
Distance:近似分割的宽度,即每个子区域期望的列宽度。在本例中,设置为25。
Percent:搜索范围的比例因子,用于确定在寻找最小垂直跨度时的左右搜索范围。本例中设置为20,意味着搜索范围将是Distance的20%(即5个单位)左右。
算法的执行过程如下:
根据输入区域的最小轴平行包围矩形和Distance参数,计算初始的分割位置。这些位置通常均匀分布在输入区域的水平范围内。
在每个初始分割位置的邻域内(由Distance和Percent确定的范围),计算输入区域的垂直跨度。垂直跨度是指在该位置处,区域在垂直方向上的延伸范围。
找出具有最小垂直跨度的列坐标,将其作为当前的分割位置。这个最小垂直跨度位置通常对应于区域之间的自然分隔点。
重复上述过程,直到整个输入区域被分割成多个子区域。
二、应用
partition_dynamic算子在图像处理和机器视觉领域具有广泛的应用,特别是在以下方面:
OCR字符分割:在OCR应用中,经常需要将粘连在一起的字符分割开来。partition_dynamic算子能够根据字符之间的间隙(即最小垂直跨度位置)自动进行分割,提高OCR的识别准确率和稳定性。
形状分析:对于具有特定形状特征的区域,如条形码、矩形区域等,partition_dynamic算子也可以用于分割。通过调整Distance和Percent参数,可以实现对不同形状和大小的区域的精确分割。
复杂背景下的区域提取:在复杂背景下,如图像中存在噪声、干扰或光照不均等问题时,partition_dynamic算子仍然可以有效地提取出目标区域。它通过分析区域的垂直范围变化,能够忽略背景噪声和干扰,准确地找到目标区域之间的分隔点。
三、示例代码与解释
以下是一个使用partition_dynamic算子的示例代码及其解释:
* 读取输入图像并转换为二值图像
read_image (Image, 'example_image')
threshold (Image, Regions, 128, 255)
* 对二值图像进行形态学处理(如连接、填充等),得到待分割的区域
connection (Regions, ConnectedRegions)
fill_up_shape (ConnectedRegions, FilledRegions, 'area', 100, 200)
* 设置分割参数
Distance := 25
Percent := 20
* 应用partition_dynamic算子进行区域分割
partition_dynamic (FilledRegions, Partitioned, Distance, Percent)
* 显示分割结果
dev_display (Image)
dev_set_color ('green')
dev_display (Partitioned)
在这个示例中,我们首先读取了一张名为’example_image’的输入图像,并将其转换为二值图像。然后,我们对二值图像进行了形态学处理(如连接和填充),以得到待分割的区域(FilledRegions)。接着,我们设置了分割参数Distance和Percent,并使用partition_dynamic算子对输入区域进行了分割。最后,我们使用dev_display函数显示了原始图像和分割后的结果。
PS:这个算子非常重要,在OCR识别项目中的出镜率很高,建议去Halcon自带示例中多看几遍示例
推荐示例:dots_image.hdev