声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 7437|回复: 4

[共享资源] 水平集算法matlab实现

[复制链接]
发表于 2006-9-6 15:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

  5. % 初始化参数
  6. ITERATIONS = 500;%迭代次数
  7. delta_t = 0.1;%时间步长
  8. %轮廓内外能量参数
  9. lambda1 = 1;
  10. lambda2 = 1;
  11. nu = 0;
  12. %曲率项参数
  13. h = 1; h_sq = h^2;
  14. epsilon = 1;
  15. mu = 0.01 * 255^2;

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

  18. for ii = 1 : ITERATIONS;

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

  21.   % 每d_it显示一次图像
  22.   if( mod( ii - 1, d_it ) == 0 )
  23.     disp( 'Displaying Segmented Image' );
  24.     segim = createim( u0, phi );
  25.     clf; imshow( segim );
  26.     drawnow;
  27.   end;
  28.   
  29.   % 每m_it次保存一次图像
  30.    if( mod( ii - 1, m_it ) == 0 )
  31.     segim = createim( u0, phi );
  32.     filename = strcat( m_name, sprintf( '%06d', ( ( ii - 1 )/ m_it ) + 1 ), '.png' );
  33.     imwrite( segim, filename );
  34.   end;

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

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

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

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

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


  52. %子函数
  53. %初始化水平集函数,符号距离函数
  54. function phi = initsdf( imsize, center, radius, isinside )
  55. m = imsize( 1 ); n = imsize( 2 );
  56. phi = zeros( imsize );
  57. for i = 1 : m;
  58.   for j = 1 : n;
  59.      distance = sqrt( sum( ( center - [ i, j ] ).^2 ) );
  60.      phi( i, j ) = distance - radius;
  61.     if( isinside == 0 )
  62.       phi( i, j ) = -phi( i, j );
  63.     end
  64.   end
  65. end

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

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

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

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

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

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

  84. tempim = im;
  85. tempim( find( isfro( phi ) ) ) = 255;

  86. newim( :, :, 2 ) = tempim;

  87. newim = uint8( newim );

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

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

  97.   end
  98. end
复制代码

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2006-9-8 14:44 | 显示全部楼层
谢谢!不过水平集理解起来还是比较困难的
发表于 2006-9-14 10:08 | 显示全部楼层
我同学一直想要这方面的内容,这回可以帮他了!!
发表于 2011-2-9 19:36 | 显示全部楼层
程序怎么使用啊?
发表于 2011-2-9 19:37 | 显示全部楼层
m_name是什么啊?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-18 08:01 , Processed in 0.100288 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表