2012-04-11 10 views
0

Ich habe eine 256x256 Projektionsmatrix. Jede Reihe ist eine Projektion mit gleichen Winkeln. Ich muss das ursprüngliche Bild mit Rückprojektion mit Matlab generieren und ich bin nicht wirklich vertraut mit Matlab. Können Sie mir Codebeispiele oder Algorithms vorschlagen? Ich habe einige ähnliche Codes gefunden, mit denen ich das Originalbild nicht erzeugen konnte.Rückprojektion von Projektionsmatrix mit MATLAB

Antwort

1

Dies sollte mit dem Befehl iradon relativ einfach sein, wenn Sie die Image Processing Toolbox haben. Wenn Sie dies nicht tun, wird es etwas schwieriger, weil Sie Ihre eigene Version davon rollen müssen. Anscheinend kann man nicht diese, sondern für das, was es wert ist, bekomme ich ein Bild, wenn ich benutze:

I = iradon(Pteta',linspace(0,179,size(Pteta,1)); 

Also, wie können Sie tun, um sich das? Ich werde versuchen, dir auf dem Weg zu helfen, ohne dir die Antwort zu geben - das sind doch Hausaufgaben!

Denken Sie zuerst an Ihre 0-Grad-Projektion. Stellen Sie sich vor, die Achse, auf der Sie projizieren, hat die Einheiten 1,256. Nun stell dir vor Rückprojektion dieser Koordinaten über Ihr Bild, würde es in etwa so aussehen: backprojected coordinates of a 0-degree projection

Ebenso denkt, eine 90-Grad-Projektion würde wie folgt aussehen: backprojected coordinates of a 0-degree projection

Cool, wir bekommen können diese Matrizen mit [X, Y] = meshgrid(1:256);, aber was ist mit außeraxialen Projektionen? Man denke nur an der Strecke entlang einiger abgewinkelte Linie, wie die Umwandlung polar/kartesisch:

theta = 45 % projection angle in degrees 
t = X*cosd(theta) + Y*sind(theta); 

Und es funktioniert!

backprojected coordinates of a 45-degree projection

Es ist ein Problem, aber! Beachten Sie, dass die Werte jetzt über 350 steigen? Es ist auch irgendwie dezentral. Die Koordinaten überschreiten jetzt die Länge unserer Projektionen, weil die Diagonale eines Quadrats länger ist als die Seite. Ich überlasse es Ihnen, herauszufinden, wie Sie das beheben können, aber das endgültige Bild wird kleiner sein als die ursprünglichen Projektionen, und Sie müssen möglicherweise andere Einheiten verwenden (-127 bis 128 statt 1 bis 256).

Jetzt können Sie einfach Ihre Projektionen für diese Winkel indexieren, um die tatsächlichen Werte über das Bild zurück zu projizieren. Hier haben wir ein zweites Problem, weil die Werte keine ganzen Zahlen sind! Wir könnten sie einfach umrunden, das nennt man Nearest-Neighbor-Interpolation, aber es liefert nicht die besten Ergebnisse.

proj = Pteta(angle,:); 
% add projection filtering here 
t = X*cosd(theta) + Y*sind(theta); 
% do some rounding/interpolating to make t all integers 
imagesc(proj(t)); 

Für unsere Off-Center-Version gibt, dass uns dieses Bild, oder etwas ähnliches: 45-degree backprojection

Jetzt müssen Sie nur diese jedem Winkel für tun, und fügen Sie sie alle.

+0

obwohl ich nicht iradon Befehl verwenden darf, versuchte ich es gab mir einige zufällige Bild. Ich brauche ein Bild von einem echten Ding wie einem Auto oder einem Baum. und Winkel span [0, pi] hier ist die Matrix, wenn das hilft: http://www.mediafire.com/?rn6j2h7rbkje3oe – dum

+0

Es klingt wie dies ist Hausaufgaben für Sie, also habe ich dieses Tag hinzugefügt. Verstehst du, wie Rückprojektion im Allgemeinen (d. H. Auf Papier) funktioniert? – aganders3

+0

OK, ich habe gerade Ihre Projektionsmatrix geöffnet - sind das Fächerstrahldaten? – aganders3