Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++ OpenCV基于距离变换与分水岭的图像分割

C++ OpenCV基于距离变换与分水岭的图像分割

作者头像
Vaccae
发布于 2019-07-24 05:07:07
发布于 2019-07-24 05:07:07
1.8K0
举报
文章被收录于专栏:微卡智享微卡智享

图像分割

图像分割,英文名image segmentation,就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理图像分析的关键步骤。现有的图像分割方法主要分以下几类:

  • 基于阈值的分割方法
  • 基于区域的分割方法
  • 基于边缘的分割方法以及基于特定理论的分割方法

从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像索赋予相同的编号。

  • 图像分割的目标是将图像中像素根据一定的规则分为若干个(N)个cluster集合,I每个集合包含一类像素。
  • 根据算法分为监督学习算法和无监督学习算法,图像分割的算法多数都是无监督学习算法。---KMeans

距离变换与分水岭介绍

距离变换

距离变换常见算法有两种

  • 不断膨胀/ 腐蚀得到
  • 基于倒角距离

分水岭变换

分水岭变换常见的算法

基于浸泡理论实现

相关API

cv::distanceTransform(

InputArray src,

OutputArray dst,

OutputArray labels,

int distanceType,

int maskSize,

int labelType = DIST_LABEL_CCOMP

)

distanceType = DIST_L1/DIST_L2,

maskSize = 3x3,最新的支持5x5,推荐3x3、

labels离散维诺图输出,

dst输出8位或者32位的浮点数,单一通道,大小与输入图像一致

cv::watershed(

InputArray image,

InputOutputArray markers

)

操作步骤

  1. 将白色背景变成黑色-目的是为后面的变换做准备
  2. 使用filter2D与拉普拉斯算子实现图像对比度提高,sharp
  3. 转为二值图像通过threshold
  4. 距离变换
  5. 对距离变换结果进行归一化到[0~1]之间
  6. 使用阈值,再次二值化,得到标记
  7. 腐蚀得到每个Peak - erode
  8. 发现轮廓 – findContours
  9. 绘制轮廓- drawContours
  10. 分水岭变换 watershed
  11. 对每个分割区域着色输出结果

代码演示

新建一个项目opencv-0027,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法

这次我们用opencv里面自带的一张图像来实个这个方法

运行显示的图像为

1.将白色背景变成黑色

我们运行看一下

可以看到右边的已经把背景都换为黑色了。

2.使用filter2D与拉普拉斯算子实现图像对比度提高,sharp

我们再运行看一下,左边的就是生成的结果图,可以看出左边的清晰度更高了一些

3.转为二值图像通过threshold

我们再运行看一下,左边的图像已经让我们转换为二值图像了,也比较清晰

4.距离变换

5.对距离变换结果进行归一化到[0~1]之间

因为距离变换看不出任何效果,所以我们把4和5两步放在一起显示

我们再运行一下看看执行结果

6.使用阈值,再次二值化,得到标记

显示效果为

7.腐蚀得到每个Peak

效果不太好看,我们需要再进行二值的腐蚀,把上面的代码再修改一下

我们再看一下运行效果,可以看出来比刚才的效果好很多了

8.标记并且开始查找轮廓

这一步只是查找轮廓,我们接下来绘制查找的轮廓再一起显示出来

9.绘制轮廓

上面drawContours和circle最后一个参数都是用了-1,代表着画的轮廓里面进行颜色填充

我们再显示一下看看效果

看到好像什么也没有,这是因为我们画的轮廓太小了, 我们改一下显示效果

把最后显示cv::imshow(imgdst,makers*5000)再乘5000,重新看一下显示效果

这会儿就可以看到绘制的轮廓出来了

10.分水岭变换

我们看看显示的效果

可以看出,每个轮廓都有明显的区分开了。

11.对每个分割区域着色输出结果

然后我们再运行看到最后结果


