LeveSet 水平集方法主要的思想是利用三维(高维)曲面的演化来表示二维曲线的演化过程。在计算机视觉领域,利用水平集方法可以实现很好的图像分割效果。

1.数学原理

根据维基百科的定义,在数学上一个包含n个变量的实值函数其水平集可以表示为下面的公式:
Lc(f)=(x1,x2,...,xn)∣f(x1,x2,...,xn)=cL_c(f) = {(x_1,x_2,...,x_n)|f(x_1,x_2,...,x_n) = c}Lc​(f)=(x1​,x2​,...,xn​)∣f(x1​,x2​,...,xn​)=c
可以看出,水平集指的是这个函数的取值为一个给定的常数c.那么当变量个数为2时,这个函数的水平集就变味了一条曲线,也可以成为等高线。这时函数f就可以描述一个曲面。(同样,三个变量时就能得到一个等值面,大于3的就是水平超面了)
下面来看一个简单的曲面的水平集(等值线的例子):

上图中,左边是Himmelblau方程所描述的曲面即z=f(x,y)z=f(x,y)z=f(x,y),右边就是这个曲面的等高线集合,其中每一条就对应着一个常数c的水平集。

2.水平集方法

在计算机视觉中,利用水平集方法的优势在于,可以利用这种方法在固定的坐标系中,计算曲线、曲面的演化,而无需知道曲线曲面的参数,所以这种方法又称为几何法。
具体来讲,在图像分割任务中如果要得到每个物体准确的包络曲线,就需要对去描述这个曲线在xy坐标系下的演化。最初曲线在二维图像平面上是这样的:
y=g(x)y=g(x)y=g(x)
图割过程就是要找出一条比较好的曲面来包围物体。
但是这个函数求解和计算比较困难,那么就可以用水平集的思想和方法来解决:

1.首先将这个曲线看成是某个三维曲面下的某一条等高线:
z=f(x,y)z = f(x,y)z=f(x,y)
f(x,y)f(x,y)f(x,y)就可以看做是一个xy的隐函数方程。

2.特别的,在二维图像领域一般将上面讲到的函数z=f(x,y)z=f(x,y)z=f(x,y)设置为0,刚刚所说的曲面的零水平集就是图像上的边缘包络。
z=f(x,y)=0z=f(x,y)=0z=f(x,y)=0
或者更为标准的形式如下:
Γ=(x,y)∣z(x,y)=0\Gamma = {(x,y)| z(x,y)=0}Γ=(x,y)∣z(x,y)=0
这时,z(x,y)=f(x,y)就是辅助函数,用三维的曲面来辅助表示二维的曲线。

这里还有一个假设,Γ\GammaΓ零水平集内部的(包络内的)为正外面为负。

这里有个重要的性质,基于高维曲面水平集方法得到的这个零水平集曲线是封闭的、连续的、处处可导的,这就为后面的图像分割提供了基础。

3.零水平集演化

为了获得与图像边缘相适应的结果,z需要进行演化才能使得其0水平集所描述的曲线很好的包裹住需要分割的物体,那么此时就涉及到方程的演化:
Γ(t)=(x,y)∣z(x,y)=0\Gamma(t) = {(x,y)| z(x,y)=0}Γ(t)=(x,y)∣z(x,y)=0
∂z∂t=v∣Δz∣\dfrac{\partial z}{\partial t} = v |\Delta z|∂t∂z​=v∣Δz∣
这里是一个曲面演化后,其零水平集演化的过程:

要促使边缘演化成包络object的形式,需要一个所谓的图像力来促使其变化,这时候就需要利用图像中的梯度来作为这个图像力的组成部分驱动曲线去靠近边缘。下图是一个例子,作图是原图,右图是梯度图。

<font color=dodgerblue<那么这个图像力就需要在原理边缘的时候大,靠近边缘的时候缩小,直到贴合边缘。

在梯度的驱动下,其演化过程如上图所示。

4.如何求解最小值

上面的问题在数学中可以归结为能量泛函问题,求解边缘的过程就是这个水平集能量泛函最小化的过程。
著名的方法来自于下面这篇文章:
Level Set Evolution Without Re-initialization: A New Variational Formulation
作者(李明纯)通过引入了内部能量项来惩罚由信号距离函数造成的水平集函数的偏差,以及外部能量项来驱动零水平集向期望的图像特征运动,实现了很好的分割效果。

5.Demo

下图是matlab 中,稍作修改运行作者给出的工具函数demo:
原图和分割效果图:

如果理解错误,请各位指正


pics contenx ref from:
https://profs.etsmtl.ca/hlombaert/algorithms.php
https://math.berkeley.edu/~sethian/2006/Explanations/level_set_explain.html
https://www.zhihu.com/question/22608763
https://blog.csdn.net/github_35768306/article/details/64129197
https://blog.csdn.net/songzitea/article/details/46385271
李明纯:http://www.engr.uconn.edu/~cmli/
paper:http://www.imagecomputing.org/~cmli/paper/levelset_cvpr05.pdf
matlab:https://www.mathworks.com/matlabcentral/profile/authors/870631-chunming-li
https://blog.csdn.net/yutianxin123/article/details/69802364
cells: https://www.histology.leeds.ac.uk/blood/blood_wbc.php
https://www.thoughtco.com/cell-biology-glossary-373293


