Как я могу обнаружить экземпляр объекта на изображении? - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть изображение, содержащее несколько конкретных объектов.Я хотел бы определить положение этих объектов на этом изображении.Для этого у меня есть несколько модельных изображений, содержащих объекты, которые я хотел бы обнаружить.Эти изображения хорошо обрезаны вокруг экземпляра объекта, который я хочу обнаружить.

Вот пример:

На этом большом изображении

enter image description here

Я хотел бы обнаружить объект, представленный на этой модели изображения:

enter image description here

Ответы [ 3 ]

38 голосов
/ 21 декабря 2011

Поскольку вы первоначально разместили этот как вопрос 'gimme-da-codez', не прикладывая никаких усилий, я не собираюсь дать вам код. Я опишу подход в общих чертах, с подсказками по пути, и вы должны выяснить точный код, чтобы сделать это.

Во-первых, если у вас есть шаблон, увеличенное изображение и вы хотите найти экземпляры этого шаблона на изображении, всегда думает о взаимной корреляции . Теория одна и та же, обрабатываете ли вы одномерные сигналы (называемые согласованным фильтром при обработке сигналов) или двумерные изображения.

  • Кросс-корреляция изображения с известным шаблоном дает вам пик, где шаблон точно совпадает. Найдите функцию 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)
9 голосов
/ 21 декабря 2011

Вот ответ, который я собирался опубликовать, когда вопрос был закрыт. Я думаю, это похоже на ответ Йоды.

Вы можете попробовать использовать нормализованную кросс-корреляцию:

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

Результат: (Как видите, самая белая точка соответствует положению вашего объекта.)

enter image description here

4 голосов
/ 21 декабря 2011

Mathworks имеет классическую демонстрацию регистрации изображений, используя ту же технику, что и в ответе @ yoda:

Регистрация изображения с использованием нормализованной взаимной корреляции

...