热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

代表文章:《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以及曲线演化理论讲起。但是,那样又增加了本文的工作量,对于在手机上浮躁地翻开文章的我们来说,实在不是个明智之举。

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

看下面的曲面,红色的虚线就是一条等高线。

1

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

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

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)是这样的:


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

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

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

φ(C(t),t)=0

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


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

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

2 为什么要讲水平集?

先给大家看几个数据吧。

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

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

那中国又如何呢?

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

问题是!

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

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

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

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

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

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

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

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

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

用到的方法就是水平集。

3 Why李春明

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

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

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

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

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

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

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

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

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

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

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

它的微分如下:


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

好了,核心思想是什么?

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

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

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

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

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

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

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


转载自:水平集


推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
author-avatar
WSDRFCGFC_901
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有