如何检测图像中对象的实例?

时间:2011-12-21 14:36:28

标签: matlab image-processing computer-vision matlab-cvst

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

以下是一个例子:

在这张大图中,

enter image description here

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

enter image description here

3 个答案:

答案 0 :(得分:38)

由于你originally posted this作为'gimme-da-codez'问题,完全没有努力,我会给你代码。我将用一般的术语描述这种方法,并提供一些提示,并由你来确定准确的代码。

首先,如果你有一个模板,一个更大的图像,并且你想在图像中找到该模板的实例,总是会想到cross-correlation 。无论您是处理1D信号(在信号处理中称为匹配滤波器)还是处理2D图像,理论都是相同的。

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

一旦你做了这两个,那么其余的都是微不足道的,只需要对你的结果进行化妆打扮。这是我在上面检测到对象后的结果。

enter image description here

这里有一些代码提示可以帮助你。在我...

的任何地方填写其余部分
%#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)

答案 1 :(得分:9)

以下是我在问题结束时即将发布的答案。我想这与yoda的答案相似。

您可以尝试使用规范化的交叉核心化:

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

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

enter image description here

答案 2 :(得分:4)

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

Registering an Image Using Normalized Cross-Correlation