opencv - FFTW fftwf_plan_r2r_2d() with FFTW_REDFT01 equivalent -
i trying port code uses fftw use kissfft.
code uses fftwf_plan_r2r_2d() fftw_redft01.
what equivalent call in kissfft?
if call (with fftw_redft01) equivalent dct, use direct dct transform instead, e.g. such opencv cv::dct?
there input data modification i'd need do, reflections , symmetrizations?
answering own question...
of these two references, ended not using dft @ all, using opencv's cv::dct() , cv::idct() instead.
to answer question, fftwf_plan_r2r_2d(...,fftw_redft10, fftw_redft10,...) can replaced opencv code additional scaling:
cv::dct(img, resfft); // fwd dct. matlab's dct2() resfft *= (4 * sqrt(float(img.rows/2)) * sqrt(float(img.cols/2))); resfft.row(0) *= sqrt(2.f); resfft.col(0) *= sqrt(2.f); the inverse fftw_redft01 can done so:
// first re-scale data idct(): resfft /= (4 * sqrt(float(img.rows/2)) * sqrt(float(img.cols/2))); resfft.row(0) /= sqrt(2.f); resfft.col(0) /= sqrt(2.f); cv::idct(resfft, outimg); // return input // however, transforms computed fftw unnormalized, corresponding, // computing transform followed inverse yields original array scaled n, n logical dft size. // logical dft size: logical n=2*n each axis, th implicit symmetrization // of image: reflect right , reflect both halves down. int logicalsizen = (2*img.rows) * (2*img.cols); outimg *= logicalsizen; // scale fftw result more helpful links here , here.
note opencv supports images number of rows , columns.
Comments
Post a Comment