切割图像(五)主动轮廓模型Snake简要模型

zouxy09@qq.com

http://blog.csdn.net/zouxy09

在“图像切割之(一)概述”中咱们简单了解了眼下主流的图像切割方法。以下咱们主要学习下基于能量泛函的切割方法。这里学习下Snake模型简单的知识,Level
Set(水平集)模型会在后面的博文中说到。

基于能量泛函的切割方法:

该类方法主要指的是活动轮廓模型(active contour model)以及在其基础上发展出来的算法,其基本思想是使用连续曲线来表达目标边缘。并定义一个能量泛函使得其自变量包含边缘曲线。因此切割过程就转变为求解能量泛函的最小值的过程,一般可通过求解函数相应的欧拉(Euler.Lagrange)方程来实现,能量达到最小时的曲线位置就是目标的轮廓所在。

主动轮廓线模型是一个自顶向下定位图像特征的机制,用户或其它自己主动处理过程通过事先在感兴趣目标附近放置一个初始轮廓线,在内部能量(内力)和外部能量(外力)的作用下变形外部能量吸引活动轮廓朝物体边缘运动,而内部能量保持活动轮廓的光滑性和拓扑性,当能量达到最小时,活动轮廓收敛到所要检測的物体边缘。

一、曲线演化理论

曲线演化理论在水平集中运用到,但我感觉在主动轮廓线模型的切割方法中,这个知识是公用的,所以这里我们简单了解下。

曲线能够简单的分为几种:

曲线存在曲率,曲率有正有负,于是在法向曲率力的推动下。曲线的运动方向之间有所不同:有些部分朝外扩展,而有些部分则朝内运动。这样的情形例如以下图所看到的。

图中蓝色箭头处的曲率为负。而绿色箭头处的曲率为正。

简单曲线在曲率力(也就是曲线的二次导数)的驱动下演化所具有的一种很特殊的数学性质是:一切简单曲线,不管被扭曲得多么严重,仅仅要还是一种简单曲线。那么在曲率力的推动下终于将退化成一个圆。然后消逝(能够想象下,圆的全部点的曲率力都向着圆心,所以它将慢慢缩小,以致最后消逝)。

描写叙述曲线几何特征的两个重要參数是单位法矢和曲率。单位法矢描写叙述曲线的方向,曲率则表述曲线弯曲的程度。

曲线演化理论就是仅利用曲线的单位法矢和曲率等几何參数来研究曲线随时间的变形。曲线的演变过程能够觉得是表示曲线在作用力 F
的驱动下。朝法线方向 N 以速度 v
演化。

而速度是有正负之分的,所以就有假设速度 v 的符号为负,表示活动轮廓演化过程是朝外部方向的。如为正,则表示朝内部方向演化。活动曲线是单方向演化的。不可能同一时候往两个方向演化。

所以曲线的演变过程,就是不同力在曲线上的作用过程,力也能够表达为能量。世界万物都趋向于能量最小而存在。

由于此时它是最平衡的。消耗最小的(不知理解对不?)。那么在图像切割里面。我们目标是把目标的轮廓找到,那么在目标的轮廓这个地方,整个轮廓的能量是最小的。那么曲线在图像不论什么一个地方,都能够由于力朝着这个能量最小的轮廓演变,当演变到目标的轮廓的时候,由于能量最小。力平衡了,速度为0了,也就不动了,这时候目标就被我们切割出来了。

那如今关键就在于:1)这个轮廓我们怎么表示;2)这些力怎么构造,构造哪些力才干够让目标轮廓这个地方的能量最小?

这两个问题的描写叙述和解决就衍生出了非常多的基于主动轮廓线模型的切割方法。

第一个问题的回答。就形成了两大流派:假设这个轮廓是參数表示的,那么就是參数活动轮廓模型(parametric active contour model),典型为snake模型。假设这个轮廓是几何表示的,那么就是几何活动轮廓模型(geometric
active contour model),即水平集方法(Level Set),它是把二维的轮廓嵌入到三维的曲面的零水平面来表达的(能够理解为一座山峰的等高线,某个等高线把山峰切了。这个高度山峰的水平形状就出来了,也就是轮廓了)。所以低维的演化曲线或曲面,表达为高维函数曲面的零水平集的间接表达形式(这个轮廓的变化,直观上我们就能够调整山峰的形状或者调整登高线的高度来得到)。

那对于第二个问题。是两大流派都遇到的问题。是他们都须要解决的最关键的问题。哪些力才干够达到切割的目标呢?这将在后面聊到。

