# Remove centroid locations of objects that are too close

조회 수: 4 (최근 30일)
Jason . 2022년 8월 8일
댓글: Jason . 2022년 8월 9일
Hi, I have a list of centroid locations of spots in an image (xf, yf). The spots are randomly distributed. I want to remove the centroid locations that are too close to each other, or say within a distance of d. I've got to the following but not sure what to do next. Also is there a better way to do this ratrher than use loops?
%using a loop
M=[];
for j=1:length(xf)
for i=1:length(xf)
dx=xf(j)-xf(i);
dy=yf(j)-yf(i);
dr=sqrt(power(dx,2)+power(dy,2));
M(j,1)=xf(j);
M(j,2)=yf(j);
M(j,3)=xf(i);
M(j,4)=yf(i);
M(j,5)=dr;
end
end
##### 댓글 수: 2표시 이전 댓글 수: 1숨기기 이전 댓글 수: 1
Image Analyst 2022년 8월 9일
To me it sounds like both are to be removed. This is easily done with pdist2.

댓글을 달려면 로그인하십시오.

### 채택된 답변

Matt J 2022년 8월 9일
편집: Matt J 님. 2022년 8월 9일
A=[xf(:) yf(:)];
D=pdist2(A,A);
D(D==0)=inf; %retroactive EDIT
keep = all(D>d,1);
xf=xf(keep);
yf=yf(keep);
##### 댓글 수: 7표시 이전 댓글 수: 6숨기기 이전 댓글 수: 6
Jason 2022년 8월 9일
Just to add, when I had over 400 objects, akthough i do other operations, using the for loop took 110s.using the pdist2 approach took just under 2s. Remarkable!

댓글을 달려면 로그인하십시오.

### 추가 답변 (1개)

yanqi liu 2022년 8월 9일
yes，sir，may be use pdist2， such as
xf = rand(1, 10);
yf = rand(1, 10);
%using a loop
M=[];
for j=1:length(xf)
for i=1:length(xf)
dx=xf(j)-xf(i);
dy=yf(j)-yf(i);
dr=sqrt(power(dx,2)+power(dy,2));
M(end+1,1)=xf(j);
M(end,2)=yf(j);
M(end,3)=xf(i);
M(end,4)=yf(i);
M(end,5)=dr;
end
end
% second method
A=[xf(:) yf(:)];
B=pdist2(A,A);
C=B';
C=C(:);
isequal(M(:,end),C)
ans = logical
1

댓글을 달려면 로그인하십시오.

### 카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

R2022a

### Community Treasure Hunt

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

Start Hunting!