Обнаружение линий на зашумленном изображении (и отсутствие обнаружения, когда их нет)

Я безуспешно пытался извлечь темную линию из очень шумных изображений. Несколько советов?

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

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

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

Мои текущие шаги для первого примера:

1) Clahe: с clip_limit = 10 и grid_size = (8,8)

2) Box Filter: размер = (5,5)

3) Перевернутое изображение: 255 - изображение

4) Порог: при инвертированном_изображении ‹ 64

ОБНОВИТЬ

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

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

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

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


person Rômulo Cerqueira    schedule 29.03.2017    source источник
comment
Предоставьте больше информации о вашем подходе. Что сработало, а что нет.   -  person m3h0w    schedule 29.03.2017
comment
Конечно, @ m3h0w. Мои текущие шаги: 1) Clahe: с clip_limit = 10 и grid_size = (8,8) 2) Коробчатый фильтр: размер = (5,5) 3) Перевернутое изображение 4) Порог: когда перевернутое_изображение ‹ 64   -  person Rômulo Cerqueira    schedule 29.03.2017
comment
Я хотел бы использовать RANSAC для обнаружения темной линии, но перед этим шагом мне нужно очистить изображение.   -  person Rômulo Cerqueira    schedule 29.03.2017
comment
Вы должны обновить вопрос и желательно предоставить несколько изображений результатов.   -  person m3h0w    schedule 29.03.2017
comment
Я улучшил вопрос.   -  person Rômulo Cerqueira    schedule 29.03.2017
comment
@ m3h0w, здесь есть комментарии?   -  person Rômulo Cerqueira    schedule 30.03.2017
comment
Что ж, у меня есть некоторые идеи, но нет времени их реализовывать. Конец марта у меня очень занят. Прежде всего, я думаю, что у вас нет контроля над обработкой, которую вы пытаетесь использовать. Вам нужно больше экспериментировать со значениями (я рекомендую трекбары и их динамическое изменение, чтобы действительно увидеть, что происходит). Обработка делает линию менее заметной, что нехорошо. Я бы подумал о том, чтобы найти край внизу, повторяя каждые 0,5 см и вычисляя сумму пикселей в каждом направлении (каждые 5 градусов или около того) на инв. изображения. Самая большая сумма должна быть линией.   -  person m3h0w    schedule 30.03.2017
comment
@ m3h0w, я следовал вашим рекомендациям и улучшил этапы предварительной обработки (см. в теме).   -  person Rômulo Cerqueira    schedule 31.03.2017


Ответы (1)


Несмотря на то, что изображения зашумлены, вы ищете только прямые линии к северу от изображения. Так почему бы не использовать какой-нибудь согласованный фильтр с морфологическими операциями?

РЕДАКТИРОВАТЬ: я изменил его.

1) Используйте медианный фильтр по осям x и y и нормализуйте изображения. 2) Согласованный фильтр со всеми возможными ориентациями строк.

% im=imread('JwXON.png');
% im=imread('Fiy72.png');
% im=imread('Ya9AN.png');
im=imread('OcgaIt8.png');

imOrig=im;

matchesx = fl(im, 1);
matchesy = fl(im, 0);

matches = matchesx + matchesy;

[x, y] = find(matches);

figure(1);
imagesc(imOrig), axis image
hold on, plot(y, x, 'r.', 'MarkerSize',5)
colormap gray


%----------

function matches = fl(im, direc)

if size(im,3)~=1
    im = double(rgb2gray(im));
else
    im=double(im);
end
[n, m] = size(im);

mask = bwmorph(imfill(im>0,'holes'),'thin',10);
indNaN=find(im==0); im=255-im; im(indNaN)=0;

N = n - numel(find(im(:,ceil(m/2))==0));
N = ceil(N*0.8); % possible line length

% Normalize the image with median filter
if direc
    background= medfilt2(im,[1,30],'symmetric');
    thetas = 31:149;
else
    background= medfilt2(im,[30,1],'symmetric');
    thetas = [1:30 150:179];
end

normIm = im - background;
normIm(normIm<0)=0;

% initialize matched filter result
matches=im*0;

% search for different angles of lines
for theta=thetas
    normIm2 = imclose(normIm>0,strel('line',5,theta));
    normIm3 = imopen(normIm2>0,strel('line',N,theta));
    matches = matches + normIm3;
end

% eliminate false alarms
matches = imclose(matches,strel('disk',2));
matches = matches>3 & mask;
matches = bwareaopen(matches,100);

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

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

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

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

person Ozcan    schedule 31.03.2017
comment
Привет @Ozcan, это хорошее решение. Спасибо за ваш ответ, но если линия перпендикулярна просмотрщику изображений, как мы можем ее обнаружить? Использование медианного фильтра по оси Y? - person Rômulo Cerqueira; 03.04.2017
comment
Да, вам придется использовать медианный фильтр по оси Y. Но также необходимо изменить тета-значения в цикле for. Если вы предоставите образец изображения, я могу организовать код. - person Ozcan; 03.04.2017
comment
@ RômuloCerqueira, я изменил свой ответ. Однако помните, что это всего лишь идея, которая может не сработать при некоторых условиях. - person Ozcan; 03.04.2017
comment
Спасибо, @Ozcan. Ваши идеи действительно полезны. - person Rômulo Cerqueira; 03.04.2017
comment
Привет, есть ли лучший способ найти линию и избежать ложных тревог? - person Rômulo Cerqueira; 10.04.2017