2015-11-29 15 views
5

Hier einige Code, den ich schrieb das Größenspektrum eines Bild anzuzeigen:Warum erhalte ich ein leeres Bild als Ausgabe?

orig_imdata = imread('Original_Image.png'); 
spec_orig = fft2(double(orig_imdata)); 
spec_orig2 = abs(spec_orig); 
spec_img = fftshift(spec_orig2); 
imshow(spec_img); 

Als ich die Verwendung von abs Kommentar und fftshift nur das Bild, bekomme ich ein Bild, wenn auch mit der Phase und der Größe. Wenn ich die Funktion abs direkt nach der Verwendung von fftshift anwende, erhalte ich ein leeres Ergebnis von imshow. Ich brauche ein Bild von der Größe der Spektralanalyse meines Bildes.

Weiß jemand, was hier falsch läuft?

Antwort

7

Das Bild ist nicht "leer". imshow ist so entworfen, dass alle double Präzisionswerte, die kleiner als 0 sind, als schwarz angezeigt werden und alle Werte größer als 1 werden weiß angezeigt. Wenn Sie die Größenkomponenten des Bildes berechnen, werden double Präzisionsbilder in Ihrem Code erstellt.

Daher vermute ich sehr, dass, weil die meisten Ihrer Komponenten (wenn nicht alle) größer als 1 sind, dies Ihnen eine Visualisierung eines völlig weißen und daher "leeren" Bildes gibt. Jetzt haben wir das Problem gefunden, aber du bist not out of the woods yet. Einfaches Skalieren der Komponenten, so dass sie in den Bereich von [0,1] passen, wird ebenfalls nicht helfen. Wenn Sie das tun, wird die DC-Komponente des Magnitude-Spektrums wahrscheinlich so groß sein, dass es den Rest der Magnitude-Komponenten in Ihrem Bild überwältigt. Daher sehen Sie nur einen weißen Punkt in der Mitte und der Rest des Bildes ist schwarz.

Eine übliche Praxis ist es, einen log Betrieb zum Größenspektrum für die Anzeige anzuwenden, wird die Wert Neuskalierung, so dass sie im Bereich von [0,1] passen:

%// Your code 
orig_imdata = imread('Original_Image.png'); 
spec_orig = fft2(double(orig_imdata)); 
spec_orig2 = abs(spec_orig); 
spec_img = fftshift(spec_orig2); 

%// New code 
spec_img_log = log(1 + spec_img); 
imshow(spec_img_log,[]); 

Im log Betrieb wird der große Dynamikbereich Die Werte werden vor allem dann, wenn die Werte größer werden, auf einen kleineren Bereich komprimiert, sodass eine Skalierung auf [0,1] dieses komprimierten Bereichs zu besseren visuellen Ergebnissen führt.

Der Grund, warum Sie 1 zu jeder Komponente hinzufügen, dann nehmen Sie die log ist die log(0) Operation zu vermeiden. Wenn eine Größenkomponente Null ist, wird log(1) ausgewertet, was zu 0 wird. Sobald Sie dies tun, können Sie imshow(...,[]) verwenden, um die Anzeige so zu skalieren, dass die Komponente mit der kleinsten Größe auf 0 geht, während die Komponente mit der größten Größe auf 1 der Protokoll Spektrum. Beachten Sie, dass ich nicht das ursprüngliche Spektrum ändern konnte, damit Sie Ihre Verarbeitung darauf tun können. Außerdem wird die Neuskalierung, die von imshow durchgeführt wird, vollständig innerhalb des Aufrufs durchgeführt. Es skaliert die Daten sowieso nicht - es tut dies nur für die Anzeige und das ist es.


Geben Sie das ein und sehen, wie es geht.

+0

gut funktioniert die Lösung, und sobald ich durch, was ich tun muss, komme ich zurück und lese sorgfältig durch, warum das funktioniert. Unglaublich gut detaillierte Antwort! Kudos! –

+0

@SharanDuggirala Ich habe weitere Bearbeitungen hinzugefügt, seit du akzeptierst:) ... vor allem, wie diese Skalierung funktioniert. Bitte. Viel Glück! BTW, werfen Sie einen Blick auf den Absatz speziell nach dem Code. Es sagt dir, warum es funktioniert. – rayryeng

+0

Ich nehme an, ich werde später weitere Fragen zu dieser Antwort klären können? Nochmals vielen Dank für diese Antwort! –