Verfasst am: 28.06.2011, 22:43
Titel: Faltung im Ortsraum ist Multiplikation im Frequenzraum?
Moien,
ich sitze gerade an http://www.ifp.uni-stuttgart.de/leh.....Orts-und-Frequenzraum.pdf und komme da nicht weiter.
Ich weiss, dass ich das Mondbild per fft2 transformieren soll, dann die Operation durchführen soll, und danach per ifft2 zurücktransformieren kann.
Allerdings verstehe ich nicht, was ich bei der Multiplikation genau zu machen habe.
Es wird gesagt, dass im Ortstaum die Faltung mit dem Faltungskern als Additition ja im Freqeunzraum die Multiplikation sein soll, aber wie das genau geht, verstehe ich nicht.
Ich brauche ja in diesem Fall den 5x5 Binomialfilter, muss ich den auch erst noch per FFT2 transformieren und was mache ich dann damit?
Ich stehe gerade sehr auf dem Schlauch und Google hilft mir heute irgendwie nicht weiter.
Kann mir jemand mal einen Tipp geben oder vielleicht sogar sagen, was gemeint ist?
Die Grundmethode ist dir also schon mal bekannt. Eine Faltung zweier Signale im Zeitbereich wird zur Multiplikation im Frequenzbereich. Diesen Vorteil nutzt man im Bereich Filterung aus, da ab einer gewissen Anzahl von Messwerten die Filterung im Frequenzbereich schneller durchgeführt werden kann. Du transformierst sowohl das Zeitsignal (Bild Matrix) als auch die Impulsantwort des Filter in den Frequenzbereich. Ist das Filter ein FIR, reicht es wenn du die Koeffizienten des Filters transformierst. Im Freq.bereich werden dann beide Spektren durch Multiplikation gefaltet und anschließend wieder zurücktransformiert.
Diese Funktion faltet eindimensionale Vektoren...du musst es dann halt für fft2 umbauen
Code:
function output = inv_Faltung(sig1, sig2) % kopieren der Eingangsvektoren
sig1 = double(sig1(:));
sig2 = double(sig2(:));
% Faltungssatz:
outlength = length(sig1)+length(sig2)-1;
% nächste Zweierpotenz für FFT
fftsize = 2^nextpow2(outlength);
% mit Nullen auf fftsize auffüllen
sig1 = [sig1; zeros(fftsize-length(sig1),1)];
sig2 = [sig2; zeros(fftsize-length(sig2),1)];
% Berechnung des Frequenzspektrums
sig1 = fft(sig1,fftsize); sig2 = fft(sig2,fftsize);
% Faltung und Rücktransformation
conv_raw = ifft(sig1.*sig2;);
output = conv_raw(1:outlength)';
auch wenn ich immer ein wenig länger brauche, aber ich arbeite dran!
ich bin noch nicht ganz fertig, denn das ergebnisbild sieht nicht richtig aus.
bevor ich den code poste wollte ich wieder eine veständnisfrage stellen.
also ich habe eine matrix für das bild, die jage ich durch fft2 und bekomme eine gleichgrosse matrix, nur mit den werten des bildes im frequenzraum.
danach muss ich ja das selbe spiel für die maske machen. da aber die 5x5 maske deutlich kleiner als die matrix des bildes ist, muss ich ja drum herum mit "nullen" auffüllen, damit ich den (tiefpass)filter daraus erzeugen kann, wo nur die frequenzen durchgelassen werden, wo ich die maske für ausgelegt habe.
jetzt frage ich mich, ob ich die 5x5 maske erst mit fft2 überführen muss und dann die auffüllung durchführen muss oder erst auffüllen und dann überführen.
ich habe zur zeit
H_bino = fft2(bino,size(Y,1),size(Y,2));
drin, aber bin mir nicht sicher, ob das richtig ist, wenn ich das auffüllen damit mache. das ergebnisbild des matlab mondes sieht auf jedenfall nachher nicht richtig aus,
wenn ich die bildmatrix punktweise mit der maske (beide in fft2) multipliziere und dann das ergebnis zurück tranformiere in den ortsraum.
vielleicht könnt ihr mir da wieder einen tipp geben.
Allerdings bin ich mir nicht sicher, ob du nicht den Faltungssatz verletzt. Ich kenne die Faltung nur für 1d Vektoren und weiß nicht, ob das auch bei Matrizen gilt
Du siehst hier, dass man die Eingangsvektoren schon in der Länge von Signal + Filter - 1 für die Faltung haben muss....durch entsprechendes Auffüllen mit Nullen.
Edit: In dem Link steht es doch...man muss nicht erweitern
Code:
% Berechnen Sie nun mit Hilfe Ihrer Funktion die Frequenzraumrepräsentation % eines 25x25 Binomialfilters. Filtern Sie mit dem berechneten Filter das % Bild boot.bmp im Frequenzraum und transformieren Sie das Ergebnis in den % Ortsraum zurück.
Edit: In dem Link steht es doch...man muss nicht erweitern
Code:
% Berechnen Sie nun mit Hilfe Ihrer Funktion die Frequenzraumrepräsentation % eines 25x25 Binomialfilters. Filtern Sie mit dem berechneten Filter das % Bild boot.bmp im Frequenzraum und transformieren Sie das Ergebnis in den % Ortsraum zurück.
allerdings erweitert der doch, er hat sich dazu sogar eine eigen function geschrieben "myFilter", wo er sich ein f = zeros(sx, sy); in größe des bildes erzeugt, dann dort die maske einträgt und dann sofort danach die transfo durchführt. zumindest verstehe ich das so, oder?
EDIT:
ich hab das script mal versucht laufen zu lassen, lox und rux gibt es nicht, da bricht bei mir das skript ab.
Andreas
Zuletzt bearbeitet von -horn- am 05.07.2011, 20:49, insgesamt einmal bearbeitet
Die Impulsantwort des Filters muss natürlich die Größe des Bildes haben, sonst wäre die elementweise Multiplikation ja gar nicht möglich. Aber es wird nicht wie bei 1d Vektoren auf die Länge Signal+Filter-1 vor der FFT erweitert
% 5x5 binomialfilter
%http://217.92.194.243/pdf/6V_Uebersicht_BV3_07.pdf
bino = [1,4,6,4,1;4,16,24,16,4;6,24,36,24,6;4,16,24,16,4;1,4,6,4,1];
bino_fac = 1.0/256.0;
bino = bino*bino_fac;
display(bino);
% aufblasen des Binomialfilters auf groesse des Ursprungsbildes
bino_big = zeros(size(I));
a = int16(size(bino_big,1)/2);
b = int16(size(bino_big,2)/2);
% einsetzen der 5x5 Binomialmatrix in die genaue Mitte der aufgeblasenen % Binomialmatrix. for i=1:size(bino,1) for j=1:size(bino,2)
bino_big(a+i-(size(bino,1)-1)/2,b+j-(size(bino,2)-1)/2) = bino(i,j);
end end
%Fouriertransofmration des Bildes, danach Shiften
%Y = fftshift(fft2(I));
Y = fft2(I);
% auffuellen der Maske mit "Nullen" wurde bereits vorgenommen nun % Fouriertransformation
H_bino = fft2(fftshift((bino_big)));
% Ohne fftshift wird sonst das endgueltige mondbild geviertelt und an den % diagonalen Ecken angezeigt. imshow(H_bino);
title('3. fft des Binomialfilters') figure;
% Zuruecktransformation in den Ortsraum
I_freq = ifft2(Y.*H_bino); %Interne Operation als punktweise Multiplikation
% Pixelweise Faltung als Addition mit erhoehtem Rechenaufwand und damit % Rechenzeit. % Wegen des schwarzen Weltraumes, der sich am Rand befindet wurde der % "Trauerrand" beibehalten, da er nicht auffaelt.
I_orts = zeros(size(Y));
for c=3:iterator1-2 for r=3:iterator2-2 for i=1:iterator_bino1
for j=1:iterator_bino2
I_orts(c,r) = I_orts(c,r) + I(c-3+i,r-3+j)*bino(i,j);
end end end end
% Vergleich zusaetzlich zum Auge mit Summe aller Pixelabweichungen der % Ergebnisbilder
dif = 0;
for l=1:iterator1
for m=1:iterator2
dif = dif + abs(I_orts(l,m)-I_freq(l,m));
end end
dif = dif /(iterator1*iterator2);
%Je kleiner dif, desto weniger Abweichung.
display('Pixeldifferenz aus ortsoperierten und frequenzoperierten Bild') display(dif);
%% Fazit: % Das ueber den Frequenzraum prozessierte Bild I_freq sieht per % Augenpruefung identisch zum im Ortsraum gefalletet Bild I_orts aus. % Dieses wird auch per Pixeldifferenzcheck bestaetigt, da dieser Wert sehr % klein ausfaellt dif=3.4935e-004. % Beide Wege sind durchfuehrbar, allerdings bietet der Weg ueber den % Frequenzraum Geschwindigkeitsvorteile. (Skript Folie 17)
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.