2014-12-16 3 views
2

Я хочу найти определенный объект в изображении с помощью Matlab.Найти объект на основе формы

Этот объект всегда имеет точно такую ​​же форму, только цвет отличается:

Object I want to locate within an image

Я попытался с алгоритмами обнаружения объекта на основе точечных, но эти алгоритмы не работает, так как не хватает функции внутри этого изображения объекта.

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

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

Image to locate the spiral in

+0

Изменяется ли масштаб объекта, или он гарантированно будет таким же? – rayryeng

+0

@rayryeng масштаб объекта может измениться – Kaj

+0

Что относительно ориентации? Будет ли это иначе? Например, вы увидите, что этот объект повернут, скажем, под углом 45 градусов? – rayryeng

ответ

1

Попробуйте Phase Correlation изображения с шаблоном. Ниже приведен алгоритм:

  1. Преобразовать как шаблон и изображение в серую шкалу
  2. вычислит 2DFT шаблона после удаления среднего значения и дополнение нулей его размера изображений
  3. вычислят 2DFT из изображение после удаления среднего
  4. умножает 2DFT изображения с конъюгатом 2DFT шаблона
  5. Разделить из величин 2DFT как изображений и шаблона (оставляя позади фазы)
  6. Возьмите Inverse 2DFT и найти пики в вещественной части

код ниже реализует алгоритм:

%% Load video frames and template 
imageFile = 'image.png'; 
templateFile = 'template.png'; 
imageColor = imread(imageFile); 
image = im2double(rgb2gray(imageColor)); 
template = im2double(rgb2gray(imread(templateFile))); 

[hI, wI] = size(image); 
[hT, wT] = size(template); 

%% Perform frequency domain correlation 
templateDFT = fft2((template - mean2(template))/std2(template), hI, wI); 
templateDFTMag = abs(templateDFT); 

templateFilter = conj(templateDFT) ./ templateDFTMag; 

imageDFT = fft2((image - mean2(image))/std2(image)); 
imageDFTMag = abs(imageDFT); 
corrDFT = imageDFT .* templateFilter ./ imageDFTMag; 
corr = real(ifft2(corrDFT)); 

%% Detect peak and plot 
[maxCorr, maxIdx] = max(corr(:)); 
[maxRow, maxCol] = ind2sub([hI wI], maxIdx); 

figure; imshow(imageColor); hold on; 
rectangle('Position', [maxCol-wT/2, maxRow-hT/2, wT, hT], 'EdgeColor', 'y'); 

Ниже то, что я получаю:

enter image description here

Предостережения:

  • Эта схема не очень надежна для крупномасштабного изменения или вращения. Тем не менее, мелкие изменения будут допускаться.
Смежные вопросы