我有一张包含几个特定对象的图像。我想检测这些物体在该图像中的位置。为此,我有一些模型图像,其中包含我想要检测的对象。这些图像在我想要检测的对象实例周围得到了很好的裁剪。
这是一个例子:
在这张大图里,
我想检测此模型图像中表示的对象:
自从你最初发布这个 https://stackoverflow.com/revisions/8591515/1作为一个“gimme-da-codez”问题,完全没有表现出任何努力,我not会给你代码。我将概括性地描述该方法,并附带提示,您需要找出执行此操作的确切代码。
首先,如果您有一个模板,一个较大的图像,并且您想在图像中查找该模板的实例,总是想到互相关 http://en.wikipedia.org/wiki/Cross-correlation。无论您是处理 1D 信号(在信号处理中称为匹配滤波器)还是 2D 图像,理论都是相同的。
- 将图像与已知模板进行交叉关联可以在模板完全匹配的地方获得峰值。查找函数normxcorr2 http://www.mathworks.com/help/toolbox/images/ref/normxcorr2.html并理解文档中的示例。
- 找到峰值后,您必须考虑与原始图像中实际位置的偏移。该偏移与以下事实有关:互相关
N
点信号与M
点信号导致N + M -1
点输出。一旦您阅读了互相关性,这一点就应该很清楚了,但是您还应该查看我上面提到的文档中的示例以获得一个想法。
一旦你完成了这两件事,那么剩下的事情就变得微不足道了,只需要对你的结果进行修饰即可。这是我检测上述对象后的结果。
这里有一些代码提示可以帮助您继续。剩下的就在我有的地方填写...
%#read & convert the image
imgCol = imread('https://i.stack.imgur.com/tbnV9.jpg');
imgGray = rgb2gray(img);
obj = rgb2gray(imread('https://i.stack.imgur.com/GkYii.jpg'));
%# cross-correlate and find the offset
corr = normxcorr2(...);
[~,indx] = max(abs(corr(:))); %# Modify for multiple instances (generalize)
[yPeak, xPeak] = ind2sub(...);
corrOffset = [yPeak - ..., xPeak - ...];
%# create a mask
mask = zeros(size(...));
mask(...) = 1;
mask = imdilate(mask,ones(size(...)));
%# plot the above result
h1 = imshow(imgGray);
set(h1,'AlphaData',0.4)
hold on
h2 = imshow(imgCol);
set(h2,'AlphaData',mask)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)