水平集——那些我膜拜过的牛人2

久违了,今天换到新部门,准备利用下班时间接住先前的班。

本篇是迄今为止数学味最浓的,主要用于介绍一个方法以及一个牛人李春明。又来一个明(上次是何凯明),要是中国的小明都这么厉害就了不得了。

代表文章:《Level set evolution without re-initialization》,《Minimization of Region-Scalable Fitting Energy for Image Segmentation》,个人主页:http://engr.uconn.edu/~cmli/。第二篇文章获得2013年IEEE信号处理学会最佳论文奖(IEEE Signal Processing Society Best Paper Award),这个奖每年评选过去五年期间影响力大的几篇文章,可见算法需要经过相当长时间的考验才能被评委会认可,当年同获此殊荣的只有五篇文章。

李的最大贡献,是提出了无需重新初始化的水平集惩罚因子和局部能量模型。要讲清楚这个问题,说了话长,但今天时间有限,又要简短说明。

首先,必须搞清楚什么是水平集?这个很有难度,我相信大部分人都从未听过,就算是搞图像搞机器学习的。

1 什么是水平集?

水平集(LevelSet)是一种图像分割方法,就像阈值法(threshold),分水岭(watershed),图割算法(GraphCut)一样,只不过它主要用于医学图像分割。另外,它是一种基于能量泛函的图像分割方法,即它把图像分割的问题,转换为了最小化一个能量函数的问题(听不懂没关系)。

其实,要想理解水平集算法,应该先从snake以及曲线演化理论讲起。但是,那样又增加了本文的工作量,对于在手机上浮躁地翻开文章的我们来说,实在不是个明智之举。

所以咱们先上一个另外的概念,等高线!学过初中地理的都知道等高线是什么吧?

看下面的曲面,红色的虚线就是一条等高线。0?wx_fmt=png

图1

水平集的算法,最早上起源于物理学,是OSher和Sethian为了解决遵循热力学方程下火苗外形的变换过程,因为该演化过程是非常复杂的,具有高动态性和拓扑结构任意变换的属性,无法用带参数的数学表达式描述曲线或者曲面,现实生活中我们遇到的绝大多数实际问题也是没有精确的数学表达式的。

那么水平集算法的核心思想是什么嗯?那就是将要研究的问题,看做是更高一维空间的函数(也就是水平集函数)的零水平集。因此,当我们要追踪某一曲线(曲面)的演化过程,实际上就等价于追踪更高一维曲面的演化过程。0?wx_fmt=png

 

图2

如上图1至2的演化过程,如果对红色曲线建立一个随时间而变化的模型,是很困难的,因为发生了拓扑结构变化(一条曲线变成了两条),但是如果只是对蓝色的曲面建立随时间变化的过程,则是可行的,而红色曲线就是取其Z=0的水平集。

数学好的人有没有觉得眼熟?实际上,这就是隐函数的思想。

(1)y = f(x)

的等价写法就是

(2)Φ(x,y) = y - f(x)

Φ(x,y) = 0

当无法显式写出x为自变量的函数y,但是可以得到y与x的某种关系时,就能通过另外一种方法来表达,圆就是一个典型的例子,它的方程如下。

x2+y2=r2

非要写出y=f(x)是这样的:

0?wx_fmt=png这还只是最简单的圆,表达式既不优美也不好理解。

好了,那采用隐函数怎么描述刚才的曲线呢?

假设曲线为C,它是随时间变化的,那么曲面(也就是水平集函数spacer.gif)的描述式如下:

φ(C(t),t)=0

偏微分求解后就是一个如下的式子

0?wx_fmt=png给φ一个初始值,它就可以在F的作用下进行演化,然后令其等于0,就得到了C,原理何其明朗!

如此一来,最关键的问题就是求取F,也就是演化函数,这就是水平集方法的核心思想。当然实际上没有那么简单了,不过搞懂战略思想是最重要的一步。

2 为什么要讲水平集?

先给大家看几个数据吧。

世界卫生组织下属的官方癌症机构国际癌症研究中心(IARC)发布《2014年世界癌症报告》,参与编撰的有来自40多国的250多位科学家,对全球180多个国家的28种癌症的总体情况和流行趋势进行了全面的描述和分析,报告的数据基于2012年的统计结果。

根据报告统计数据显示,在2012年,全球新增癌症病例达到1400多万例,并预计在未来20年达到每年2200万的水平,同期癌症死亡人数也将从每年820万飙升至1300万,全球癌症负担目前正在以惊人的速度不断加重。0?wx_fmt=jpeg

那中国又如何呢?

