I essayé de mettre en oeuvre le filtrage de l'image dans le spectre basé sur this OpenCV example de la documentation et copiées par commodité ici:convolution à base de DFT OpenCV est décalée
void convolveDFT(InputArray A, InputArray B, OutputArray C)
{
C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type());
Size dftSize;
// calculate the size of DFT transform
dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);
dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);
// allocate temporary buffers and initialize them with 0's
Mat tempA(dftSize, A.type(), Scalar::all(0));
Mat tempB(dftSize, B.type(), Scalar::all(0));
// copy A and B to the top-left corners of tempA and tempB, respectively
Mat roiA(tempA, Rect(0,0,A.cols,A.rows));
A.copyTo(roiA);
Mat roiB(tempB, Rect(0,0,B.cols,B.rows));
B.copyTo(roiB);
// now transform the padded A & B in-place;
// use "nonzeroRows" hint for faster processing
dft(tempA, tempA, 0, A.rows);
dft(tempB, tempB, 0, B.rows);
// multiply the spectrums;
// the function handles packed spectrum representations well
mulSpectrums(tempA, tempB, tempA);
// transform the product back from the frequency domain.
// Even though all the result rows will be non-zero,
// you need only the first C.rows of them, and thus you
// pass nonzeroRows == C.rows
dft(tempA, tempA, DFT_INVERSE + DFT_SCALE, C.rows);
// now copy the result back to C.
tempA(Rect(0, 0, C.cols, C.rows)).copyTo(C);
}
je l'image Lena comme A (512x512) et un filtre d'identité (toutes les entrées mises à 0 sauf la centrale) comme B (41x41).
Il semble que le fond et la partie droite de l'image a été recadrée. De plus, bien qu'il ne soit pas visible ici en raison du formatage SO, l'image filtrée est plus petite que l'original (à cause de la première ligne de la fonction).
Comment puis-je modifier le code afin qu'il filtre l'image comme la fonction filter2D le ferait? Alors que dans ce cas le résultat serait l'image originale.