如何在Matlab中删除对象的内部边缘?

时间:2019-01-09 01:39:13

标签: matlab image-processing

假设我有一个对象数组objects,每个对象包含vertices

例如,假设我有2个objects,每个包含4个vertices,我绘制了顶点并使用Matlab中的线连接它们:

size_vertices=size(vertices);

for o=1:length(objects)
    for v=1:size_vertices(1)-1
        plot([vertices(o, v,1) vertices(o, v+1,1)], [vertices(o,v,2) vertices(o,v+1,2)], '-k' )
    end
end

所以说vertices(1,:,:)=[1 5; 1 1; 5 1; 4 6]

vertices(2,:,:)=[5 10; 3 8; 1 5; 4 6]

现在,假设我有任意数量的对象(例如,在下图中从1-6开始的顺序),并且每个对象可以包含任意数量的顶点(不仅仅是上面示例中的4个顶点) 。 (椭圆不是边缘的一部分,它们只是指示顶点在哪里)

是否可以使用Matlab去除内部边缘?

1 个答案:

答案 0 :(得分:1)

正如Cris在评论中所注意到的,我们需要计算每个边缘的外观,并只绘制出现一次的轮廓。函数tabulate使我们能够实现:

% Test Data
clc; clear;
vertices{1}=[1 5; 1 1; 5 1; 4 6];
vertices{2}=[5 10; 3 8; 1 5; 4 6];

% To ensure every objects are closed
for ii=1:length(vertices)
  vertices{ii}=[vertices{ii}; vertices{ii}(1,:)];  
end

% Save Egdes
edges{1}=num2str([0 0 0 0]);
for o=1:length(vertices)
    for v=1:size(vertices{o},1)-1
        tmp1=[vertices{o}(v,1) vertices{o}(v+1,1)];
        tmp2=[vertices{o}(v,2) vertices{o}(v+1,2)];
        if tmp1(1) == tmp1(2)
            tmp2=sort(tmp2);
        end
        [~,indi]=sort(tmp1);
        edges{end+1}=num2str([tmp1(indi) tmp2(indi)]);
    end
end

% Calcualte the number of appearence of each edges
sta=tabulate(edges);
figure(1); hold on
for ii=2:size(sta,1)
  if sta{ii,2} > 1
      continue
  end
  tmp=str2num(sta{ii,1});
  plot(tmp(1:2),tmp(3:4), '-k' )
end
axis([0 6 0 11])

请注意,我将vertices更改为CellArray,因为有一个三角形,不仅最终结果是四边形。