C# 基于OpenCv的视觉工作流-章27-图像分割

C# 基于OpenCv的视觉工作流-章27-图像分割

本章目标:
一、理论概念;
二、图像处理;
三、设置背景图;
四、设置前景图;
五、计算边缘图;
六、构建标识图;
七、图像分割;


一、理论概念;

详细见文末链接



二、图像处理;

对图像进行转灰度图、二值化、开运算去毛刺处理(前文章有介绍,不再描述),得到目标为白色,其它为黑色的图像,如下图所示。

三、设置背景图;

将处理后的图像进行膨胀运算(前文章有介绍,不再描述),再将所得图像作为背景图,用于后续运算,如下图所示。

膨胀的目的是为了取得更多的边缘地带区域,利于后续计算边缘。

四、设置前景图;

设置前景图可用腐蚀操作取图,但由于各区域相连部分较多,难以很好的用腐蚀取得。

本文用DistanceTransform算子进行配合获取。该算子能计算出非0值到0值的距离,对所得距离进行自由设定可获得相应图像区域。

1.计算距离

OpenCv 可如下使用

Mat matDistance = new Mat();

Cv2.DistanceTransform(matDst,matDistance,DistanceTypes.L2,DistanceTransformMasks.Mask3);

其中:参数1,为输入图像;

参数2,为输出图像;

参数3,为计算的距离方式;

参数4,为核大小;

2.取得最大最小距离值

Cv2.MinMaxIdx(matDistance, out double min, out double max);

其中:参数1,为输入图像;

参数2,为最小距离;

参数3,为最大距离;

3.取得前景图

Mat thresholdFG = new Mat();

Cv2.Threshold(matDistance, thresholdFG, scale * max, 255, ThresholdTypes.Binary);

其中:参数1,为输入图像;

参数2,为输出图像;

参数3,为距离值,此处按指定比例取值;

参数4,为最大值;

参数5,为二值化类型;

效果如下

五、计算边缘图;

原理:边缘图=背景图-前景图

六、构建标识图;

上述步骤后,图像的前景、前景、边缘均已取得,但三图中所有的像素值均为0或255。

分水岭算法要求的是边缘区为0值,背景区为1值,前景区为大于1值。

所以需要对图像像素值时行转换,以符合分水岭算法要求,OpenCv可用算子ConnectedComponents进行相应转换。

OpenCv 算子ConnectedComponents可如下使用

Mat markers = new Mat();

Cv2.ConnectedComponents(fg, markers);

其中:参数1,为输入图像;

参数2,为输出标识;

由于ConnectedComponents算子用0标记背景,用大于0的整数标记前景,仍不满足要求,

所以需遍历markers ,将0值加1,即满足分水岭背景区要求;

将大于0值也加1,满足分水岭前景区要求;

剩下的边缘区将值改为0,即满足分水岭边缘区要求。

标识结果,如下图

七、图像分割;

OpenCv 算子Watershed可如下使用

Cv2.Watershed(src, markers);

其中:参数1,为输入图像;

参数2,为输入输出标识;

说明:输入的markers中,边缘区是粗放的不精确的,通过分水岭算法后,输出的markers边缘得到进一步精确,效果如下图。

对黑色背景的分割,如图

参考链接

https://www.bilibili.com/video/BV1RFtpeJE6h?spm_id_from=333.788.videopod.episodes\&vd_source=3f9438f03abb9d3e91fda0640164d626\&p=90

"VisionTool 探迹"免费视觉工具

下载地址:https://pan.baidu.com/s/11tktKOSnepLNIEqNbvnv6w?pwd=qv5i
版本已更新为V1.0.0.1,更新内容如下:
1.执行流程,仅首次调IO读取参数、
2.流程及节点间数据隔离;

"VisionTool Halcon"付费视觉工具

下载地址:https://pan.baidu.com/s/1v832KTonDYS6oNnWG2iZtQ?

对应系列文章"C# 基于Halcon的视觉工作流",欢迎前往阅读。

上述内容需要一定的技术功底,本章至此已结束,欢迎阅读下章,谢谢!

相关推荐
黎阳之光20 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_1120 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia20 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
小超同学你好20 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力20 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo20 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
wfbcg20 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
xiaozhazha_20 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能
枫叶林FYL20 小时前
【自然语言处理 NLP】7.2.2 安全性评估与Constitutional AI
人工智能·自然语言处理
AI人工智能+20 小时前
基于高精度身份证OCR识别、炫彩活体检测及人脸比对技术的人脸核身系统,为通信行业数字化转型提供了坚实的安全底座
人工智能·计算机视觉·人脸识别·ocr·人脸核身