二、Snakes模型

自1987年Kass提出Snakes模型以来。各种基于主动轮廓线的图像切割理解和识别方法如雨后春笋般蓬勃发展起来。Snakes模型的基本思想非常easy,它以构成一定形状的一些控制点为模板(轮廓线)。通过模板自身的弹性形变。与图像局部特征相匹配达到调和。即某种能量函数极小化。完毕对图像的切割。再通过对模板的进一步分析而实现图像的理解和识别。

简单的来讲,SNAKE模型就是一条可变形的參数曲线及对应的能量函数,以最小化能量目标函数为目标,控制參数曲线变形。具有最小能量的闭合曲线就是目标轮廓。

构造Snakes模型的目的是为了调和上层知识和底层图像特征这一对矛盾。不管是亮度、梯度、角点、纹理还是光流,全部的图像特征都是局部的。

所谓局部性就是指图像上某一点的特征仅仅取决于这一点所在的邻域,而与物体的形状无关。

可是人们对物体的认识主要是来自于其外形轮廓。

怎样将两者有效地融合在一起正是Snakes模型的好处。Snakes模型的轮廓线承载了上层知识。而轮廓线与图像的匹配又融合了底层特征。这两项分别表示为Snakes模型中能量函数的内部力和图像力。

模型的形变受到同一时候作用在模型上的很多不同的力所控制,每一种力所产生一部分能量,这部分能量表示为活动轮廓模型的能量函数的一个独立的能量项。

Snake模型首先须要在感兴趣区域的附近给出一条初始曲线,接下来最小化能量泛函,让曲线在图像中发生变形并不断逼近目标轮廓。

Kass等提出的原始Snakes模型由一组控制点:v(s)=[x(s), y(s)]   s∈[0, 1]
组成,这些点首尾以直线相连构成轮廓线。当中x(s)和y(s)分别表示每一个控制点在图像中的坐标位置。

s
是以傅立叶变换形式描写叙述边界的自变量。在Snakes的控制点上定义能量函数(反映能量与轮廓之间的关系):

当中第1项称为项称为项是外部能量(外部力),在基本Snakes模型中一般仅仅取控制点或连线所在位置的图像局部特征比如梯度:

