[Halcon]粘连物体分割

对有粘黏物体的分割

【1】适用情形:距离变换 + 分水岭算法适用于一些粘连并不严重或粘连区域远比物体本身小的情况(粘连严重或重叠部分过多则不适用);

【2】Halcon中距离变换+分水岭算法使用相对简单,效果更稳定。

OpenCV中的距离变换特别要注意二值化图像中物体部分中间不要有孔洞,如果有需要填充后再做距离变换,否则会影响距离变换的效果。分水岭算法需要自己做预处理,设置markers告诉分水岭算法哪里是前景物体,哪里是未知区域,哪里是背景,使用相对麻烦,有时候还可能出现难以分割的情况,这种情况下,就直接换形态学 + 连通域方法处理即可:
1 : 读入图像
[Halcon]粘连物体分割_第1张图片
2 : 阈值处理
[Halcon]粘连物体分割_第2张图片
3 : 距离变换
[Halcon]粘连物体分割_第3张图片
4 : 求交集
[Halcon]粘连物体分割_第4张图片
5 : 计数
[Halcon]粘连物体分割_第5张图片

dev_clear_window()
dev_get_window (WindowHandle)
*读取图片
read_image (Image, 'pellets')
get_image_size (Image, Width, Height)
*自动阈值分割
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 110, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 40, 50000)

*欧式距离函数的距离变换
distance_transform (SelectedRegions, DistanceImage, 'octagonal', 'true', Width, Height)
*int4转byte
convert_image_type (DistanceImage, ImageConverted, 'byte')
*图像取反
invert_image (ImageConverted, ImageInvert)

*图像比例增强 按最大比例增强对比度
scale_image_max (ImageInvert, ImageScaleMax)

*分水岭算法
watersheds_threshold (ImageScaleMax, Basins, 30)
select_shape (Basins, SelectedBasins, 'area', 'and', 2000, 50000)
gen_contour_region_xld (SelectedBasins, Contours, 'border')

*取出两个区域中重叠的部分
intersection (SelectedBasins, SelectedRegions, RegionIntersection)

dev_display(Image)
dev_display(RegionIntersection)
dev_display(Image)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (RegionIntersection)
dev_set_color ('red')
dev_set_line_width (2)
area_center (RegionIntersection, Area, Row, Column)
gen_cross_contour_xld (Cross, Row, Column, 15, 0.785398)
count_obj (RegionIntersection, Number)
*设置字体颜色
dev_set_color ('green')
*设置文字大小
set_display_font (WindowHandle, 30, 'mono', 'true', 'false')
*设置文字位置
set_tposition (WindowHandle, 15, 220)
write_string(WindowHandle, 'count=' + Number)

你可能感兴趣的:(Halcon,机器视觉,分割算法)