目录
模板匹配
模板匹配实战
模板匹配
让我们继续探索使用过滤器作为模板的想法,我们想在二维空间中找到什么。
模板是你给我的东西,你说我想让你找到类似这样的东西,我们要通过过滤来做。
我想这是Christian Grumman的一个很好的例子。
这里有一个非常简单的例子。如图:
左边是一个场景,右边是这个模板。
这就是我们想要找到的想法。
你看这里,你说,哦,我看到它在哪里了,它在,它在,它在这里。
我们想要的是系统吐出这样的东西。啊哈,这是我的绿色小盒子。
我们能做的是我们可以通过归一化相关来做。
如果我使用这个带掩码的内核模板并与左边的图像进行归一化相关,我得到的是一个像这样的映射或相关图像:
你会注意到:黑色比上黑色,白色比上白色,你可以把它看成是正的和负的,这里有一些亮度,这里有一些亮度。
但我真正的亮点就在这里,因为那是模板落在正确的地方。
这就是使用相关性进行检测的方法。
因为我们现在考虑的过滤器与其说是做平均或模糊化,还不如说是我们正在寻找的模板。
模板匹配实战
我敢打赌你一定很想自己做这件事。
这是我要你定义的函数,find_template_2D。
>> pkg load image;
>>
>> function [yIndex xIndex] = find_templete_2D(template, img)
>> % TODO:
>> endfunction
以一个模板和一个图像作为输入,并返回在图像中找到模板的x和y坐标。
>> tablet = imread('tablet.png');
>> imshow(tablet);
我用图像来验证一下。我将从这个平板上剪下一个字形,作为我们的模板。
>> glyph = tablet(75:165, 150:185);
>> imshow(glyph);
记住,您希望找到模板左上角在图像中的位置。
还要注意返回坐标y x的顺序。
我们一起来做一下这个有趣的技术:
和之前一样,我们使用归一化互相关。
由于图像是一个二维矩阵,我们需要在寻找最大值时要仔细。
简单地写max (c)就可以计算列上的最大值。用单个冒号索引c可以使其变平。因此,max (c冒号)将计算图像宽最大值。
我们使用一个稍微不同的技巧来找到这个最大值发生的位置。
find函数直接返回行和列,即所需位置的y和x坐标。
记住,这些是相关系数矩阵的原始指数。
我们需要通过沿着适当的维度减去模板的大小并加上一个来计算偏移量。
>> pkg load image;
>>
>> function [yIndex xIndex] = find_templete_2D(template, img)
>> c = normxcorr2(template, img);
[yRaw xRaw] = find(c == max(c(:)));
yIndex = yRaw - size(template, 1) + 1;
xIndex = xRaw - size(template, 2) + 1;
>> endfunction
>>
>> tablet = imread('tablet.png');
>> imshow(tablet);
>> glyph = tablet(75:165, 150:185);
>> imshow(glyph);
>>
>> [y x] = find_Template_2D(glyph, tablet);
>> disp([y x]);
运行代码,看看y和x的值。
75 150。
那不是我们裁剪象形文字的地方吗?
实际上,这些是左上角的坐标。
我们可以做一些额外的绘图使结果更直观。
在这里,我们首先显示原始图像,然后我们在它上面绘制一个红色加号,在那里找到了模板。
>> pkg load image;
>>
>> function [yIndex xIndex] = find_templete_2D(template, img)
>> c = normxcorr2(template, img);
[yRaw xRaw] = find(c == max(c(:)));
yIndex = yRaw - size(template, 1) + 1;
xIndex = xRaw - size(template, 2) + 1;
>> endfunction
>>
>> tablet = imread('tablet.png');
>> imshow(tablet);
>> glyph = tablet(75:165, 150:185);
>> %imshow(glyph);
>>
>> [y x] = find_Template_2D(glyph, tablet);
>> disp([y x]);
>>
>> colormap('gray'), imagesc(tablet);
>> hold on;
>> plot(x, y, 'r+', 'markersize', 16);
>> hold off;
由于这不是一个完全交互式的环境,我们的绘图能力有限。
在MATLAB或Octave的本地安装中,您可以使用更多的方法,比如在找到模板的地方绘制一个矩形。
——学会编写自己的代码,才能练出真功夫。