2012年,全球新病例有一半发生在亚洲,其中大部分发生在中国,居全球首位。中国新增307万癌症患者并造成约220万人死亡。每10万人中约250人,全国每分钟有6人被诊断为癌症,人一生患恶性肿瘤的概率为22%(74岁),由于中国庞大的人口基数,使得中国成为第一癌症大国并不意外。其中肺癌是最普遍和最致命的癌症,2012年约新增180万患者并导致159万人死亡。其中中国约占此类病例的1/3以上。专家表示,吸烟、长期遭受空气污染和职业中接触致癌物,是增大(中国人)患肺癌风险的主要因素。你可能会说,有病就去治嘛,有什么问题。

问题是!

一方面逐年递增大量的病例,另一方面国内的医疗资源分布非常不均匀。来北京看一次病就知道了,医院的资源是多么的紧缺。去年北京市医疗机构的总诊疗人次是2.19亿,其中近一半是外地患者到北京来就诊,靠医生手动地诊断已经满足不了如此多的患者。另一方面,随着生活水平提升很多病人需要个性化的治疗(不差钱),这需要更智能的医疗诊断系统来追踪病人的病情发展,而目前的应用仍然不能令人满意,很大程度上是因为医疗图像处理的水平精度还不够。医学图像处理结果不能OK就行了,人命关天。漏判一个肿瘤,误判一个肿瘤,都是灾难性的。

医学图像处理包括很多方面,此处只讲分割。图像分割是底层的操作,也是图像处理里非常关键与基本的技术,它主要用于提取病变组织以便临床治疗定时追踪肿瘤细胞的大小,位置,生长状态,从而了解和预测病情的发展,以便进行治疗。

图像分割方法有很多,为什么偏偏要讲水平集?

这是因为医学图像不同于一般的图像,它有自己的特点。

(1) 对比度低。由于医学图像成像原理多样导致影响其图像质量的原因各不相同,而且医学图像的获取往往是借鉴间接的手段,如显影技术或者磁场效应,而非其他自然图像的获取,不可避免地导致获取的图像对比度与信噪比低。尤其是MRI图像中不可避免存在的灰度偏移场,CT图像中的部分容积效应,对医学图像算法的鲁棒性提出了较大的挑战。

(2) 个体差异明显。这一方面是由于各人的身体结构存在着差异性,导致即使对于相同的器官组织,相应的图像也可能存在较大的差异。另一方面是由于不可预知的病灶区域可能破坏了组织图像的完整性,对算法的通用性能提出了更大的挑战。

下面只上几张比较中规中矩的肿瘤图像。

0?wx_fmt=png0?wx_fmt=png

0?wx_fmt=png

上面是一些典型的脑肿瘤图,图中的白块就是肿瘤。为了让大家看的更直观,特地选出来一些比较好分割的图像,但是也并不是什么方法都能分割出来的,就我个人知识而言,不进行任何预处理,没有一种方法可以自动地直接将这些肿瘤都给分割出来。不信可以去问问周边搞图像的人,如果有,请务必告诉我。

下面是我的分割结果,算不上完全自动,但是也是基本上不需要监督。(仔细看肿瘤周围叠加的轮廓,就是分割的结果)

 

0?wx_fmt=png

0?wx_fmt=jpeg

0?wx_fmt=png

用到的方法就是水平集。

3 Why李春明

接下来才是最重要的,为什么要致敬李春明。

在水平集方法之前,有个snake方法,它也是基于能量泛函的方法。核心思想就是,首先在感兴趣区域的附近给出一条初始曲线,接下来在曲线固有内力(控制曲线的弯曲和拉伸)和图像外力(控制收敛到局部特征)的作用下收敛到目标的边界轮廓,再具体的公式就不想细说了,因为一两句话说不清楚。

它存在着很大的问题,也就是前面第一部分提到的,要将曲线进行参数化,这是个非常困难的问题,而且它还不能处理图像曲线的拓扑变换,所以才有了水平集的出场。

早期的水平集方法是边缘型的,对噪声非常敏感,而医学图像退化(含噪声,对比度低)非常厉害,所以应用很局限。后来Chan和Vese率先提出了简化的二值CV模型,通过加入曲线的长度项和面积项作为曲线演化的平滑约束项,获得能量函数如下。0?wx_fmt=png

接下来只有两个公式,尽管不写公式可能说不清楚这个问题,但我的最终目的是引导大家对此感兴趣,而不是用公式来吓大家。

上面的能量函数,就对应了图像分割的问题。使它最小化的曲线C,就是我们分割目标的轮廓,而且它能保证结果一定是光滑的,封闭的,其他的方法保证不了这一点,至少无法直接保证。

这就是水平集算法最大的好处,得到的结果曲线是处处可导的。

