WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Faltung im Ortsraum ist Multiplikation im Frequenzraum?

 

-horn-
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 14.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.06.2011, 22:43     Titel: Faltung im Ortsraum ist Multiplikation im Frequenzraum?
  Antworten mit Zitat      
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?

Wäre super, Andreas!
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 28.06.2011, 23:28     Titel:
  Antworten mit Zitat      
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)';
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.06.2011, 06:43     Titel:
  Antworten mit Zitat      
Moin, und als Ergänzung:

http://besessener.com/software/matlab/konvolution.html

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
-horn-
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 14.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2011, 14:06     Titel:
  Antworten mit Zitat      
moien,

schonmal DANKE für die antworten Smile.

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.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.07.2011, 14:21     Titel:
  Antworten mit Zitat      
Das Auffüllen machst du vor der Transformation. Du kannst das auch ganz einfach die FFT() Funktion machen lassen, in dem du die Größe so vorgibst.

Code:

[m,n] = size(Bild) % Größe der Bildmatrix
H_bino = fft2(bino,m,n)
 


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

Code:

% Faltungssatz:
outlength = length(sig1)+length(sig2)-1;
% nächste Zweierpotenz für FFT
fftsize = 2^nextpow2(outlength);


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.

 [sx, sy]=size(Boot);
 Pf = myFilter(myBin(25),sx,sy);
 Pf2 = real(ifft2(fft2(Boot) .* Pf));
 subplot(2,2,2); imshow(Pf2); title('25x25 Binomialfilter');

 subplot(2,2,3); imshow(myDiff(Boot,C25)); title('Differenz Filter von Faltung');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
-horn-
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 14.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2011, 20:23     Titel:
  Antworten mit Zitat      
DSP hat Folgendes geschrieben:
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.

 [sx, sy]=size(Boot);
 Pf = myFilter(myBin(25),sx,sy);
 Pf2 = real(ifft2(fft2(Boot) .* Pf));
 subplot(2,2,2); imshow(Pf2); title('25x25 Binomialfilter');

 subplot(2,2,3); imshow(myDiff(Boot,C25)); title('Differenz Filter von Faltung');
 


moien DSP,

danke für's antworten! Smile.

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
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 05.07.2011, 20:33     Titel:
  Antworten mit Zitat      
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 Wink

Code:
Pf2 = real(ifft2(fft2(Boot) .* Pf));


Sonst würde hier nicht fft2(Boot) stehen. Also muss die Größe der Bildmatrix nicht geändert werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
-horn-
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 14.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.07.2011, 21:56     Titel:
  Antworten mit Zitat      
moien,

so sieht mein gewurstel nun aus Smile. gerne reaktionen dazu

Code:
%% DBV - Uebung 6%%
%% -horn %%
%% LRT7 / MatrNr.:XXX %%
%% XXX %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all;
close all;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% U6: Teilaufgabe 1%%
%%%%%%%%%%%%%%%%%%%%%%%

%Bild einladen
imgpath = '';
img = 'moon.tif';

I = im2double(imread(strcat(imgpath,img)));
% Einladen des Originalbildes

imshow(I);
title('1. Original Mond')
figure;



% 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);

imshow(Y);
title('2. fft des Mondbildes (Y)')
figure;

% 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

imshow(I_freq);
title('4. I freq')
figure;


%% Faltung im Ortsraum
iterator_bino1 = size(bino,1);
iterator_bino2 = size(bino,2);
iterator1 = size(Y,1);
iterator2 = size(Y,2);

% 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

imshow(I_orts);
title('5. I orts')


% 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)



       
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.