2013-09-23 3 views
0

У меня есть изображение черного фона с изогнутой формой, состоящей из белых точек, точек. Форма представляет собой замкнутую нерегулярную кривую. У меня есть координаты этих белых точек. Я искал способ «соединить» эти точки, чтобы закрыть эту строку, чтобы сделать форму замкнутой кривой. Я не могу использовать расширение и эрозию, потому что мне нужно, чтобы существующее хранилище сохранилось.Соедините белые точки в черном изображении в matlab

Любые идеи?

Пример изображения:

+0

Приятная небольшая проблема, что вы пробовали? Кстати, ваш аргумент о расширении/эрозии не очень хороший, так как вы всегда можете сохранить исходный образ (у вас даже есть координаты!) –

+0

Как насчет преобразования точек в xy-координаты, нахождения матрицы расстояния (например, с pdist) и а затем подключить каждую точку к двум ближайшим соседям? – Dan

+0

Мне нужны только эти координаты, а не расширенные, которые я получу. Я пробовал «полифит», «подгонку», и теперь я пытаюсь сделать с lsqlin, который я видел, когда кто-то пытался, но я не получаю результаты, которые мне нужны. – prairiewolf

ответ

1

Это будет работать, если вы получите строку, столбец координат в упорядоченном списке:

1) Используйте roipoly, чтобы сделать маску. От roipoly help:
BW = roipoly(I, c, r) возвращает ROI, заданный полигоном, описываемый векторами c и r, которые определяют индексы столбца и строки каждой вершины соответственно. c и r должны быть одного размера.

2) Используйте edge на маске BW. Это даст вам логическую карту с линиями, соединяющими указанные точки.

В качестве альтернативы) Используйте impoly для создания экземпляра imroi, который является объектом и имеет множество методов (функций), которые могут быть использованы на нем. Это более сложный подход, который приведет к тому же, но вы можете быть заинтересованы в нем, потому что он опрятен.

Оба подхода зависят от того, что вы имеете точки в упорядоченном списке.

+0

У меня есть координаты этих точек в матрице для предполагаемого 256 x 216 изображений. Попробуем это позже. Большое спасибо! – prairiewolf

+0

Работает ярко. Спасибо, Фридрих! – prairiewolf

2

Если точки уже находятся в порядке, это очень легко с комплексными числами:

Определить данные примера (квадрат):

x = [1 2 2 1]; 
y = [1 1 2 2]; 

Повтор первой (для создания цикла), обрабатывать как сложные, и график:

plot(complex([x x(1)],[y y(1)])) 

В примере это дает следующий рисунок.

enter image description here

Если точки не в порядке, они могут быть заказаны с чем-то похожее на это, на основе @ идеи Дэна минимизации расстояния:

z = complex(x,y); 
dist = tril(bsxfun(@(z1,z2) abs(z1-z2), z, z.')); % each pair only once ("tril") 
dist(dist==0) = inf; % mark self-distances and repeated pairs as infinities 
[~, ind] = min(dist); 

Для каждой точки ind дает индекс ближайшей точки среди индексов с большим индексом. С этой информацией вы должны иметь возможность заказывать очки. Однако это непростая задача. Я не уверен, что минимизация расстояния всегда даст предпочтительную форму (хотя это будет в вашем примере).

Смежные вопросы