在主动轮廓法中绘制能量

时间:2015-03-15 16:46:06

标签: matlab image-processing plot matlab-figure

我有一个类似的方程式 enter image description here

该算法由Lankton实施,您可以在code下载代码和图片。我想基于该代码来绘制能量函数。请注意,F是在该代码中计算的。我的目标能量数字如 enter image description here

我试图通过该代码实现它。但这不是正确答案

  Energy=[];
  %--main loop
  for its = 1:max_its   % Note: no automatic convergence test

    %-- get the curve's narrow band
    idx = find(phi <= 1.2 & phi >= -1.2)';  
    [y x] = ind2sub(size(phi),idx);

    %-- get windows for localized statistics
    xneg = x-rad; xpos = x+rad;      %get subscripts for local regions
    yneg = y-rad; ypos = y+rad;
    xneg(xneg<1)=1; yneg(yneg<1)=1;  %check bounds
    xpos(xpos>dimx)=dimx; ypos(ypos>dimy)=dimy;

    %-- re-initialize u,v,Ain,Aout
    u=zeros(size(idx)); v=zeros(size(idx)); 
    Ain=zeros(size(idx)); Aout=zeros(size(idx)); 
    F_energy=zeros(size(idx));
    %-- compute local stats
    for i = 1:numel(idx)  % for every point in the narrow band
      img = I(yneg(i):ypos(i),xneg(i):xpos(i)); %sub image
      P = phi(yneg(i):ypos(i),xneg(i):xpos(i)); %sub phi

      upts = find(P<=0);            %local interior
      Ain(i) = length(upts)+eps;
      u(i) = sum(img(upts))/Ain(i);

      vpts = find(P>0);             %local exterior
      Aout(i) = length(vpts)+eps;
      v(i) = sum(img(vpts))/Aout(i);
      F_energy(i)=sum((img(upts)-u(i)).^2)+sum((img(vpts)-v(i)).^2); %% Compute the first term in (5) without integrate
    end   

    %-- get image-based forces
    F = -(u-v).*(2.*I(idx)-u-v);
    % Compute the second term in (5) 
    u=phi<=0;
    bw2=bwperim(u);
    Length_phi=sum(sum(bw2));
    Energy=[Energy (sum(F_energy(:))+alpha.*Length_phi)];
    end

也许这是一项艰巨的任务,因为能量函数非常复杂。但是,除了enrgy term之外,所有的东西都是通过上面的代码实现的。希望你能理解并帮助我画出能量函数。提前谢谢

这是我的数字结果。但是,它与纸张结果不相似。我的结果是在接近零点时能量最小。但论文的结果并非如此。我的代码中发生了什么。 enter image description here

1 个答案:

答案 0 :(得分:2)

您确定您的参数与原始纸张中使用的参数类似吗?我观察到每次迭代中的能量至少取决于两件事:

  • 半径
  • 初始化掩码

该论文确实证实了这种关系:

  

B(x,y)功能选择的球的半径为a   使用局部能量时要考虑的重要参数。

  

所提方法的一个限制是它具有更大的优势   对初始化的敏感性高于基于全局区域的方法。

下图显示了我使用您的代码实现的目标:

Results

请注意,在原始纸张中,X轴单位是秒。代码在每次迭代中为我们提供能量。如果不知道原始计算中的一次迭代的持续时间(在论文中描述),我们就无法真正比​​较这些图。然而,我的与原来的更相似。

这是初始化掩码的代码(对应于绘图):

I = imread('Mushroom.png');         %-- load the image
m = false(size(I,1),size(I,2));     %-- create initial mask
m(60:100,15:80) = true;             %-- initial mask coordinates

最大迭代次数:400
半径:20

希望我帮助过。