公众号:机器视觉那些事儿

“古人云,一生二,二生三,三生万物。古人有云,水之清则无敌。故名三清!”

此次选取的案例依然是官方Blob案例–基于欧式距离的分水岭算法的区域分割。Halcon的官方例程,都是顶级工程师的思想精华,大多实际项目的难度并没有官方例程复杂,由于官方例程针对的是有一定Halcon基础的,本人在此次处理时添加了详细的中文注释,做出一定的调整,更容易让读者理解和接受。

  1. 原理简介

第1步:

使用区域距离变换算子获取距离信息图

distance_transform(Region:DistanceImage:Metric,Foreground,Width,Height)

距离变换简化了分水岭算法的复杂度。距离变换针对二值图像,目标像素为1,背景像素为0。距离变换的结果图像是一个灰度图像,灰度值就是图像中该像素距离其最近的背景像素的距离。

假设两个像素点P1(x1,y1),P2(x2,y2)

距离D = sqrt((x1-x2)(x1-x2) + (y1-y2)(y1-y2))

第2步:

使用阈值分水岭算子获取盆地
watersheds_threshold(Image : Basins : Threshold : )

分水岭算法是一种基于拓扑理论的数学形态学的分割方法,基本思想是把图像看做拓扑地貌,图像中的每一点像素的灰度值表示该店的海拔高度,高灰度代表山脉,低灰度代表盆地,每一个局部极小值及其影响区域成为集水盆,而集水盆的边界形成分水岭。

第3步:
根据第一步分水岭算法分离结果,若盆地部分的灰度< threshold,则被合并到一起。设B1和B2分别为相邻盆地的最小灰度值,W为将盆地分割为两个盆地的最小灰度值。

则分割结果为:

2.程序使用的算子

distance_transform(Region:DistanceImage:Metric,Foreground,Width,Height)区域距离变换

watersheds_threshold(Image : Basins : 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.算法思路

  • (1)简单的阈值分割;

  • (2)计算连通域connection;

  • (3)基于距离变换的分水岭区域分割,使用算子distance_tansform,watersheds

  • (4)盆地与原连通域求交集,分离粘连颗粒;

    5.现学现用

(1)读入原图,简单的阈值分割

*采集图像

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)

阈值分割

(2)计算连通域connection

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 ()

计算连通域并筛选连通域

部分颗粒粘连处在一个连通域

(3)基于距离变换的分水岭区域分割,使用算子distance_tansform,watersheds

*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 ()

分水岭图

已成功分割粘连颗粒

(4)盆地与原连通域求交集,分离粘连颗粒;

*04 盆地与原连通域求交集,分离粘连颗粒

intersection (Basins, SelectedRegions, SegmentedPellets)

最终效果图

成功分割粘连颗粒

原图及完整源代码见百度网盘:

链接:https://pan.baidu.com/s/1FV2zYWK2gnA0duFdLnIlXA 密码:h7t7

halcon 粘连物体分割相关推荐

  1. 【实战篇:粘连物体分割——利用几何分割实现瓶盖分割检测】

    实战篇:粘连物体分割--利用角点检测.定ROI区域.透视变换.几何分割实现瓶盖分割计数 一.背景 二.思路 三.代码 四.效果 五.声明 六. 其他文章 一.背景     在去年学习opencv的过程 ...

  2. 实战 | 粘连物体分割与计数应用(三)--密集粘连药片分割+计数案例

    点击下方卡片,关注"OpenCV与AI深度学习"公众号 视觉/图像重磅干货,第一时间送达! 导读 本文主要介绍一个密集粘连药片分割计数综合实例的实现方法和总结. 背景介绍 在实际的 ...

  3. 【实战篇:粘连物体分割——利用几何分割实现硬币分割检测】

    实战篇:粘连物体分割--利用角点检测.定ROI区域.透视变换.几何分割实现硬币分割计数 一.背景 二.思路 三.代码 四.效果 五.声明 六.其他文章 一.背景     前面分享过一篇文章,是利用几何 ...

  4. halcon粘连字符分割_机器视觉—字符识别之粘连字符分割识别

    粘连字符的分割有很多种方法: 第一种方法:利用阈值法提取联通区域,再利用形态学分离字符: 第二种方法:每个字符定义一个感兴趣区域: 第三种方法: 计算区域每列像素数目,由于不同字符之间连接部分非常狭窄 ...

  5. 物体分割--Deep Watershed Transform for Instance Segmentation

    Deep Watershed Transform for Instance Segmentation CVPR2017 https://github.com/min2209/dwt 本文将传统的 wa ...

  6. 视频物体分割--One-Shot Video Object Segmentation

    One-Shot Video Object Segmentation CVPR2017 http://www.vision.ee.ethz.ch/~cvlsegmentation/osvos/ One ...

  7. cs231n---语义分割 物体定位 物体检测 物体分割

    1 语义分割 语义分割是对图像中每个像素作分类,不区分物体,只关心像素.如下: (1)完全的卷积网络架构 处理语义分割问题可以使用下面的模型: 其中我们经过多个卷积层处理,最终输出体的维度是C*H*W ...

  8. 南开大学提出新物体分割评价指标,相比经典指标错误率降低 69.23%

    前景图的度量对于物体分割算法的发展有着重要的作用,特别是在物体检测领域,其目的是在场景中精确地检测和分割出物体.但是,当前广泛应用的评估指标 (AP, AUC) 都是基于像素级别的误差度量,缺少结构相 ...

  9. 【转】贾佳亚港中文团队冠军技术分享:最有效的COCO物体分割算法

    转自:http://www.sohu.com/a/201822261_473283 [新智元导读]物体分割(instance segmentation)是如今视觉领域最热最核心的一个问题.在这届国际图 ...

最新文章

  1. 智源发布人脸识别与公共卫生调研报告
  2. 一句话后门中eval和assert的区别
  3. SSM整合之纯注解方式,注解实现事务,异常,与拦截器
  4. 二、SpringMVC 注解式开发学习笔记
  5. idea 提示 Cannot resolve symbol ‘log‘解决
  6. Android 8.0 学习(14)---Android8.0适配分析
  7. php 背单词系统_《PHP 编程词典(珍藏版)》
  8. Hibernate中Cascade和Inverse
  9. vnpy学习_04回测评价指标的缺陷
  10. filebeat配置介绍
  11. 挑战程序设计竞赛2 算法与数据结构 笔记
  12. java中Map集合的四种遍历方式
  13. 计算机画图软件教学教案,画图软件教学设计
  14. FileZilla Server 设置
  15. 添加proc文件,控制sctp的debug输出
  16. java rms是什么意思,关于RMS的使用
  17. Java 细胞分裂问题
  18. Arduino作为编程器读写BIOS、bootloader、uboot或者breed
  19. Android主题和样式
  20. xyplorer保存设置失败_XYplorer有哪些独特的强大之处?又可以在哪些方面替代,或者超越total commander?...

热门文章

  1. easyios 教程
  2. 蓝桥杯-蓝跳跳(矩阵快速幂 70%数据)
  3. 50件事将归咎于油价上涨
  4. 人脸识别错误代码437是什么意思_英雄联盟手游10075什么意思 lol手游错误代码10075解决方法...
  5. mybase破解方法
  6. 讲讲Cortex-M内核的MPU内存保护单元
  7. 重读朱少民《全程软件测试》
  8. 18 原型模式(原型设计模式)详解
  9. 浏览器服务器中文乱码问题
  10. Mybatis plus 数据加密