好是好,然而该方法是一个能量泛函最小化问题,经典解法就是最小梯度法,然后离散化按一定步长进行迭代直至收敛。在不断迭代的过程中,等高线(也就是零水平集)会变得不再光滑,如果不进行调整,就是使得演化过程越来越偏离正确结果。于是在很长一段时间里,就是各种重新求解水平集函数来约束其光滑的方法,它们都有一个特点,计算量非常大!再优化,也无法达到线性的复杂度。本来水平集方法演化就慢,这样一来就更加限制了其发展,而且每次迭代完后重新计算水平集的方法还无法保证精度。

在临床治疗中每天产生大量的样本,如果处理速度太慢是不可接受的。

改变的发生,似乎就是《Level set evolution without re-initialization》的发表。

当然,他干的有影响的不止这一件事,不过这是开始。一言以敝之,就是在原始的方程中添加了下面的二阶式子,作为惩罚项。

0?wx_fmt=png

它的微分如下:

 

0?wx_fmt=png

1-1/|▽φ|被称为扩散率函数,当水平集函数梯度大于1时,扩散率大于0,惩罚项起正向扩散作用,使得水平集函数更加光滑,从而减小梯度;反之使其增大。总之,它约束了水平集函数的梯度偏离1的程度,而当水平集函数的梯度能保持1时,对应的零水平集,也就是我们的分割轮廓是光滑处处连续可导的。后来李进一步改善了该算子,使得水平集函数在零水平集附近的梯度为1,而在远离零水平集的附近为0。当然也有人基于此方法的思想,采用了更加高阶的规整化方案。

好了,核心思想是什么?

那就是,如果曲线演化速度太快了,就让它慢一点,如果慢了,就快一点。它的存在,能在很大程度上保证零水平集曲线是光滑的。水平集函数φ不光滑的地方,▽φ就会大于1,从而使得P很大,对减小能量造成不利的影响。所以P是一个惩罚项,要想能量最小,作为它的求和项中一项的P也应该小,对应的也就是曲线光滑,不知道这样理解是不是简单一些?

有了这一项后,就只需要考虑以一定的步长进行离散迭代,而不需要每迭代一次就对水平集函数Φ进行一次复杂的计算了。

这堪称是里程碑式的研究成果,后来的水平集方法相关的论文很多都要在此思想上进行研究。

之所以要讲数学味挺浓的东西,一方面是因为图像处理算法本来最核心的就是数学,另一方面也是为了借此引出惩罚这个概念。因为,几乎在所有数学优化问题中,它都隐约可见。不掌握这个思想,接下来就举步维艰!

尽管已经尽量避免数学公式,试图按自己的语言把一些图像算法讲的浅显易懂,但是自己也还需要努力。而数学,我深刻感觉到学得再好也不为过,自己还非常非常欠缺。

本想插入两个小视频让大家直观地感受一下水平集方法的过程,无奈微信做不到,公式编辑也不好。提供一个demo如下:

https://math.berkeley.edu/~sethian/2006/Applications/Medical_Imaging/artery.html

最后说一句,我回来了!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 14
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
OpenCV是一个广泛使用的计算机视觉库,提供了许多图像处理和计算机视觉算法。水平集(Level Set)方法是一种用于图像分割、形状分析、图像引导的表面重建等领域的数学工具。OpenCV在版本4.1中并没有直接提供水平集方法,但你可以使用OpenCV的轮廓和边界提取功能,结合水平集方法来实现一些图像分割任务。 水平集方法的基本思想是将图像分割问题转化为一个能量的最小化问题,其中能量函数包括一个势函数和光滑性约束。水平集方法通过迭代地移动一个势函数(即水平集)来最小化能量函数,并逐渐逼近图像的轮廓或边界。 在OpenCV中,你可以使用边缘检测、霍夫变换等算法来提取图像的轮廓或边界,然后使用水平集方法对这些轮廓或边界进行平滑处理。具体来说,你可以使用OpenCV的边缘检测算法(如Canny边缘检测)来提取图像的轮廓,然后使用水平集方法对这些轮廓进行平滑处理。在平滑处理过程中,水平集方法会逐渐逼近图像的轮廓或边界,并将轮廓或边界上的噪声点逐渐去除。 需要注意的是,水平集方法是一种比较高级的图像分割方法,需要一定的数学基础和编程技巧。如果你对水平集方法不太熟悉,可以先学习一些相关的数学知识,并参考一些相关的文献和教程。同时,OpenCV提供的各种图像处理和计算机视觉算法也提供了许多其他有用的工具和方法,你可以结合使用这些工具和方法来实现各种计算机视觉任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值