2017-03-31 68 views
0

我试图确定围绕在contourf情节特定的轮廓水平边框的边框:确定周围的轮廓

  1. 绘制数据的contourf情节
  2. 情节与0.075的水平轮廓在同一个情节。
  3. 提取从轮廓水平
  4. 轮廓数据计算每个轮廓数据
  5. Do循环为质心X Y的每个元素的质心,并计算到其它 质心x和y距离。合并轮廓数据的距离小于阈值5, 并将其放置在区域中。
  6. 重新绘制数据并在同一图上创建每个区域周围区域x y数据的框。

这里是生成contourf情节并尝试建立边框代码:

axes(handles.axes1); 
cla(handles.axes1); 

contourf(xC(1,:),yC(:,1),zDiff, 200,'LineColor','none'); 
colormap(handles.axes1,'jet'); 
colorbar(handles.axes1); 
axis equal 
caxis([cMin cMax]); 
hold on 


[Cm,hm] = contour(xC(1,:),yC(:,1),zDiff,[0.075 0.075],'k'); 
axis equal 


Sm = contourdata(Cm); 

hwb = waitbar(0.1, 'Processing') 

[p,q] = size(Sm); 


for i = 1:q 

    pts = centroid(Sm(1,i).xdata,Sm(1,i).ydata); 
    format long 
    centCt(i,1) = pts(1); 
    centCt(i,2) = pts(2); 
end 


[centCxs,indxs] = sort(centCt(:,1)); 
centCys = centCt(indxs,2); 


Se = Sm; 

for i = 1:q 

Se(1,i).flag = 0; 



end 


ct = 1; 

for j = 1:q 
datax = []; 
datay = []; 
ct2 = 1; 
    for i = 1:q 

     rcentd = sqrt((centCxs(i,1) - centCxs(j,1)).^2 + (centCys(i,1) - centCys(j,1)).^2); 

     if(rcentd < 5) 
      if(Se(1,i).flag == 0) 
       datax = [datax;Se(1,i).xdata]; 
       datay = [datay;Se(1,i).ydata]; 

       Se(1,i).flag = 1; 


       ct2 = ct2 + 1; 

      end 

     end 
    end 

if(ct2 > 5) 

    area(ct).xdat = datax; 
    area(ct).ydat = datay; 
    ct = ct + 1; 
end 


end 


close(hwb); 



cla(handles.axes1);  
contourf(xC(1,:),yC(:,1),zDiff, 200,'LineColor','none'); 
colormap(handles.axes1,'jet'); 
colorbar(handles.axes1); 
axis equal 
caxis([cMin cMax]); 
hold on 

hold(handles.axes1,'on'); 


for i = 1:length(area) 
    [rectx,recty] = minboundrect(area(i).xdat,area(i).ydat); 
    plot(rectx,recty,'-k'); 
end 

初始轮廓图片:

enter image description here

结果我得到:

enter image description here

所需的结果:

enter image description here

+0

试图理解你得到的结果,使用[MATLAB调试器(https://nl.mathworks.com/help/matlab/matlab_prog/debugging-process-和-features.html)可能会非常有帮助。如果你明白你为什么得到这个结果,你可能会自己解决问题。为我们提供示例图像,对我们也可能非常有帮助。 – m7913d

回答

1

您需要更改的唯一的事情就是你计算边界框的最后一部分:

for i = 1:length(area) 
    minMaxX = [min(area(i).xdat),max(area(i).xdat)]; 
    minMaxY = [min(area(i).ydat),max(area(i).ydat)]; 
    rect = [minMaxX(1),minMaxY(1),diff(minMaxX),diff(minMaxY)]; 
    plot(area(i).xdat,area(i).ydat,'.') 
    rectangle('Position',rect,'EdgeColor','k') 
end 

,如果你将运行整个修改后的脚本(需要contourdata):

[xC,yC] = meshgrid(-5:0.1:5); 
zDiff = abs(peaks(xC,yC)); 
subplot(121); 
contourf(xC(1,:),yC(:,1),zDiff, 200,'LineColor','none'); 
colormap('jet'); 
colorbar(); 
axis equal 
hold on 

[Cm,hm] = contour(xC(1,:),yC(:,1),zDiff,3 + [0 0],'k'); 
axis equal 

Sm = contourdata(Cm); 
[p,q] = size(Sm); 
for i = 1:q 
    pts = centroid(Sm(1,i).xdata,Sm(1,i).ydata); 
    format long 
    centCt(i,1) = pts(1); 
    centCt(i,2) = pts(2); 
end 
area = struct([]); 
[centCxs,indxs] = sort(centCt(:,1)); 
centCys = centCt(indxs,2); 
Se = Sm; 
for i = 1:q 
    Se(1,i).flag = 0; 
end 
ct = 1; 
for j = 1:q 
    datax = []; 
    datay = []; 
    ct2 = 1; 
    for i = 1:q 
     rcentd = sqrt((centCxs(i,1) - centCxs(j,1)).^2 + (centCys(i,1) - centCys(j,1)).^2); 
     if(rcentd < 1.5) 
      if(Se(1,i).flag == 0) 
       datax = [datax;Se(1,i).xdata]; 
       datay = [datay;Se(1,i).ydata]; 

       Se(1,i).flag = 1; 
       ct2 = ct2 + 1; 
      end 
     end 
    end 

    if(ct2 > 1) 
     area(ct).xdat = datax; 
     area(ct).ydat = datay; 
     ct = ct + 1; 
    end 
end 

% 
subplot(122); 
contourf(xC(1,:),yC(:,1),zDiff, 200,'LineColor','none'); 
colormap('jet'); 
colorbar(); 
axis equal 
hold on 

for i = 1:length(area) 
    minMaxX = [min(area(i).xdat),max(area(i).xdat)]; 
    minMaxY = [min(area(i).ydat),max(area(i).ydat)]; 
    rect = [minMaxX(1),minMaxY(1),diff(minMaxX),diff(minMaxY)]; 
    rectangle('Position',rect,'EdgeColor','k') 
end 

您将获得:

enter image description here