Фазовая корреляция для сопоставления с шаблоном

Я пытаюсь реализовать сопоставление шаблонов с использованием фазовой корреляции. Я уже сделал это в пространственной области. Вы можете увидеть здесь

Мой шаблон изображения imagePart и изображение, на котором я нахожу это imageBig,

Сейчас я пытаюсь использовать DFT для увеличения скорости. Я следую за этими шагами как предложено Крисом Луэнго

  1. Дополните шаблон (плавающее изображение) размером другого изображения.
    (с нулями).
  2. Вычислить БПФ обоих.

  3. Переверните знак мнимой составляющей одного из результатов (комплексное сопряжение).

  4. Умножьте два.

  5. Вычислить IFFT результата.

  6. Найти местоположение пикселя с наибольшим значением.

Мой код:

int r_big,c_big,r_part,c_part;
Mat imagePart_pad,imageBig_padded, imagePart_padded, mul_output;
int m,n;
Mat complexI_big, complexI_part;
void corr_frq()
{

r_big=imageBig.rows;
c_big= imageBig.cols;

r_part=imagePart.rows;
c_part=imagePart.cols;

//Pad template to match size of big image.
copyMakeBorder(imagePart,imagePart_pad,0,(r_big-r_part),0,(c_big-c_part),BORDER_CONSTANT,Scalar(0));

m = getOptimalDFTSize( imageBig.rows );
n = getOptimalDFTSize( imageBig.cols );

copyMakeBorder(imageBig, imageBig_padded, 0, m - imageBig.rows, 0, n - imageBig.cols, BORDER_CONSTANT, Scalar::all(0));
copyMakeBorder(imagePart_pad, imagePart_padded, 0, m - imageBig.rows, 0, n - imageBig.cols, BORDER_CONSTANT, Scalar::all(0));

Mat planes[] = {Mat_<float>(imageBig_padded), Mat::zeros(imageBig_padded.size(), CV_32F)};
Mat planes2[] = {Mat_<float>(imagePart_padded), Mat::zeros(imagePart_padded.size(), CV_32F)};merge(planes, 2, complexI_big);
merge(planes2, 2, complexI_part);dft(complexI_big,complexI_big);
dft(complexI_part,complexI_part);

mulSpectrums(complexI_big, complexI_part, mul_output, 0, true );cv::Mat inverseTransform;
cv::dft(mul_output, inverseTransform, cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);
normalize(inverseTransform, inverseTransform, 0, 1, CV_MINMAX);
imshow("Reconstructed", inverseTransform);
waitKey(0);

imshow("image part pad",imagePart_pad);

// waitKey(0);

}

После выполнения вышеуказанной операции я получаю это выход

Разве это не должно давать максимальный выход в месте изображения, где imagePart (галочка есть). Я делаю что-то неправильно?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …