Попарное расстояние между всеми комбинациями координат центроидов - Matlab - PullRequest
1 голос
/ 01 июня 2019

enter image description here Сценарий ниже помечает объекты на изображении на основе их центроидов. Как я могу предварительно определить попарное расстояние между всеми комбинациями координат центроида (без наложения) и вернуть результаты в таблицу? Я думал об использовании pdist2, но я не знаю, как создать цикл for.

Спасибо.

Сценарий:

clc;
clear all;
I = imread('E:/Elli.png');
imshow(I);
BW  =imbinarize(I);
BW = imfill(BW, 'holes');
BW = bwlabel(BW); 

s = regionprops(BW,'Area', 'BoundingBox', 'Eccentricity', 'MajorAxisLength', 'MinorAxisLength', 'Orientation', 'Perimeter','Centroid');


imshow(BW)
hold on
for k = 1:numel(s)
    c = s(k).Centroid;
    text(c(1), c(2), sprintf('%d', k), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'middle');
end
hold off 

1 Ответ

3 голосов
/ 01 июня 2019

Вместо использования pdist2, который находит расстояния между точками в двух списках, используйте pdist. pdist берет все точки в одном списке и находит расстояние между каждой парой.

В вашем примере s.Centroid дает список точек через запятую, поэтому нам нужно привести его в массив точек, используя vertcat:

point_list = vertcat(s.Centroid);

Теперь мы можем передать этот список на pdist:

dist_list = pdist(point_list);

pdist возвращает список расстояний от центроида i до центроида j, такой что i < j:

{1->2}, {1->3}, {1->4}, ... {1->n}, {2->3}, {2->4}, ..., {2->n}, {3->4}, etc.

В вашем примере с 28 центроидами это даст вам 378 расстояний.

Если вы хотите, чтобы в матричной форме вместо элемента (i,j) было расстояние от центроида i до центроида j, вы можете использовать squareform:

dist_mat = squareform(dist_list);

Для 28 центроидов это даст вам полную матрицу расстояний 28x28.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...