Соответствие шаблону

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


Изображение шаблона:

шаблон изображения


Изображение:

изображение


Результаты:

результаты


Код:

template= rgb2gray(imread('ele7.png'));
image = rgb2gray(imread('floorplan.jpg'));
%imshowpair(image,template,'montage')

c = normxcorr2(template,image);% perform cross-correlation
figure, surf(c), shading flat

[ypeak, xpeak] = find(c==max(c(:)));%peak of correlation

%Compute translation from max location in correlation matrix, =padding
yoffSet = ypeak-size(template,1);
xoffSet = xpeak-size(template,2);

%Display matched area
figure
hAx  = axes;
imshow(image,'Parent', hAx);
imrect(hAx, [xoffSet+1, yoffSet+1, size(template,2), size(template,1)]);

person Tharini Jayasinghe    schedule 25.02.2018    source источник
comment
Шаблон вырезан из изображения плана этажа или вы создали его отдельно? Если второе, точно ли размер соответствует размеру лифта, который вы ищете? Шаблон должен точно соответствовать изображению, иначе перекрестная корреляция не сработает.   -  person Cris Luengo    schedule 26.02.2018


Ответы (1)


Чтобы проверить, все ли идет гладко, вы должны построить корреляцию:

figure, surf(c)

Как упоминал @cris-luengo, легко ошибиться с размерами изображения и так далее. Однако я видел, что вы следовали инструкциям на https://es.mathworks.com/help/images/ref/normxcorr2.html . Так как оба изображения, уже черно-белые изображения (или двухцветные изображения), normxcorr2 хорошо работает с изображениями rgb (с текстурами и объектами и т. д.). Таким образом, я думаю, что это неправильный подход к использованию normxcorr2.

Подход, который я бы рассмотрел, - это поиск ветвей. Используя справку Matlab и bwmorph:

BW = imread('circles.png');
imshow(BW);
BW1 = bwmorph(BW,'skel',Inf);

Сначала вы скелетируете изображение, затем можете использовать любую из функций, отображаемых в справке bwmorph (https://es.mathworks.com/help/images/ref/bwmorph.html). В этом случае я бы искал точки ветвления, то есть перекрестные ссылки. Это так же просто, как:

BW2 = bwmorph(BW1,'branchpoints');
branchPointsPixels = find(BW2 == 1);

Индексы пикселей точек ветвления будут там, где он находит X. Однако это может быть любой повернутый X (или +, ...). Таким образом, вы найдете больше очков, которые вы хотите, вам нужно будет отфильтровать очки, чтобы получить то, что вы хотите.

person Pablo Vicente Munuera    schedule 26.02.2018