pic from pexels.com

水平集与图割算法浅析相关推荐

  1. 实战|基于图割算法的木材表面缺陷图像分析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 鉴于图割方法的明显优势,白雪冰及其团队采用G ...

  2. 荔枝hsv空间图像分割程序matlab,基于稀疏场水平集的荔枝图像分割算法_毛亮

    第4期毛亮等:基于稀疏场水平集的荔枝图像分割算法349 从表中可知,本文算法在计算速度上接近标准模糊C 均值聚类算法,优于水平集方法.因此,与水平集方法相比,本文算法有着更好的分割性能和实时性. 4结 ...

  3. matlab实现图割算法中的最大流最小割Max-flow/min-cut问题(一)

    转载自:http://blog.csdn.net/on2way/article/details/43276155 本篇主要介绍matlab实现Max-flow/min-cut的方法,介绍一种只实现了M ...

  4. 水平集图像分割并行加速算法设计与实现(串行、OpenMP、CUDA)——串行实现篇

    本次水平集图像分割并行加速算法设计与实现包含:原理篇.串行实现篇.OpenMP并行实现篇与CUDA GPU并行实现篇四个部分.具体各篇章链接如下: 水平集图像分割并行加速算法设计与实现--原理篇 水平 ...

  5. 项目实战 基于图割算法的木材表面缺陷图像分析

    鉴于图割方法的明显优势,白雪冰及其团队采用Graph Cuts算法和Grab Cut算法分别对木材表面的单目标和多目标缺陷图像进行分割试验,以总结传统图割方法的不足和改进算法的优点. 针对传统Grap ...

  6. Graph Cut(图割算法)

    转载自:http://blog.csdn.net/zouxy09/article/details/8532111 Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背 ...

  7. Python开发项目基于改进高斯混合模型的图割算法

    博主介绍:擅长Java.微信小程序.Python.Android等,专注于Java技术领域和毕业项目实战✌

  8. efficientransac_【泡泡图灵智库】基于图割优化的RANSAC算法(CVPR)

    主要贡献 本文提出了一种使用局部优化算法改进RANSCA精度的方法,其主要贡献为: 1.提出了一种考虑空间一致性的内点判断方法,从而改进了RANSCA算法的精度: 2.采用图割算法解决内点判断的优化问 ...

  9. stereo matching的能量函数最小值求解——alpha expansion 和alpha-beta swap算法(图割)

    alpha expansion以及alpha-beta swap介绍 写在前面的话 α \alpha α-expansion 和 α − β \alpha-\beta α−βswap的算法流程 生成带 ...

最新文章

  1. 2022-2028年中国塑料板的制造行业市场发展模式及竞争格局预测报告
  2. 模拟实现常用字符串函数
  3. /lib64/libc.so.6: version `GLIBC_2.14' not found问题
  4. Dubbo自定义日志拦截器
  5. Unity中BVH骨骼动画驱动的可视化理论与实现
  6. 3秒搞定!~~ 一亿数据获取前100个最大值
  7. Import 元素 (MSBuild)
  8. opencv-python库的安装
  9. Javascript函数作为参数——JS学习笔记
  10. SoapUI接口测试-基本操作
  11. Android Protect-0.luyten+jadx+simplify简单介绍
  12. 计算机考试二级搜题软件,计算机二级搜题库-可以帮助计算机二级备考生进行备考的刷题软件...
  13. python百度关键词自动提交订单_Python+selenium刷百度关键词点击
  14. 计算机CPU加,减,乘,除的原理
  15. 华为诺亚方舟实验室招聘实习生
  16. H5,小程序中实现小红书式排序 瀑布流(横向排序) macy插件实际使用
  17. 商业银行接口自动化测试结果分析方法与装置
  18. 【金猿技术展】SSNG多源数据处理技术——运营商手机信令处理系统及平台
  19. 服务器机架的型号,机架式服务器的机柜尺寸定义
  20. 三战上岸复旦工研院考研回忆(无干货)

热门文章

  1. fig,ax = plt.subplots()
  2. 什么是端到端模型(end-to-end learning)?
  3. Bootstrap-组件-2
  4. VSCode + git 代码托管【当前没有源代码管理提供程序注册】(没有‘+’加法号) - 解决篇
  5. vue-resource网络请求模块(安装教程) - cmd篇
  6. 苹果cmsV10仿哈哩哈哩动漫自适应模板
  7. 商务宽屏视频剪辑企业网站模板
  8. java map 泛型 反射_Java通过反射读取泛型
  9. tkinter显示mysql表_Python(Tkinter)如何只显示Mysql记录而不显示列表?
  10. 紫色大气Bootstrap网站模板