也称图像力。(,也就是停止运动了。这样,C就停在图像的边缘位置了。也就完毕了切割。

那么这个的前提就是目标在图像中的边缘比較明显了,否则非常easy就越过边缘了。

弹性能量和弯曲能量合称内部能量(内部力),用于控制轮廓线的弹性形变,起到保持轮廓连续性和平滑性的作用。而第三项代表外部能量,也被称为图像能量。表示变形曲线与图像局部特征吻合的情况。

内部能量只跟snake的形状有关,而跟图像数据无关。而外部能量只跟图像数据有关。在某一点的α和β的值决定曲线能够在这一点伸展和弯曲的程度。

个力的联合作用下工作的。

由于图像上的点都是离散的。所以我们用来优化能量函数的算法都必须在离散域里定义。

所以求解能量函数Etotal(v)极小化是一个典型的变分问题(微分运算中,自变量通常是坐标等变量。因变量是函数。变分运算中。自变量是函数,因变量是函数的函数,即数学上所谓的泛函。对泛函求极值的问题。数学上称之为变分法)。

在离散化条件(数字图像)下,由欧拉方程可知终于问题的答案等价于求解一组差分方程:(欧拉方程是泛函极值条件的微分表达式。求解泛函的欧拉方程,就可以得到使泛函取极值的驻函数。将变分问题转化为微分问题。

记外部力 F = −∇ P, Kass等将上式离散化后,对x(s)和y(s)分别构造两个五对角阵的线性方程组,通过迭代计算进行求解。在实际应用中一般先在物体周围手动点出控制点作为Snakes模型的起始位置。然后对能量函数迭代求解。

以上仅仅是对snake简单的理解,如要深入,请參考其它很多其它专业文献。水平有限,错误在所难免,还望不吝指正。

Reference:

李天庆等,Snake模型综述,计算机project,2005。文章31音量 
文章9期

切割图像(五)主动轮廓模型Snake简要模型的更多相关文章

  1. Java NIO学习与记录(五): 操作系统的I/O模型

    操作系统的I/O模型 在开始介绍NIO Reactor模式之前,先来介绍下操作系统的五种I/O模型,了解了这些模型,对理解java nio会有不小的帮助. 先来看下一个服务端处理一次网络请求的流程图: ...

  2. 本图片处理类功能非常之强大可以实现几乎所有WEB开发中对图像的处理功能都集成了,包括有缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等功能

    import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  3. .NET平台下几种SOCKET模型的简要性能供参考

    转载自:http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html .NET平台下几种SOCKET模型的简要性能供参考 这个内容在cnbl ...

  4. word2vec 中的数学原理具体解释(五)基于 Negative Sampling 的模型

      word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了非常多人的关注. 因为 word2vec 的作者 Tomas ...

  5. 查找图像中椭圆轮廓的快速随机hough变换

    查找图像中椭圆轮廓的快速随机hough变换 图像中椭圆轮廓的查找在视频监控等领域有着广泛的应用,经典hough变换给我们提供了一种查找各种图形轮廓的方法,特别是在直线查找方面具有非常高的精确度.但是由 ...

  6. 《Interest Rate Risk Modeling》阅读笔记——第五章:久期向量模型

    目录 第五章:久期向量模型 思维导图 久期向量的推导 久期向量 广义久期向量 一些想法 第五章:久期向量模型 思维导图 久期向量的推导 \[ V_0 = \sum_{t=t_1}^{t_n} CF_t ...

  7. NLP(二十五)实现ALBERT+Bi-LSTM+CRF模型

      在文章NLP(二十四)利用ALBERT实现命名实体识别中,笔者介绍了ALBERT+Bi-LSTM模型在命名实体识别方面的应用.   在本文中,笔者将介绍如何实现ALBERT+Bi-LSTM+CRF ...

  8. linux下多路复用模型之Select模型

    Linux关于并发网络分为Apache模型(Process per Connection (进程连接) ) 和TPC , 还有select模型,以及poll模型(一般是Epoll模型) Select模 ...

  9. PHP:执行模型和内存模型

    PHP:执行模型和内存模型 背景 对于任何一种语言,了解其执行模型和内存模型都是有意义的,本文中的内容不见得正确,请多批评. 执行模型 每个请求都是一个独立的PHP进程,两个请求之间会完全隔离,会话和 ...

随机推荐

  1. R语言与数据分析之九:时间内序列--HoltWinters指数平滑法

    今天继续就指数平滑法中最复杂的一种时间序列:有增长或者减少趋势而且存在季节性波动的时间序列的预測算法即Holt-Winters和大家分享.这样的序列能够被分解为水平趋势部分.季节波动部分,因此这两个因 ...

  2. .idata数据的解析

    每类Section代表不同的数据,不同的数据存储组织方式一定是有非常大区别的.代码段与资源段一定区别巨大,这意味着我需要一个一个的学习每个段的解析. idata段解析 这个段主要存储的是导入符号信息. ...

  3. win7下硬盘安装win7+CentOS双系统方法

    原文:win7下硬盘安装win7+CentOS双系统方法 LinuxCentOS安装大致介绍: win7下硬盘安装win7+CentOS双系统方法 原则: 所有的看完在装,请仔细看 一 条件: 1. ...

  4. [置顶] 一步一步学android之事件篇——下拉列表事件

    上一篇RadioGroup比较简单,所以再学习个spinner的OnItemSelectedListener事件,前面说过spinner的主要功能就是提供列表显示的选择,比如我们在选择城市的时候就会用 ...

  5. android 图片水平反复平铺(repeat x)

    <=用来反复显示的图 1.最简单方式 创建wave_repeat.xml <?xml version="1.0" encoding="utf-8"? ...

  6. Android -&gt; 怎样避免Handler引起内存泄露

    很多其它内容,可訪问个人博客www.liangfeizc.com 错误代码 假设在Activiy中通过内部类(Runnable)的方式定义了一个变量runnable, final Runnable r ...

  7. Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes(后缀数组orKMP)

    D. Prefixes and Suffixes time limit per test 1 second memory limit per test 256 megabytes input stan ...

  8. 移动开发平台-应用之星app制作教程

    目前在AppStore.GooglePlay等应用商店里已经有以百万计的Apps,应用程序使移动互联网空间得以无限拓展.很多人梦想着AngryBirds式的奇迹在自己身上发生,他们渴望自己开发的应用程 ...

  9. HttpAsyncClient 做并发长连接的一个实例

    HttpAsyncClient 做并发长连接的一个实例 import java.util.concurrent.CountDownLatch; import org.apache.http.HttpR ...

  10. DataInputStream类readLong()引起的思考

    今天无意中看了下jdk中的DataInputStream类,然后看到readLong()方法,如下: private byte readBuffer[] = new byte[8]; public f ...