模板匹配

时间:2018-02-25 21:22:41

标签: matlab template-matching cross-correlation

我正试图在MATLAB中检测楼层平面图上的电梯。我现在的代码不是检测电梯,而是指向图像的边缘。我期待在平面图上检测所有电梯。电梯由内部为x的正方形或矩形表示,类似于模板图像。我附上了模板,图片和结果截图。

模板图片:

template image

图片:

image

结果:

results

代码

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)]);

1 个答案:

答案 0 :(得分:0)

要检查一切是否顺利进行,您应绘制相关性:

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(或+,...)。所以你会找到你想要的更多积分,你需要过滤积分才能得到你想要的东西。