当前位置:首页 > 代码 > 正文

水平集图像分割代码(基于水平集的图像分割)

admin 发布:2022-12-19 23:05 176


本篇文章给大家谈谈水平集图像分割代码,以及基于水平集的图像分割对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

怎么修改level set代码 里面的参数,使得图像的分割效果最好

如果给你一条初始封闭轮廓曲线C,进行水平集图像分割,我们需要写的第一个函数就是计算图像的每个像素点p(x,y)到曲线的最短距离d,如果该像素点p位于曲线C的内部,那么有向距离为-d;反之为d。

求助,急,Matlab水平集算法的图像分割程序解释

u=EVOLUTION(u, g ,lambda, mu, alf, epsilon, timestep, 1);

必须要有函数支持,或者调用动态链接库(dll)。

核心代码在这个函数或dll文件中。

matlab 程序解释 急需

在这里:

function u = EVOLUTION(u0, g, lambda, mu, alf, epsilon, delt, numIter)

% EVOLUTION(u0, g, lambda, mu, alf, epsilon, delt, numIter) updates the level set function

% according to the level set evolution equation in Chunming Li et al's paper:

% "Level Set Evolution Without Reinitialization: A New Variational Formulation"

% in Proceedings CVPR'2005,

% Usage:

% u0: level set function to be updated

% g: edge indicator function

% lambda: coefficient of the weighted length term L(\phi)

% mu: coefficient of the internal (penalizing) energy term P(\phi)

% alf: coefficient of the weighted area term A(\phi), choose smaller alf

% epsilon: the papramater in the definition of smooth Dirac function, default value 1.5

% delt: time step of iteration, see the paper for the selection of time step and mu

% numIter: number of iterations.

%

u=u0;

[vx,vy]=gradient(g);

for k=1:numIter

u=NeumannBoundCond(u);

[ux,uy]=gradient(u);

normDu=sqrt(ux.^2 + uy.^2 + 1e-10);

Nx=ux./normDu;

Ny=uy./normDu;

diracU=Dirac(u,epsilon);

K=curvature_central(Nx,Ny);

weightedLengthTerm=lambda*diracU.*(vx.*Nx + vy.*Ny + g.*K);

penalizingTerm=mu*(4*del2(u)-K);

weightedAreaTerm=alf.*diracU.*g;

u=u+delt*(weightedLengthTerm + weightedAreaTerm + penalizingTerm); % update the level set function

end

% the following functions are called by the main function EVOLUTION

function f = Dirac(x, sigma) %水平集狄拉克计算

f=(1/2/sigma)*(1+cos(pi*x/sigma));

b = (x=sigma) (x=-sigma);

f = f.*b;

function K = curvature_central(nx,ny); %曲率中心

[nxx,junk]=gradient(nx);

[junk,nyy]=gradient(ny);

K=nxx+nyy;

function g = NeumannBoundCond(f)

% Make a function satisfy Neumann boundary condition

[nrow,ncol] = size(f);

g = f;

g([1 nrow],[1 ncol]) = g([3 nrow-2],[3 ncol-2]);

g([1 nrow],2:end-1) = g([3 nrow-2],2:end-1);

g(2:end-1,[1 ncol]) = g(2:end-1,[3 ncol-2]);

医学图像分割及应用

截至目前,我们已经学习了很多关于图像分割的相关算法,就此,对图像的分割算法做以下总结:

基于能量的分割 方法,有一些显著的缺点,如:

水平集算法的提出可以有效解决上述缺点,所谓水平,即指同一高度的一些像素点,将水平集的算法引入到图像分析的领域,水平集算法提出了一个更高的维度来表达这些曲线。

水平集算法对图像的活动轮廓分割有一些新的术语表达:

contour front

contour energy forces

image energy speed function

为了避免3D 轮廓计算的复杂性,提出一个 零水平集(zero level set)的概念,并且提出了一个动态的坐标平面 表达front的演化,如下图所示,我们总能总结出当前 时刻的水平面,根据曲面的函数表达,总能总能计算出下一时刻的轮廓演化。与图像能量表达的轮廓不同,水平集算法多了一个平面的维度对轮廓施加影响。

水平集算法通过零水平集的设置和初始轮廓的约束求解偏微分方程的方式实现。

如下图所示,形象地表示了一个水平集算法的原理示意图,在front里面的点小于0,而front外面的点大于0,零水平面所对应的点设为0

不需要移动轮廓,仅仅通过改变图片中的一些值就可以很容易地实现图像地分割。

水平集算法的运算流程如下:

水平集算法的一个重要概念是速度函数(speed function),而对速度函数

有以下三个概念:

front通过迭代实现繁衍,而迭代的过程必有一个停止条件,此条件是由图像本身的性质决定的,gradient函数来表示这一停止条件,如 ,有以下三种常用的函数:

水平集算法的扩展可以从两个方向进行:

为了改进水平,提出了一个快速行进算法(Fast Marching)

Fast Marching 算法使得front朝着一个方向前进,要么扩展,要么收缩,避免了分割轮廓的抖动,提高了算法的运行速度,同时,为了避免轮廓的碰撞,每个网路与轮廓点只交叉一次。

在实际的算法应用中,通常将Fast Marching算法和 水平集算法结合来完成图像的分割,用Fast Marching 算法高效的实现轮廓线的行进,完成一个粗分割,当算法趋向于收敛时,用水平集算法完成更为精准的分割。

如下图所示,任意一个时刻点轮廓线网格点交叉的坐标 ,并且在任意高度处,表面会给出在 时刻所到达点的集合。

关于水平集图像分割代码和基于水平集的图像分割的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/29233.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载