Как переписать фильтр обнаружения линий по умолчанию, чтобы он работал с объектами любой ширины в пикселях, а не с объектами шириной в один пиксель.

Я пытаюсь обнаружить горизонтальные линии, используя встроенные функции Matlab. Я читал, что фильтр: w = [-1 -1 -1;2 2 2;-1 -1 -1] при применении к изображению будет обнаруживать горизонтальные линии шириной в 1 пиксель. Так как его отклик будет выше в горизонтальном направлении, а в остальных случаях его отклик будет нулевым.

Моя проблема в том, что линии, которые я хочу обнаружить, имеют ширину более 1 пикселя. Например, я хочу обнаружить белые линии на этом изображении:

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

Теперь, если я применю вышеуказанный фильтр к этому изображению, используя:

lines = imfilter(img, w);
imshow(lines)

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

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

Он работал, как и ожидалось, то есть он обнаружил горизонтальные линии толщиной 1 пиксель, и я думаю, именно поэтому он обнаружил только края или границы линий. Я хочу, чтобы он обнаружил полную белую линию.

Итак, как мне это сделать? Как мне сделать линии только моей интересующей областью, а затем работать только с ними?

Я думаю, что один из способов, чтобы это сработало, заключается в том, что я каким-то образом узнаю ширину белых линий в пикселях, а затем создаю новое ядро ​​​​для работы с этими размерами, но как мне найти ширину в пикселях? как мне сделать новое ядро ​​​​для указанной ширины?

или я на совершенно неправильном пути?


person StuckInPhDNoMore    schedule 07.01.2014    source источник
comment
Я вижу, что вы не приняли мой ответ, у вас возникли проблемы? Посмотрите мое редактирование, я добавил черную рамку вокруг изображения, чтобы изолировать линии.   -  person Cape Code    schedule 08.01.2014
comment
Привет, Джигг, да, извини. Я принял ваш ответ после редактирования. Спасибо за помощь   -  person StuckInPhDNoMore    schedule 12.01.2014
comment
без проблем, рад, что помогло.   -  person Cape Code    schedule 13.01.2014


Ответы (1)


Вы можете попробовать использовать функцию bwmorph.

Пример:

skel=bwmorph(bwmorph(YourImage,'erode', 6),'skel', Inf);
imshow(skel)

Результат:

скелет из линий

Изменить Если вам нужна позиция и длина строк, вы можете использовать regionprops, например:

Framed = padarray(YourImage,[3 3],0,'both'); 

(Это добавляет черную рамку вокруг изображения, чтобы изолировать отдельные линии).

props=regionprops(Framed, 'Centroid', 'BoundingBox');
centroids={props.Centroid};
BBoxes={props.BoundingBox};

Позиции линий находятся во втором элементе каждого вектора в centroids, длину линий можно вывести из ограничивающих рамок в BBoxes.

Вы можете построить результаты следующим образом:

imshow(Framed)
hold on;
for k=1:length(centroids)
    line([1 BBoxes{k}(3)],[centroids{k}(2) centroids{k}(2)])
end
hold off;

Результат:

Линии, нарисованные поверх изображения

person Cape Code    schedule 07.01.2014