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 Frequenzbereich

 

Pheeenix
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2010, 14:59     Titel: Faltung im Frequenzbereich
  Antworten mit Zitat      
Hallo,

ich versuche gerade eine Faltung eines Bildes im Frequenzraum durchzuführen komme aber nicht weiter. Vielleicht könnt ihr mir weiterhelfen.

Ich habe ein nxm Bild welches ich "unscharf" machen möchte. Dazu will ich einen 5x5 Filter verwenden. Nun geht das ganze im Ortsbereich relativ leicht.

Code:

Pic = double(imread('Mypic.bmp', 'bmp'));  

PSF = [ 1.0/256.0  4.0/256.0  6.0/256.0  4.0/256.0 1.0/256.0;
        4.0/256.0 16.0/256.0 24.0/256.0 16.0/256.0 4.0/256.0;
        6.0/256.0 24.0/256.0 36.0/256.0 24.0/256.0 6.0/256.0;
        4.0/256.0 16.0/256.0 24.0/256.0 16.0/256.0 4.0/256.0;
        1.0/256.0  4.0/256.0  6.0/256.0  4.0/256.0 1.0/256.0 ];

%pic ist mein mxn bild und PSF ist meine 5x5 Matrix (normiert)
blurredpic = conv2(Pic,PSF, 'same')

image(blurredpic)
 


So hier kommt das gewünschte Ergebnis raus. Da ich das ganze später auch in C++ testen will und ich weiters testen will ob mir eine Berechnung im Frequenzbereich einen Zeitvorteil verschafft wollte ich nun das ganze im Frequenzbereich testen. Hier kommt aber nicht das gewünschte Ergebnis!?!?

Eine Faltung im Zeitbereich ist ja eine Multiplikation im Frequenzbereich, also wollte ich einfach die PSF und das Bild transformieren, Multiplizieren, rück transformieren und fertig. Nun stimmt leider mein Ergebnis nicht Sad

Code:

Pic = double(imread('mypic.bmp', 'bmp'));
PSF = [ 1.0/256.0  4.0/256.0  6.0/256.0  4.0/256.0 1.0/256.0;
        4.0/256.0 16.0/256.0 24.0/256.0 16.0/256.0 4.0/256.0;
        6.0/256.0 24.0/256.0 36.0/256.0 24.0/256.0 6.0/256.0;
        4.0/256.0 16.0/256.0 24.0/256.0 16.0/256.0 4.0/256.0;
        1.0/256.0  4.0/256.0  6.0/256.0  4.0/256.0 1.0/256.0 ];

%test---Faltung im Frequenzraum
G = fft2(Pic);
H = fft2(PSF);


fftpic = zeros(386,559); % Speicher reservieren
a=1;
j=1;

kernelz = 1;
kernelsp = 1;
for i = 1:386    %zeilenlänge 386, spaltenlänge 559
   
    if(kernelz == 6)
        kernelz = 1;
    end
   
    for j = 1:559   %laufe erste zeile durch, mult mit    erster zeile des
                    %kernels, beim nächsten eintritt mit der zweiten,...
        if(kernelsp == 6)
            kernelsp = 1;
        end
        fftpic(i,j) = G(i,j)* H(kernelz,kernelsp);
        kernelsp = kernelsp +1;  %nächste spalte
    end
    kernelz = kernelz+1; %nächste zeile des kernels nehmen
    kernelsp = 1;
end

deconvpic = ifft2(fftpic);
image(deconvpic)
%imshow((deconvpic))

 


was da jetzt raus kommt ist einfach ein weißes Bild!? Kann das daher kommen das die werte nach dem Rücktransformieren noch immer in real und Imaginärteil aufgeteilt sind? wenn ja wie kann ich Rück-transformieren sodass ich wiederum nur reelle werte habe!?

Vielen Dank für euer Hilfe


Edit by Martin: Bitte keine Doppelpostings oder sogar Dreifach-Postings. Danke!
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: 01.07.2010, 16:24     Titel:
  Antworten mit Zitat      
Hallo erstmal,

mit dem Befehl:
Code:
X=log(abs(deconvpic));

solltest Du wieder normale Werte erhalten.

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Pheeenix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2010, 16:40     Titel:
  Antworten mit Zitat      
