33 #include "Core/include/private/DImage.hxx"
60 template <
class T1,
class T2>
63 ASSERT_SAME_SIZE(&imIn1, &imIn2);
67 size_t nccols = ncols;
70 imOut.setSize(ncols, nrows);
72 size_t pixNbr = ncols * nrows;
75 double * src1_real = fftw_alloc_real(pixNbr);
76 fftw_complex *src1_compl = fftw_alloc_complex(nccols * nrows);
77 double * src2_real = fftw_alloc_real(pixNbr);
78 fftw_complex *src2_compl = fftw_alloc_complex(nccols * nrows);
80 double * res_real = fftw_alloc_real(pixNbr);
81 fftw_complex *res_compl = fftw_alloc_complex(nccols * nrows);
85 T2 *out_data = imOut.getPixels();
88 for (
size_t i = 0; i < pixNbr; i++) {
89 src1_real[i] = (double) src1_data[i];
90 src2_real[i] = (double) src2_data[i];
94 fftw_plan forward1 = fftw_plan_dft_r2c_2d(nrows, ncols, src1_real,
95 src1_compl, FFTW_ESTIMATE);
96 fftw_plan forward2 = fftw_plan_dft_r2c_2d(nrows, ncols, src2_real,
97 src2_compl, FFTW_ESTIMATE);
98 fftw_plan backward = fftw_plan_dft_c2r_2d(nrows, ncols, res_compl, res_real,
99 FFTW_BACKWARD | FFTW_ESTIMATE);
102 fftw_execute(forward1);
103 fftw_execute(forward2);
106 for (
size_t i = 0; i < pixNbr; i++) {
107 res_compl[i][0] = (src1_compl[i][0] * src2_compl[i][0] +
108 src1_compl[i][1] * src2_compl[i][1]);
109 res_compl[i][1] = (src1_compl[i][1] * src2_compl[i][0] -
110 src1_compl[i][0] * src2_compl[i][1]);
114 res_compl[i][0] /= norm;
115 res_compl[i][1] /= norm;
119 fftw_execute(backward);
124 for (
size_t i = 0; i < pixNbr; i++) {
130 fftw_destroy_plan(forward1);
131 fftw_destroy_plan(forward2);
132 fftw_destroy_plan(backward);
133 fftw_free(src1_real);
134 fftw_free(src1_compl);
135 fftw_free(src2_real);
136 fftw_free(src2_compl);
138 fftw_free(res_compl);
size_t getWidth() const
Get image width.
Definition: DBaseImage.h:80
size_t getHeight() const
Get image height.
Definition: DBaseImage.h:85
lineType getPixels() const
Get the pixels as a 1D array.
Definition: DImage.hpp:105
RES_T correlation(Image< T1 > &imIn1, Image< T1 > &imIn2, Image< T2 > &imOut)
2D image (normalized) cross correlation using FFT.
Definition: DFFT.hpp:61
RES_T sqrt(const Image< T1 > &imIn, Image< T2 > &imOut)
sqrt() - square root of an image
Definition: DImageArith.hpp:926
RES_T pow(const Image< T1 > &imIn, Image< T2 > &imOut, double exponent=2)
pow() - power of an image
Definition: DImageArith.hpp:905
Definition: DTypes.hpp:88