在工业图像处理中,分割点的精确定位是非常关键的。尤其是在产品形态变化较为复杂的场景下,传统的特征提取方法可能无法提供理想的解决方案。本文将介绍一种新的分割点定位算法,该算法不依赖特征提取,而是通过分析产品厚度的变化来自动识别分割点,特别适用于那些厚度由大到小再由小到大的产品,例如瓶口的颈部。
1. 算法概述
该算法的核心思想是通过分析图像中工件的厚度变化,找到从厚度大到小,再从小到大的过渡点,进而确定分割点。具体来说,算法通过以下几个步骤来定位分割点:
- 图像预处理:加载并分解图像,提取绿色通道。
- 区域提取:通过阈值分割提取目标区域,并进行区域连接和形态学处理。
- 区域划分:计算区域的最小外接矩形,并生成切割矩形进行区域划分。
- 厚度计算:通过计算每个切割矩形的高度,生成高度变化的函数。
- 极值定位:通过对厚度变化函数进行平滑处理,找到局部最小值和最大值,确定过渡点,即分割点。
数据集和算法下载
通过网盘分享的文件:快速定位一个区域中厚度转则的位置.7z
链接: https://pan.baidu.com/s/12YwQdy0UNykJRySgXprOAA?pwd=jkcf 提取码: jkcf
2. 算法流程详细解析
2.1 初始化与图像加载
首先,初始化窗口,并加载图像。图像中的绿色通道被提取出来用于后续处理:
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_paint ('default')
dev_set_draw ('margin')
dev_set_line_width (3)
set_font (WindowHandle, 'Arial-Bold-20')
read_image (Image, '5采集.png')
decompose3 (Image, ImgR, ImgG, ImgB)
这一步骤为后续的图像处理和显示准备了基础。
2.2 区域提取与形态学处理
接着,通过阈值分割提取绿色通道中的目标区域,接着进行区域连接和形态学操作,以去除噪声并平滑区域边界:
threshold (ImgG, Reg, 0, 180)
connection (Reg, Regs)
select_shape (Regs, RegMax, 'area', 'and', 1e3, 1e7)
closing_circle (RegMax, RegMaxCL, 30.5)
这里,threshold
用于提取图像中亮度值在指定范围内的区域,connection
将这些区域连接成一个完整的区域,select_shape
根据区域面积筛选出感兴趣的区域,closing_circle
进行形态学闭运算,去除小的噪点。
2.3 区域划分与切割
在提取的区域上,计算其最小外接矩形,并基于该矩形生成多个小矩形区域。这些小矩形将用于计算每个区域的厚度:
smallest_rectangle1 (RegMaxCL, R1, C1, R2, C2)
Cols := [C1 + 200 : 1 : C2 - 5]
Row1s := gen_tuple_const(|Cols|, R1 - 10)
Row2s := gen_tuple_const(|Cols|, R2 + 10)
gen_rectangle1 (cRects, Row1s, Cols, Row2s, Cols)
intersection (cRects, RegMaxCL, RegInters)
通过计算最小外接矩形 smallest_rectangle1
得到矩形的边界坐标,并根据该坐标生成多个小矩形 gen_rectangle1
,这些矩形用于区域切割,并与原区域进行交集运算,以得到切割后的区域 RegInters
。
2.4 厚度计算与函数生成
计算每个切割矩形的高度,并将其形成一个高度变化的函数:
region_features (RegInters, 'height', RFeaHigs)
create_funct_1d_array (RFeaHigs, HigFunc)
smooth_funct_1d_gauss (HigFunc, 5, HigFuncSmooth)
通过 region_features
计算每个小矩形的高度,并将这些高度值生成一个一维函数 HigFunc
。为了消除噪声影响,对高度函数进行高斯平滑处理,得到平滑后的函数 HigFuncSmooth
。
2.5 极值定位与分割点确定
通过查找平滑后的函数中的极小值和极大值,定位过渡点。过渡点就是从大到小,或者从小到大的变化点,通常就是分割点的标志。
local_min_max_funct_1d (HigFuncSmooth, 'strict_min_max', 'true', MinInds, MaxInds)
Inds := int(MinInds)
MinHigs := RFeaHigs[Inds]
minHig := min(MinHigs)
minInd := find(MinHigs, minHig)
select_obj (cRects, MinRect, Inds[minInd])
使用 local_min_max_funct_1d
查找函数中的极小值和极大值,find
函数用于定位最小高度值所在的位置,最终选出对应的小矩形作为分割点 MinRect
。
2.6 结果展示
最后,显示图像和定位出的分割点:
dev_display (Image)
dev_display (MinRect)
这一步显示原图像和定位出的分割点,便于直观地验证算法效果。
3. 算法效果
该算法可以快速、准确地定位产品从大到小或从小到大的厚度变化点,适用于复杂形状的产品分割。例如,在瓶口的颈部,算法能够成功地检测到从大到小的过渡点,提供精准的分割。
原图与定位结果对比:
原图:
定位结果:
4. 总结
本算法通过厚度变化分析来定位工件的分割点,避免了传统特征提取方法的复杂性,具有更高的适应性和准确性。通过对图像区域的高度变化进行分析,能够准确地找到从大到小或从小到大的过渡点,适用于复杂产品形状的分割,尤其是在瓶口颈部等应用场景中。