2016-02-14 3 views
0

Я пытаюсь выяснить алгоритм обнаружения свободной поверхности из изображения PIV (см. Прилагаемый). Основная проблема заключается в том, что в рассматриваемом потоке газовые пузырьки вводятся в жидкость, они поднимаются из-за плавучести и имеют тенденцию сидеть на поверхности. Я не хочу, чтобы они ошибочно принимались за свободную поверхность (на самом деле нужно, чтобы под ним лежал «второй» край). Я изо всех сил пытаюсь понять, как включить это в алгоритм. В идеале я хочу получить массив значений x и y, представляющих координаты свободной поверхности (например, сплошную гладкую кривую). Мой первоначальный подход состоял в том, чтобы отсканировать изображение слева направо, по одному столбцу за раз, найти ребро, перейти к следующему столбцу и т. Д. Это работает несколько нормально, но не удается, как только появятся пузыри и мой «край», разбивается на две части. Поэтому мне интересно, есть ли еще более изощренный способ обойти это.MATLAB, алгоритм обнаружения свободной поверхности в пузырьковом потоке

Если у кого-либо есть какие-либо знания в области обработки изображений/обнаружения края, любые советы будут очень признательны.

Typical PIV image

Desired outcome

+0

Можете ли вы попытаться быть немного более ясными в том, что вам нужно (например, редактировать краску того, что вы хотите получить точно)? Если я правильно понял, это не тривиальная задача. Если у вас есть много изображений, вы можете установить его как проблему сегментации и, в конечном итоге, изучить сегментирование с помощью набора данных с ручным обозначением. –

+0

@ R.Bergamote Я добавил красящее редактирование того, что мне нужно. Вы абсолютно правы, это не тривиальная задача. Как я могу настроить его как проблему сегментации? Не могли бы вы указать мне дополнительную информацию/ссылки на это? У меня много таких картин, в основном камера занимает около 12 снимков в секунду эксперимента. –

ответ

0

Я думаю, что вы можете решить эту проблему с помощью морфологических методов.

A = imread('./MATLAB/ZBhAM.jpg'); 

figure; 
subplot 131; 
imshow(A) 

subplot 132; 
B = double(A(:,:,1)); 
B = B/255; 
B = im2bw(B, 0.1); 
imshow(B); 

subplot 133; 
st = strel('diamond', 5); 
B = imerode(B, st); 
B = imdilate(B, st); 
B = imshow(B); 

Это дает следующий результат: enter image description here

Как вы можете видеть, этот подход не является совершенным в основном потому, что я выбрал случайное значение для порога в im2bw, если вы используете адаптивный порог для различных столбец ваших изображений у вас должно быть что-то лучше.

Попытайтесь работать на своем освещении в противном случае.