Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 主动轮廓法中的能量提取_Matlab_Image Processing_Plot_Matlab Figure - Fatal编程技术网

Matlab 主动轮廓法中的能量提取

Matlab 主动轮廓法中的能量提取,matlab,image-processing,plot,matlab-figure,Matlab,Image Processing,Plot,Matlab Figure,我有一个能量方程,比如 该算法由实现,您可以在下载代码和图像。我想根据这个代码来画能量函数。请注意,F是在该代码中计算的。我的目标能量值,如 我试着用那个代码来实现它。但这不是正确的答案 Energy=[]; %--main loop for its = 1:max_its % Note: no automatic convergence test %-- get the curve's narrow band idx = find(phi <= 1.

我有一个能量方程,比如

该算法由实现,您可以在下载代码和图像。我想根据这个代码来画能量函数。请注意,F是在该代码中计算的。我的目标能量值,如

我试着用那个代码来实现它。但这不是正确的答案

  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
Energy=[];
%--主回路
对于its=1:max_its%注:无自动收敛测试
%--获取曲线的窄带
idx=查找(φ=-1.2)';
[y x]=ind2sub(尺寸(φ),idx);
%--获取本地化统计信息的窗口
xneg=x-rad;xpos=x+rad;%获取局部区域的下标
yneg=y-rad;ypos=y+rad;
xneg(xnegdimy)=dimy;
%--重新初始化u、v、Ain、Aout
u=零(大小(idx));v=零(尺寸(idx));
Ain=零(尺寸(idx));Aout=零(大小(idx));
F_能量=零(大小(idx));
%--计算本地统计数据
对于i=1:窄带中每个点的numel(idx)%
img=I(yneg(I):ypos(I),xneg(I):xpos(I));%子映像
P=phi(yneg(i):ypos(i),xneg(i):xpos(i));%亚披
upts=查找(P0);%局部外部
Aout(i)=长度(vpts)+eps;
v(i)=和(img(vpts))/Aout(i);
F_能量(i)=总和((img(upts)-u(i))。^2)+总和((img(vpts)-v(i))。^2);%计算(5)中的第一项,无需积分
结束
%--获取基于图像的部队
F=-(u-v)。*(2.*I(idx)-u-v);
%计算(5)中的第二项

u=phi您确定您的参数与原始文件中使用的参数相似吗?我观察到,每次迭代中的能量至少取决于两件事:

  • 半径
  • 初始化掩码
该文件确实证实了这种关系:

由B(x,y)函数选择的球的半径是 使用局域能量时要考虑的重要参数

所提出的方法的一个局限性是它具有更大的稳定性 比基于全局区域的方法对初始化更敏感

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

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

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

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


希望我帮了忙。

没人能帮我。我和作者联系。他说可能时间步长太大了。我减少了它,但它不是改变。请包括一些代码的更多部分。很难理解这些变量的含义。兰克顿的能量公式也是凸的吗?如果没有,那么您可能也会得到一个如u所示的绘图。@roni:我更新了代码。看起来不错。实际上,lankton模型并不能保证凸与否。尝试运行我的代码请包含变量含义或至少其维度。我是说什么是phi或rad?请在代码段中初始化它们。@roni:请查看我的攻击文件中的。它有完整的代码。要让allIt看起来很好,时间太长了。你能把修改过的代码寄给我吗?谢谢你:
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