how to find the start and end points of overlapping intervals in one array

5 views (last 30 days)
after extracting the connected components from an image and find the start and end points of each connected components that are in order I want to merge these connected components if they are overlapped so I need to find the start and end points
for examples a is the extreme points of each connected components
a = [ 1.5000 95.5000; 82.5000 150.5000; 141.5000 197.5000; 191.5000 357.5000; 400.5000 438.5000; 415.5000 481.5000; 519.5000 667.5000];
and I need the result to be
1.5000 357.5000 400.5000 481.5000 519.5000 667.5000
b=arrayfun(@(x) a(x,1):a(x,2),1:size(a,1),'un',0); k=1; while k<numel(b) c=b(k+1:end); idx=cellfun(@(x) any(ismember(x,b{k})),c); if any(idx) b(logical([ zeros(1,numel(b)-numel(idx)-1) 1 idx]))=[]; else b(logical([ zeros(1,numel(b)-numel(idx)) idx]))=[]; end k=k+1; end out=cell2mat(cellfun(@(x) [x(1) x(end)],b','un',0))
but I got this overlapped points
141.5000 197.5000
191.5000 357.5000
519.5000 667.5000
how can I fix it ?
thanks

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 27 Oct 2014
Edited: Andrei Bobrov on 30 Oct 2014
a = [ 1.5000 95.5000; 82.5000 150.5000; 141.5000 197.5000; 191.5000 357.5000; 400.5000 438.5000; 415.5000 481.5000; 519.5000 667.5000];
b = reshape(a',1,[]);
ii = strfind(sign(diff(b)),[-1 1]);
out = b;
out([ii,ii+1]) = [];
add
b = reshape(a',1,[]);
x = all(tril(bsxfun(@lt,b(:),b(:)'))==0,2);
i0 = strfind(x(:)',[1 0]);
x(i0) = false;
out = b(x);
add2
a = [ 4.5000 58.5000
4.5000 58.5000
65.5000 118.5000
65.5000 118.5000
140.5000 277.5000
140.5000 277.5000
206.5000 223.5000
206.5000 223.5000
284.5000 295.5000
284.5000 295.5000
360.5000 422.5000
360.5000 422.5000
449.5000 454.5000
449.5000 454.5000
449.5000 532.5000
449.5000 532.5000
532.5000 574.5000
532.5000 574.5000]
a1 = unique(a,'rows');
out = a1(1,:);
for jj = 2:size(a1,1)
if out(end,2) > a1(jj,1) && a1(jj,2) > out(end,2)
out(end,:) = [out(end,1) a1(jj,2)];
elseif out(end,2) <= a1(jj,1)
out(end + 1,:) = a1(jj,:);
end
end
or
a1 = unique(a,'rows');
for jj = 2:size(a1,1)
if a1(jj-1,2) > a1(jj,1) && a1(jj,2) > a1(jj-1,2)
a1(jj,1) = 0 ;
a1(jj-1,2) = 0;
elseif a1(jj-1,2) >= a1(jj,2)
a1(jj,:) = 0;
end
end
out = a1';
out = reshape(out(out>0),2,[])';
  7 Comments

Sign in to comment.

More Answers (0)

Categories

Find more on Introduction to Installation and Licensing in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!