Lineare Faltung zweier Bilder in Matlab mit fft2
Ich würde gerne zwei Bilder und convolve Sie zusammen in Matlab mit Hilfe der 2D-FFT-ohne Rückgriff auf die conv2
Funktion. Aber ich bin unsicher hinsichtlich, wie die Matrizen müssen gut gepolstert und bereit für die Faltung.
Die mathematische operation ist die folgende:
EINE * B = C
In der obigen, * ist der faltungs-operator (Link zu Wikipedia).
Dem folgenden Matlab-Programm zeigt den Unterschied zwischen der Polsterung und keine Füllung den Matrizen. Ich vermute, dass nicht Polsterung die Matrizen Ergebnisse in einem circular convolution aber ich möchte führen Sie eine lineare Faltung ohne aliasing.
Wenn ich pad die beiden Matrizen, so wie ich abschneiden, die Ausgabe der Faltung, so dass C ist die gleiche Größe wie Eine und 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')
Hier ist die Ausgabe des Programms:
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ohne Polsterung das Ergebnis entspricht circular convolution wie Sie. Für linear convolution, in convolving 2 Bilder (2D-Signale) A*B die vollständige Ausgabe wird von der Größe
Ma+Mb-1 x Na+Nb-1
, woMa x Na, Mb x Nb
die Größen der Bilder A und B resp.Nach Polsterung der erwarteten Größe, die Multiplikation und die Umwandlung zurück, über
ifft2
können Sie den zentralen Teil des resultierenden Bildes (in der Regel entsprechend der größte A und B).Nun, vergleichen Sie die oben mit zu tun, Geo-domain-Faltung, mit
conv2D
Ergebnisse sind optisch gleich und die Summe der Fehler zwischen den beiden (wegen Rundung) auf die Reihenfolge der
e-10.
ifft2(fft2(M1,mm,nn).*fft2(fliplr(flipud(M2))),mm,nn)
werden, die Matlab-code für die Korrelation, und dann würde ich halten Sie den zentralen Teil des Bildes in der gleichen Weise, wie gezeigt, in deiner Antwort oben?A + Aj
, d.h. Sie haben eine Summe von Faltungen zwischen Kombinationen von real-und Imaginärteil der Bilder an der ursprünglichen Größe. Sie können überprüfen, durch ersetzen von A und B mit komplexen Matrizen vor. Wenn beide Komplex sind, visualisieren dieabs()
von der Ausgabe oder vergleichen Sie den Unterschied zwischen denreal()
undimag()
Teile von F und D.A + Aj
.xcorr2
Funktion als viel-langsamer-test, es scheint, dass die 2D-Korrelation der Ein und B - Matrizen können berechnet werden, indemifft2(fft2(A,mm,nn).*fft2(fliplr(flipud(B)),mm,nn));
oder gleichwertigifft2(fft2(A,mm,nn).*fft2(rot90(B,2),mm,nn))
. Eine Referenz dafür ist der DSP-Buch von Steven Smith: dspguide.com/ch24/6.htm.