【Halcon】基于watershed_threshold的图像分割

整体等于其部分之和 ——欧几里得
整体大于其部分之和 ——Max Watheimer


1.算子

通过阈值实现图像的分水岭算法分割
watersheds_threshold(Image : Basins : Threshold : )

2.原理

第1步:
通过分水岭算法watersheds()获取图像的盆地。
这里写图片描述
第2步:
根据第一步分水岭算法分离结果,若盆地部分的灰度**< threshold**,则被合并到一起。设B1和B2分别为相邻盆地的最小灰度值,W为将盆地分割为两个盆地的最小灰度值。则分割结果为:
这里写图片描述
这里写图片描述

3.案例

1)边缘振幅+分水岭阈值实现图像分割

dev_set_draw ('fill')
dev_set_line_width (2)
dev_set_colored (12)
read_image (ImageLogo, 'mvtec_logo.png')
dev_close_window ()
get_image_size (ImageLogo, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (ImageLogo)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
gauss_filter (ImageLogo, ImageGauss, 9)
sobel_amp (ImageGauss, EdgeAmplitude, 'sum_abs', 3)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
watersheds_threshold (EdgeAmplitude, Basins, 14)
dev_display (Basins)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
return ()

源图
边缘幅度图
结果图
其他算子:

  • gauss_filter(Image : ImageGauss : Size : )高斯平滑滤波
  • sobel_amp(Image : EdgeAmplitude : FilterType, Size : )sobel计算图像边缘幅度

2)距离变换+watersheds_threshold等实现分割

 * In this example, the task is to split the touching pellets.
 * First, a simple thresholding operation yields the region of the pellets
 * in the image. Unfortunately, some of the connected components
 * of this region do not represent single pellets but contain more than one
 * pellet. Therefore, in a second step the watersheds are computed based
 * on the distance transformed pellets regions. The corresponding basins
 * are finally used to split the falsely connected pellets by intersecting the
 * basins with the pellets regions.
 * 
dev_set_draw ('margin')
dev_set_colored (12)
read_image (Image, 'pellets')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
threshold (Image, Region, 105, 255)
 * 计算连通域
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 99999)
dev_display (Image)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
 * 距离变换
distance_transform (SelectedRegions, DistanceImage, 'octagonal', 'true', 380, 350)
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 ()
 * 图像求交
intersection (Basins, SelectedRegions, SegmentedPellets)
dev_display (Image)
dev_set_colored (12)
dev_display (SegmentedPellets)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
return ()

源图阈值化图距离变换图watersheds_threshold图结果图
其他算子

  • connection(Region : ConnectedRegions : : )计算区域的连通域
  • select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 20, 99999) 根据区域特征(面积、长度等)提取区域
  • distance_transform(Region : DistanceImage : Metric, Foreground, Width, Height : )计算区域的距离变换
  • convert_image_type(Image : ImageConverted : NewType : )转换图像类型(byte* / direction* / cyclic* / int1* / int2* / uint2* / int4* / int8 / real* / complex*)
  • invert_image(Image : ImageInvert : : )反转图像
    这里写图片描述
  • scale_image_max(Image : ImageScaleMax : : )将图像灰度范围扩大到【0,255】
  • intersection(Region1, Region2 : RegionIntersection : : )计算区域的交集

4.参考

  • Halcon官方参考文档

5.附件
末尾分享最近在看的阿里技术分享的《不止代码》,关于程序员的职业进阶、发展、规划等等。
感谢阿里大神们的分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值