粘连的东西,最常见的思路是进行腐蚀,缩小region。
用下面的思路也是可以的。
(1)简单的阈值分割;
(2)计算连通域connection;
(3)基于距离变换的分水岭区域分割,使用算子distance_tansform,watersheds
(4)盆地与原连通域求交集,分离粘连颗粒;
演示程序如下:
*采集图像 dev_close_window () read_image (Image, 'pellets') *计算图片大小,并以原图尺寸显示 get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) dev_display (Image) stop () *01 简单的阈值分割 threshold (Image, Region, 105, 255) *02 计算连通域 connection (Region, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 99999) dev_set_draw ('margin') dev_display (Image) dev_display (SelectedRegions) disp_continue_message (WindowHandle, 'black', 'true') stop () *03 基于距离变换的分水岭区域分割,使用算子distance_tansform,watersheds *距离变换 distance_transform (SelectedRegions, DistanceImage, 'octagonal', 'true', 380, 350) *转换图像类型,将real类型转换为byte,因为分水岭迭代运算的图像为‘byte’类型 convert_image_type (DistanceImage, DistanceImageByte, 'byte') *反转图像,使得高灰度值在边缘代表山脉,低灰度值在里面代表盆地 invert_image (DistanceImageByte, DistanceImageInv) * 扩大图像灰度范围【0,255】,增加对比度 scale_image_max (DistanceImageInv, DistanceImageInvScaled) watersheds_threshold (DistanceImageInv, Basins, 5) dev_display (DistanceImageInvScaled) dev_display (Basins) disp_continue_message (WindowHandle, 'black', 'true') stop () * 原图中显示分水岭 dev_display (Image) dev_display (SelectedRegions) dev_set_color ('blue') dev_display (Basins) disp_continue_message (WindowHandle, 'black', 'true') stop () *04 盆地与原连通域求交集,分离粘连颗粒 intersection (Basins, SelectedRegions, SegmentedPellets) *结果显示 dev_display (Image) dev_set_colored (12) dev_display (SegmentedPellets)
粘连对象的识别还有一种办法是进行深度学习。语义分割可以很好的处理这类问题。
后面勇哥会提供一些例子。
其它一些关于粘连处理的贴子:
HALCON图像处理的粘连零件颗粒计数 http://47.98.154.65/?id=78
粘合度高的物体识别 http://47.98.154.65/?id=1449
halcon Blob分析--粘连颗粒检测 http://47.98.154.65/?id=1495

