Определите кривые в бинарном изображении

У меня есть бинарное изображение, в котором я хотел бы обнаруживать кривые и выводить координатные пиксельные позиции кривых. Изображение зашумлено, и я хотел бы обнаружить две кривые, которые проходят горизонтально.

Я использую MATLAB для анализа изображений. Было бы здорово, если бы вы могли дать мне несколько советов по идентификации этих кривых.

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

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


person sundar    schedule 18.01.2016    source источник
comment
en.wikipedia.org/wiki/Edge_detection — это ваше начало.   -  person Lucas    schedule 18.01.2016
comment
@Lucas - я пытался использовать методы обнаружения краев, но они не очень хорошо работают, потому что изображение довольно шумное. Один из возможных способов — подобрать кривую, а затем извлечь из нее информацию, но я не уверен, как это сделать.   -  person sundar    schedule 18.01.2016
comment
Всем привет! Я вернул ваш вопрос в прежнее состояние. Кажется, что на первоначальный вопрос уже был дан ответ, и теперь вы задаете продолжение своей проблемы, следующий шаг. Если это так, рассмотрите возможность принятия ответа, который вам помог (см. meta.stackexchange.com/questions/5234/ ) и откройте новый вопрос с новой проблемой и сошлитесь на этот. Продолжайте программировать!   -  person Ander Biguri    schedule 19.01.2016


Ответы (2)


Используйте детектор хитрых границ. Но для того, чтобы все заработало, вам придется прочитать о параметрах которые входят в это, и "возятся" с ними. Я ожидаю, что обнаружение границ Canny будет довольно хорошо работать с этим набором данных.

edge(yourImageHere, 'canny')
person John    schedule 18.01.2016
comment
Привет, Джон. Спасибо за ваше предложение. Детектор хитрых краев работает хорошо, и теперь я отредактировал свой вопрос, чтобы объяснить всю проблему. Любые предложения для получения формы кривой? - person sundar; 19.01.2016
comment
@sundar Если этот вопрос помог вам, подумайте о том, чтобы принять его и задать другой вопрос в качестве продолжения этого! - person Ander Biguri; 19.01.2016

Если изображения остаются такими, вы, вероятно, можете сделать довольно простой способ, просто подсчитывая биты построчно (но это работает, только если они остаются горизонтальными или вертикальными). Это даст вам своего рода гистограмму вдоль координаты y, которая позволит вам усреднить вашу координату y для одной из линий.

% Read the image
img = imread('To_detect_curves.png');
% Convert it to BW
img = rgb2gray(img);
% Get the size of the image for the loops
[width,height] = size(img);
bits_per_line = zeros(height,1);
% Sum over all lines (rows)
for idx=1:height
    bits_per_line(idx) = sum(img(idx,:));
end
plot(1:height,bits_per_line)

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

Результат

Это, конечно, не поможет вам с более сложными изображениями, но для изображения, которое вы предоставили, должно подойти. Если у вас есть дополнительная информация о том, что именно вы хотите сделать, сообщите нам об этом.

person Martin    schedule 18.01.2016
comment
Привет, Мартин, твое предложение хорошо работает, если меня интересует только положение кривых. Однако, поскольку я отредактировал свой вопрос сейчас, мне нужно получить форму кривой слева и справа от вертикальных линий. - person sundar; 19.01.2016