De convolution linéaire de deux images sous Matlab à l'aide de fft2

Je voudrais prendre deux images et de convolution ensemble dans Matlab à l'aide de la FFT 2D sans avoir recours à la conv2 fonction. Cependant, je suis incertain de la façon dont les matrices doivent être matelassés et préparé pour le produit de convolution.

L'opération mathématique est la suivante:

UN * B = C

Ci-dessus, * est le produit de convolution de l'opérateur (Lien wikipédia).

La suite de programme Matlab montre la différence entre le rembourrage et de ne pas remplir les matrices. Je les soupçonne de ne pas remplir les matrices de résultats dans une circulaire de convolution, mais je voudrais effectuer une convolution linéaire sans aliasing.

Si je ne pad les deux matrices, alors comment puis-je tronquer la sortie de la convolution de sorte que C est de la même taille que Un et B?

A = rgb2gray(im2double(imread('1.png'))); % input A
B = rgb2gray(im2double(imread('2.png'))); % kernel B

figure;
imagesc(A); colormap gray;
title ('A')

figure;
imagesc(B); colormap gray;
title ('B')

[m,n] = size(A);
mm = 2*m - 1;
nn = 2*n - 1;

C = (ifft2(fft2(A,mm,nn).* fft2(B,mm,nn)));

figure;
imagesc(C); colormap gray;
title ('C with padding')

C0 = (ifft2(fft2(A).* fft2(B)));

figure;
imagesc(C0); colormap gray;
title ('C without padding')

Ici est la sortie du programme:

De convolution linéaire de deux images sous Matlab à l'aide de fft2
De convolution linéaire de deux images sous Matlab à l'aide de fft2
De convolution linéaire de deux images sous Matlab à l'aide de fft2
De convolution linéaire de deux images sous Matlab à l'aide de fft2

OriginalL'auteur Nicholas Kinar | 2012-09-03