2015-03-09 5 views
0

Скажем, у меня есть изображение, как один на один:Какой самый простой способ извлечь контур сегментированного изображения?

Original image

После некоторого быстрого бездельничал, я получил двоичный образ топора, как этот: Extracted image

Что это самый простой/самый быстрый способ получить контур этого изображения с помощью GNU/Octave?

+0

Просто идея, не совсем уверенная в том, что лучший способ. Прокрутите изображение и используйте вектор для хранения точек, которые торчат. Старт в левом верхнем углу будет началом. Пройдите через GetPixel(), идущий горизонтально. В зависимости от того, насколько вы точны, вы можете добавить верхнюю нижнюю точку, иначе следующая точка будет в правом верхнем углу топора. Вернувшись в начальную точку, у вас есть вектор всех основных точек. Редактировать: Я думаю, вы делаете что-то еще, неважно. –

+0

Ха-ха, я думаю, я пытаюсь сделать что-то еще, но спасибо за ответ! – ebernardes

ответ

2

В Octave можно использовать bwboundaries (но я буду приветствовать патчи, которые реализуют bwtraceboundaries)

octave:1> pkg load image; 
octave:2> bw = logical (imread ("http://i.stack.imgur.com/BoQPe.jpg")); 
octave:3> boundaries = bwboundaries (bw); 
octave:4> boundaries = cell2mat (boundaries); 
octave:5> imshow (bw); 
octave:6> hold on 
octave:7> plot (boundaries(:,2), boundaries(:,1), '.g'); 

Есть несколько отличия здесь от @ Benoit_11 ответ:

  1. здесь мы получаем границы для всех объектов на изображении. bwboundaries также примет координаты в качестве входного аргумента, чтобы выбрать только один объект, но я считаю, что работа должна быть выполнена путем дальнейшей обработки вашей маски (возможно, из-за артефактов jpeg)

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

  3. изображение, которое читается, похоже, имеет некоторые артефакты, я угадаю, что это из сохранения в jpeg.

2

Вы можете использовать bwtraceboundary в пакете изображений. Вот реализация Matlab, но это должно быть довольно похоже с помощью Octave:

Сначала оцените исходный пиксель, чтобы искать границу, а затем график (BW - это изображение). (Проверьте here)

dim = size(BW); 
col = round(dim(2)/2)-90; 
row = min(find(BW(:,col))); 

boundary = bwtraceboundary(BW,[row, col],'N'); 

imshow(BW) 
hold on; 
plot(boundary(:,2),boundary(:,1),'g','LineWidth',3); 

Выход:

enter image description here

+0

Спасибо за ответ! Я нашел это, но, похоже, функция bwtraceboundary еще не реализована в пакете изображений Octave. – ebernardes

+0

о, стреляй, потом извини! –

+0

@ebernardes в Octave есть http://octave.sourceforge.net/image/function/bwboundaries.html – carandraug

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