Как найти 4 самые дальние точки этого прямоугольника

Я составил список углов, которые я получил, используя обнаружение углов Харриса.

введите здесь описание изображения

Теперь мне нужно найти 4 дополнительные точки, которые будут представлять собой углы прямоугольника.

Я знаю, что могу получить два верхних и нижних диагональных угла, используя

  max(C);
  min(C);

Где C - матрица из n строк со столбцом для x и y, например

  x y
  0 1
  2 3
  4 5
  6 6

Но как мне получить два других угла?

Я думал, что могу повернуть матрицу и снова использовать min и max, но, конечно, это просто возвращает мне огромную матрицу из n столбцов (и я хочу матрицу из 2 столбцов)

Мне кажется, что ответ очевиден, но я молчу :(


person Eric Nelson    schedule 03.04.2017    source источник
comment
Что представляют строки C? Координаты на границе? Точки в белой области? Черная зона? Использование min и max очень опасно, потому что нет гарантии, что возвращаемые значения принадлежат одному и тому же углу. Вы вводите черно-белое изображение или это C? Не могли бы вы загрузить доступные вам исходные данные (будь то черно-белое изображение или матрица ограниченного размера)?..?   -  person Dev-iL    schedule 03.04.2017
comment
Строки C - это координаты результата обнаружения угла Харриса, строки C - это координаты синих точек на изображении, которое я разместил. Так что я думаю, что на самом деле у меня нет НИ ОДНОЙ точки, если max возвращает максимальное значение из каждого столбца. :'(   -  person Eric Nelson    schedule 03.04.2017
comment
Вот ссылка на точки данных (намного больше, чем я думал) jmp.sh/v/8lAytDc00UrOa17Z6Oo6   -  person Eric Nelson    schedule 03.04.2017
comment
Попробуйте математически записать, как бы вы определили угловую координату. Например, вы могли бы обнаружить угол, который находится левее фактического нижнего левого угла, потому что вы минимизировали координату x...   -  person Wolfie    schedule 03.04.2017
comment
Я задал свой вопрос по-другому и написал здесь. cs.stackexchange.com/questions/72407/ Я собираюсь спать на этом. Надеюсь утром будет понятно :)   -  person Eric Nelson    schedule 03.04.2017


Ответы (2)


я не знаю, насколько ограничен следующий метод, но он работал для примера, похожего на ваш:

% detect possible corners
points = detectHarrisFeatures(BW);
C = points.Location;
% compute par-wise distances between all points
D = pdist2(C,C);
p = zeros(1,4);
% compute maximum distance to find first pair
[m,idx1] = max(D,[],2);
[~,idx2] = max(m);
idx1 = idx1(idx2);
p(1:2) = [idx1, idx2];
% add first pair distance to distance matrix so the next pair will be
% distant from this pair as well, and compute max distance again
D = bsxfun(@plus,D,sum(D([idx1 idx2],:),1));
[m,idx1] = max(D,[],2);
[~,idx2] = max(m);
idx1 = idx1(idx2);
p(3:4) = [idx1, idx2];
% plot
imshow(BW);
hold on;
plot(C(:,1),C(:,2),'g.');
plot(C(p,1),C(p,2),'rx','LineWidth',2);

введите здесь описание изображения

другой вариант — использовать функции FEX, такие как упрощение полигонов и Decimate Polygon и установить количество желаемых вершин равным 4.

person user2999345    schedule 03.04.2017
comment
NB: здесь используется набор инструментов Computer Vision (т. е. detectHarrisFeatures). ОП может не иметь к этому доступа. - person rayryeng; 03.04.2017
comment
истинный. это было просто для того, чтобы получить пример набора возможных точек, которые уже есть у ОП. - person user2999345; 03.04.2017
comment
Согласовано! Хотя мне все равно нравится. Я бы сам подошел к этому с Харрисом Корнерсом. - person rayryeng; 03.04.2017

Другое альтернативное решение, если вы не хотите использовать обнаружение углов:

im=zeros(100);

im(40:70,30:80)=1;
im=imrotate(im,rand*100);

[x,y]=find(im);
x=x+2*randn(size(x));
y=y+2*randn(size(y));
X=[x(:),y(:)]; 

d=ceil(pdist2(X,X)*10)/10;

[a,b]=find(d==max(d(:))); 

xm=x(a);
ym=y(a);

figure,plot(x,y,'ks')
hold on, plot(xm,ym,'ro','MarkerSize',12,'MArkerFaceColor','r')
axis image

введите здесь описание изображения

person Ozcan    schedule 03.04.2017
comment
NB: pdist2 требуется панель инструментов статистики. - person rayryeng; 04.04.2017