Поскольку вы первоначально разместили этот как вопрос '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)