2

我有一个包含几个特定对象的图像。我想检测这张图片中这些物体的位置。为此,我有一些模型图像,其中包含我想要检测的对象。这些图像在我想要检测的对象实例周围被很好地裁剪。

这是一个例子:

在这张大图里,

在此处输入图像描述

我想检测此模型图像中表示的对象:

在此处输入图像描述

4

3 回答 3

38

由于您最初将此作为“gimme-da-codez”问题发布,因此完全没有努力,我不会给您代码。我将笼统地描述该方法,并在此过程中提供提示,由您决定执行此操作的确切代码。

首先,如果您有一个模板,一个更大的图像,并且您想在图像中找到该模板的实例,请始终考虑互相关。无论您是处理一维信号(在信号处理中称为匹配滤波器)还是二维图像,理论都是相同的。

  • 将图像与已知模板进行互相关会在模板完全匹配的情况下为您提供峰值。查找函数normxcorr2并理解文档中的示例。
  • 找到峰值后,您必须考虑与原始图像中实际位置的偏移。N偏移与点信号与点信号互相关M导致N + M -1点输出的事实有关。一旦您阅读了互相关,就应该清楚这一点,但是您还应该查看我上面提到的文档中的示例以获得一个想法。

一旦你做了这两个,那么剩下的就是微不足道的,只需要对你的结果进行修饰。这是我在检测到上述对象后的结果。

在此处输入图像描述

这里有一些代码提示可以帮助您前进。在我有的地方填写其余部分...

%#read & convert the image
imgCol  = imread('http://i.stack.imgur.com/tbnV9.jpg');
imgGray = rgb2gray(img);
obj     = rgb2gray(imread('http://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)
于 2011-12-21T18:07:14.983 回答
9

这是问题结束时我即将发布的答案。我想这与尤达的答案相似。

您可以尝试使用标准化互相关:

im=rgb2gray(imread('di-5Y01.jpg'));
imObj=rgb2gray(imread('di-FNMJ.jpg'));
score = normxcorr2(imObj,im);
imagesc(score)

结果是:(如您所见,最白的点对应于您的对象的位置。)

在此处输入图像描述

于 2011-12-21T19:49:23.987 回答
4

Mathworks 有一个经典的图像配准演示,使用与@yoda 的答案相同的技术:

使用归一化互相关配准图像

于 2011-12-21T18:50:59.677 回答