http://forum.vibunion.com/thread-24651-1-1.html

function phiy = activecontourCV( u0, center, radius, isinside, d_it, m_it, m_name )

% 用主动轮廓线CV算法对输入图像u0实现图像边缘提取
% 输入图像为double型,灰度为1—256的图像。选用圆形起始轮廓线
% center为起始轮廓线原点,radius为起始轮廓线半径。isinside 表示边缘目标在起始轮廓线外还是内,=1表示目标在起始轮廓线内,=0表示在外

% 初始化参数
ITERATIONS = 500;%迭代次数
delta_t = 0.1;%时间步长
%轮廓内外能量参数
lambda1 = 1;
lambda2 = 1;
nu = 0;
%曲率项参数
h = 1; h_sq = h^2;
epsilon = 1;
mu = 0.01 * 255^2;

% 初始化符号距离函数
phi = initsdf( size( u0 ), center, radius, isinside );

for ii = 1 : ITERATIONS;

% 显示当前迭代次数
  fprintf( 1, '%d\n', ii );

% 每d_it显示一次图像
  if( mod( ii - 1, d_it ) == 0 )
    disp( 'Displaying Segmented Image' );
    segim = createim( u0, phi );
    clf; imshow( segim );
    drawnow;
  end;
  
  % 每m_it次保存一次图像
   if( mod( ii - 1, m_it ) == 0 )
    segim = createim( u0, phi );
    filename = strcat( m_name, sprintf( '%06d', ( ( ii - 1 )/ m_it ) + 1 ), '.png' );
    imwrite( segim, filename );
  end;

%delta_t*狄力克函数
  dirac_delta_t = delta_t * diracfunction( phi, epsilon );

% 计算轮廓线内外能量
  [ inside, outside ] = calcenergyf( u0, phi, epsilon );
  energy_term = -nu - lambda1 .* inside + lambda2 .* outside;%能量项

% 中心差分
  dx_central = ( circshift( phi, [ 0, -1 ] ) - circshift( phi, [ 0, 1 ] ) ) / 2;
  dy_central = ( circshift( phi, [ -1, 0 ] ) - circshift( phi, [ 1, 0 ] ) ) / 2;

% div(delt_phi/|delta_phi|)
  abs_grad_phi = ( sqrt( dx_central.^2 + dy_central.^2 ) + 0.00001 );
  x = dx_central ./ abs_grad_phi;
  y = dy_central ./ abs_grad_phi;
  grad_term = ( mu / h_sq ) .* divergence( x, y );%梯度能量

% phi(n+1)
  phi = phi + dirac_delta_t .* ( grad_term + energy_term );
  phiy(:,:,ii)=phi;%保存每次迭代结果
end;

%子函数
%初始化水平集函数,符号距离函数
function phi = initsdf( imsize, center, radius, isinside )
m = imsize( 1 ); n = imsize( 2 );
phi = zeros( imsize );
for i = 1 : m;
  for j = 1 : n;
     distance = sqrt( sum( ( center - [ i, j ] ).^2 ) );
     phi( i, j ) = distance - radius;
    if( isinside == 0 )
      phi( i, j ) = -phi( i, j );
    end
  end
end

%狄力克函数,利于检测出目标的空心部分
function y = diracfunction( x, epsilon )
y = ( 1 ./ pi ) .* ( epsilon ./ ( epsilon.^2 + x.^2 ) );

%用于求轮廓内外能量
function value = heavisidef( z, epsilon )
value = 0.5 .* ( 1 + ( 2 ./ pi ) .* atan( z ./ epsilon ) );

%求轮廓内外能量
function [ inside, outside ] = calcenergyf( u0, phi, epsilon )
H_phi = heavisidef( phi, epsilon );
H_phi_minus = 1 - heavisidef( phi, epsilon );

c1 = sum( sum( u0 .* H_phi ) ) /  sum( sum( H_phi ) );
c2 = sum( sum( u0 .* H_phi_minus ) ) / sum( sum( H_phi_minus ) );

inside = ( u0 - c1 ).^2;
outside = ( u0 - c2 ).^2;

%显示代轮廓的图像,轮廓为零水平集,用ifro检测出。将原图和轮廓叠加为rgb图像,轮廓用绿色表示
function newim = createim( im, phi )
newim( :, :, 1 ) = im;
newim( :, :, 3 ) = im;

tempim = im;
tempim( find( isfro( phi ) ) ) = 255;

newim( :, :, 2 ) = tempim;

newim = uint8( newim );

%检测零水平集的位置
function front = isfro( phi )
[ n, m ] = size( phi );
front = zeros( size( phi ) );
for i = 2 : n - 1;
  for j = 2 : m - 1;