Danke für den Hinweis!

Ich hab zwar jetzt wieder "normale" Werte allerdings stimmt das Bild ganz und gar nicht.....aus einen Schwarz weiß Bild wurde jetzt ein blaues Bild Sad und kein verschwommenes, wie es im Zeitbereich erzeugt wird?

Irgendwelche Ideen, Tipps, Hinweise?
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: 01.07.2010, 16:47     Titel:
  Antworten mit Zitat      
Hänge an Dein image-Befehl: colormap gray oder gehe über imshow.
Das verschwommene Bild müßte mit Deinem Kernel zusammenhängen.

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2010, 09:51     Titel:
  Antworten mit Zitat      
Hallo,

wenn Du im Frequenzbereich filtern willst, musst Du sowohl Dein Bild mit dem Befehl fft in den Frequenzbereich bringe, als auch Deine Filtermaske. Dabei muss die erzeugte Filtermaske genauso groß sein wie das Bild im Frequenzbereich.
Wenn Du die Image Processing Toolbox hast, kannst Du zum Konvertieren Deiner Filtermaske den Befehl
Code:

verwenden.

Wenn nicht kannst Du mit fft arbeiten, musst aber die entsprechende Länge mit angeben:
Code:

[m,n] = size(G);
H = fft2(PSF,m,n)
 


Die Filterung wird dann durch elementweises multiplizieren durchgeführt:
Code:

fftpic = G .* H;
 


Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
Pheeenix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2010, 12:43     Titel:
  Antworten mit Zitat      
Danke, das hat super funktioniert! Ich bekomme das gewünschte Ergebnis.


Nun hätte ich gern das ganze invers gefaltet. Ich hab mir dabei gedacht, ich lese einfach das vorher gefaltete Bild ein, und führe statt einer Punktweisen Multiplikation eine punktweise Division mit meiner Faltungsfunktion durch.
Wenn ich das mache dann wird mir als Ausgabenbild aber immer nur schwarzes Bild angezeigt, egal ob ich den abs() oder log(abs()) Befehl verwende.
Ich bin leider schon etwas am verzweifeln Sad
Hat hier irgendjemand eine Idee was ich bei der Darstellung falsch mache?

Code:


G  = fft2(gefaltetesBild);      %bringe Bild in f-Bereich
[a,s] = size(G2);
H2  = fft2(PSF,a,s);             %bringe Faltungsfunktion in f-Bereich  
         
fftpicn = G2 ./ H2;              %mult für faltung, div für inverse Faltung

InvFilt =ifft2(fftpicn);          %bringe das ganze in den Zeitbereich

figure; imshow(InvFilt);
image(InvFilt);
 



Schon mal vielen Dank im Voraus!
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: 13.07.2010, 13:27     Titel:
  Antworten mit Zitat      
Moin,

versuche mal folgende Zeile im Tausch:

Code:
H2=fft2(PSF,size(G,1),size(G,2));


Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Pheeenix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2010, 13:38     Titel:
  Antworten mit Zitat      
Ich denke ich habe das Problem gefunden, suche aber noch nach einer Lösung.

Nach der fft2 Operation sind die beiden Werte des Bildes sowie des Faltungskernes complex. Bei der punktweisen Division enstehen so Werte die in Matlab als -Inf angezeigt werden. Bei der ifft2 Operation werden dann alle Elemente als NAN angezeigt.

Wie kann das passieren? Die reellen Werte sind alle Positiv - wie kommt man dann auf - Inf Werte und wie kann man das vermeiden um bei der Rücktransformation "normale" Werte zu haben die auch als Bild ausgegeben werden können?

@Hubertus:
deine Codezeile brachte leider auch keine Lösung.
Private Nachricht senden Benutzer-Profile anzeigen
 
Pheeenix
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 01.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2010, 06:41     Titel:
  Antworten mit Zitat      
Hab mein Problem gelöst.
Ich setzte alle durch die Transformation entstandenen Nullen auf einen Wert nahe null, oder verwende nach der Rücktransformation den floor und ceil befehl um alle +- Inf Werte zu ändern, dann kann Matlab auch diese Bilder Anzeigen.
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 - 2025 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.