-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++ OpenCV图像分割之分水岭分割
前面我们说了两种分割方法,这一章我们说图像的分水岭分割。分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征。
Vaccae
2019/07/24
2.5K0
OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
一、霍夫直线变换 1、霍夫直线变换 Hough Line Transform用来做直线检测 前提条件 – 边缘检测已经完成 平面空间到极坐标空间转换 2、霍夫直线变换介绍 对于任意一条直线上的所有点来说 变换到极坐标中,从[0~360]空间,可以得到r的大小 属于同一条直线上点在极坐标空(r, theta)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标。从而得到直线 3、相关API 标准的霍夫变换 cv::HoughLines从平面坐标转换到霍夫空间,最终输出是
MiChong
2020/09/24
3.1K0
OpenCV图像处理笔记(三):霍夫变换、直方图、轮廓等综合应用
Opencv分水岭算法——watershed自动图像分割用法[通俗易懂]
分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征。
全栈程序员站长
2022/09/07
4.9K0
Python opencv图像处理基础总结(七) 基于分水岭算法的图像分割
文章目录 一、 原理 1. 分水岭算法原理 2. 距离变换 3. opencv有关函数的用法 二、基于距离的分水岭分割流程 三、python代码实现 一、 原理 1. 分水岭算法原理 任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在水汇合的地方构建起堤坝。不停地灌水,不停地构建堤坝知道所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割,这
叶庭云
2022/05/09
3.3K0
Python opencv图像处理基础总结(七) 基于分水岭算法的图像分割
OpenCV: 分水岭算法的图像分割及Grabcut算法交互式前景提取
任何灰度图像都可以看作是一个地形表面,其中高强度的像素表示山峰,低强度表示山谷。可以用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水位的上升,根据附近的山峰(坡度),来自不同山谷的水明显会开始合并,颜色也不同。为了避免这种情况,要在水融合的地方建造屏障。继续填满水,建造障碍,直到所有的山峰都在水下。然后创建的屏障将返回分割结果。这就是Watershed(分水岭算法)背后的“思想”。
用户3578099
2023/09/01
1.1K0
OpenCV: 分水岭算法的图像分割及Grabcut算法交互式前景提取
实战 | 粘连物体分割与计数应用(二)--基于距离变换+分水岭算法 Halcon/OpenCV实现比较
本文主要介绍基于基于距离变换+分水岭算法实现粘连物体的分割与计数方法,并对比Halcon与OpenCV实现差异。
Color Space
2021/11/15
7.8K0
图像处理——分水岭算法
(1)迈克老狼2012 https://www.cnblogs.com/mikewolf2002/p/3304118.html
全栈程序员站长
2022/08/29
1.2K0
图像处理——分水岭算法
修正!【从零学习OpenCV 4】分割图像——分水岭法
分水岭算法与漫水填充法相似,都是模拟水淹过山地的场景,区别是漫水填充法是从局部某个像素值进行分割,是一种局部分割算法,而分水岭法是从全局出发,需要对全局都进行分割。
小白学视觉
2020/02/27
1.6K0
转:Python的分水岭算法如何分割图像?
分水岭算法是一种图像分割算法。它将图像分割为两个或多个连通区域。算法使用图像的梯度信息来确定图像中的“分水岭”。分水岭是指图像中的边界或轮廓。算法通过找到图像中的分水岭来将图像分割成不同的区域。
啵啵鳐
2023/07/10
3730
OpenCV 图像分割之分水岭算法
任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰和丘陵,而低强度表示山谷。用不同颜色的水(标签)填充每个孤立的山谷(局部极小值)。当水上升时,根据附近的峰(梯度),不同山谷不同的颜色的水,显然会开始融合。为了避免这种情况,你在水就要融合的地方及时增加屏障(增高水坝)。你继续填满水,建造屏障,直到所有的山峰都被淹没。最后,创建的屏障会给出分割结果。这就是分水岭算法的通俗原理。你可以访问分水岭的CMM网页(http://www.cmm.mines-paristech.fr/~beucher/wtshed.html),里面有动画帮助理解。
用户6021899
2019/09/19
1.3K0
图像分割之分水岭算法[通俗易懂]
分水岭概念是以对图像进行三维可视化处理为基础的:其中两个是坐标,另一个是灰度级。基于“地形学”的这种解释,我们考虑三类点:
全栈程序员站长
2022/07/05
2.4K0
图像分割之分水岭算法[通俗易懂]
OpenCV基于标记控制的分水岭分割算法演示
图像分水岭分割是基于图像形态学的语义分割算法,常见的算法实现主要基于标记的分水岭分割方法,图示如下:
OpenCV学堂
2019/06/19
2.5K0
OpenCV基于标记控制的分水岭分割算法演示
分水岭变换图像分割接触对象
Iobrcbr = imreconstruct(imcomplement(Iobrd),imcomplement(Iobr));
万木逢春
2019/06/17
1.1K0
基于分水岭算法的图像分割-Matlab版本
分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点:
用户9925864
2022/07/27
1.3K0
基于分水岭算法的图像分割-Matlab版本
分水岭算法及案例
Watershed Algorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕 山,山围水的情形。当然在需要的时候,要人工构筑分水岭,以防集水盆之间的互相穿透。而区分高山(plateaus)与水的界线,以及湖与湖之间的间隔或 都是连通的关系,就是我们可爱的分水岭(watershed)。
全栈程序员站长
2022/07/02
9420
分水岭算法及案例
Android OpenCV(四十二):图像分割(分水岭法)
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。
Vaccae
2021/07/07
1K0
Android OpenCV(四十二):图像分割(分水岭法)
Task05 图像分割/二值化
该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。
致Great
2020/05/06
1.3K0
OpenCV计算机视觉整理(二)图像的分割与修复
之前的很多方法都是图像分割的前置步骤,比如腐蚀、膨胀、二值化等等。图像分割方法又分为传统的图像分割方法和基于深度学习的图像分割方法。
算法之名
2021/11/25
7970
医学图像处理案例(三)——用分水岭算法分割重叠细胞
针对重叠的图像分割是非常具有挑战的,正好之前一起工作过的同事跟我一起讨论了关于这方面的问题,我首先想到的就是用分水岭来进行分割。
医学处理分析专家
2020/06/29
2.1K0
医学图像处理案例(三)——用分水岭算法分割重叠细胞
Python生成图像API
常用的图像处理技术有图像读取,写入,绘图,图像色彩空间转换,图像几何变换,图像形态学,图像梯度,图像边缘检测,图像轮廓,图像分割,图像去噪,图像加水印以及修复水印等
KINGLIFE
2022/04/20
6930
推荐阅读
相关推荐
C++ OpenCV图像分割之分水岭分割
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档