maxVal = max( max( phi( i:i+1, j:j+1 ) ) );
    minVal = min( min( phi( i:i+1, j:j+1 ) ) );
    front( i, j ) = ( ( maxVal > 0 ) & ( minVal < 0 ) ) | phi( i, j ) == 0;

end
end

水平集算法matlab实现相关推荐

  1. 『分享』水平集算法简介(Level Set)

    注:原文网页广告太多,决定转帖到这里,待更新! [原链接]http://www.caogenit.com/caogenxueyuan/yingyongfangxiang/rengongzhineng/ ...

  2. 【图像分割】基于 C-V模型水平集图像分割Matlab代码

    1 简介 图像分割是计算机视觉中的关键步骤之一.传统的分割方法由于方法自身的局部性,难以满足复杂分割的要求,基于水平集方法的图像分割研究正是这种需求下出现的.C-V模型对灰度图像的变化处理非常自然,解 ...

  3. 图像分割 - 水平集算法

    水平集介绍 水平集分为三种: 1 . 基于图像边缘灰度梯度信息 ,适用于边缘强的图像分割 2 . 基于区域特征 ,利用区域信息引导曲线慢慢靠近 ,比如分割曲线区域的内外灰度均值,分割曲线内部区域面积( ...

  4. [图像处理]水平集(Level set)算法实现思路(简化)

    [图像处理]水平集(Level set)算法实现思路(简化) 创建时间:2020年6月22日 修改时间:2021年6月12日 文章目录 [图像处理]水平集(Level set)算法实现思路(简化) 一 ...

  5. 水平集(level set)算法原理介绍

    本篇文章,解释的是水平集算法最基础的原理. 1 水平集方法的解释  有一个表面S,它与一个平面P相交,得到一个曲线C,这个C就是我们通过水平集得到的轮廓.  在图像分割中,表面S是随着由图像派生得到的 ...

  6. 基于水平集方法和G0模型的SAR图像分割

    基于水平集方法和G0模型的SAR图像分割 Abstract(摘要) 这篇文章提出了一种分割SAR图像的方法,探索利用SAR数据中的统计特性将图像分区域.我们假设为SAR图像分割分配参数,并与水平集模型 ...

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

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

  8. 水平集(Level Set)的基本方法

    水平集(Level Set)的基本方法 水平集(Level Set)的基本方法-曲线演化的直观解释 映射C(p), p\in [a,b] : R→R^2定义了一个平面的曲线,p是参数,对属于区间[a, ...

  9. 基于水平集的图像分割方法

    一.引言 借鉴一些流体中的重要思想, 1988年,Osher和Sethian首次提出了水平集算法[1],这是一种有效解决曲线演化问题的数值方法,并且计算稳定,适宜任意维数空间.随后,Osher等人对水 ...

最新文章

  1. 蚂蚁森林合种计划(2020.12.19更新,7天有效)
  2. RIA Service + dataformc操作例子
  3. JAVA .xml 配置和 .properties 配置
  4. python2必须安装步骤_Python入门-第三方库的安装及环境配置(2)
  5. 分布式计算的模式语言读后感--基线架构
  6. Qt工作笔记-让界面飞一会(让界面旋转出来)
  7. SqlServer之xp_cmdshell_使用以及配置(转)
  8. How to deploy Odoo 11 on Ubuntu 18.04
  9. potplayer最全使用教程,【无边框透明美化教程】+【全球IPTV电视直播教程】+【不用下载观看影视剧教程】!
  10. Nginx打包RPM(FPM工具)
  11. html+css的响应式个人简历
  12. 突出的就是一个「性价比」— 小新 Air 14 2020 评测
  13. Socket协议脚本编写
  14. 2022年中级网络工程师备考(网络知识部分)
  15. 台式计算机电源待机电流有多大,终于知晓电脑机箱电源12v多少安
  16. java一元抢购,拼多多1元抢购的步骤是什么?
  17. buck斩波电路matlab,直流斩波电路的MATLAB建模与仿真.doc
  18. 简析H264编码中的GOP
  19. 基于PHP+mysql的学生管理系统班级网站同学录
  20. Android CPU 双核,骁龙MSM8625双核处理器

热门文章

  1. 小红书最新用户量数据_小红书用户量有多少,小红书2019数据分析
  2. SQL Server 存储过程的优点
  3. boost中cannot bind rvalue reference of type to lvalue of type问题
  4. windows用cmd命令进入文件夹目录
  5. c++基础学习之QT 信号和槽机制的底层实现
  6. Qcom_Sensor(九)--- 之 aDSP端Sensor Driver流程
  7. 【EI会议+西南科技大学主办】2023年第四届绿色能源、环境与可持续发展国际学术会议(GEESD 2023)
  8. tomcat修改默认端口
  9. 第833期机器学习日报(2016-12-29)
  10. 自动(智能)驾驶 | 时间同步之给工控机授时(PPS+GPRMC)