Signalverarbeitungsalgorithmen, die in kontinuierlicher Zeit / Raum / Frequenz definiert sind, werden typischerweise implementiert, indem das Signal in einem diskreten Gitter abgetastet und Integrale in Summen (und Ableitungen in Differenzen) umgewandelt werden. Raumfilter werden durch Faltung mit einem Faltungskern (dh gewichtete Summe von Nachbarn) implementiert.
Es gibt eine Fülle von Kenntnissen über das Filtern von abgetasteten Zeitdomänensignalen. Zeitbereichsfilter werden entweder als Filter mit endlicher Impulsantwort implementiert , wobei der aktuelle Ausgangsabtastwert als eine gewichtete Summe der vorherigen N Eingangsabtastwerte berechnet wird; oder Filter mit unendlicher Impulsantwort, wobei die aktuelle Ausgabe eine gewichtete Summe der vorherigen Eingaben und vorherigen Ausgaben ist . Formal werden die zeitdiskreten Filter mit der z-Transformation beschrieben , die die zeitdiskrete Analogie zur Laplace-Transformation darstellt . Das bilineare Transformation bildet eine auf die andere ( c2d
und d2c
in Matlab) ab.
Wie bewerten Sie Funktionen an beliebigen Stellen?
Wenn Sie den Wert eines Signals an einem Punkt benötigen, der nicht direkt auf Ihrem Abtastraster liegt, interpolieren Sie den Wert von nahegelegenen Punkten. Die Interpolation kann so einfach sein, wie die Auswahl der nächstgelegenen Probe, die Berechnung eines gewichteten Durchschnitts der nächstgelegenen Proben oder die Anpassung einer beliebig komplizierten Analysefunktion an die abgetasteten Daten und die Auswertung dieser Funktion an den erforderlichen Koordinaten. Das Interpolieren auf ein gleichmäßig feineres Gitter ist ein Upsampling . Wenn Ihr ursprüngliches (kontinuierliches) Signal keine Details (dh Frequenzen) enthält, die kleiner als die Hälfte des Abtastgitters sind, kann die kontinuierliche Funktion aus der abgetasteten Version (der perfekt rekonstruiert werden Nyquist-Shannon-Abtasttheorem ) . Ein Beispiel, wie Sie in 2D interpolieren können, finden Sie unterbilineare Interpolation .
In Matlab können Sie verwenden interp1
oder interp2
1D oder regelmäßig abgetastet 2D - Daten (jeweils) oder zu interpolieren griddata
zu interpolieren aus unregelmäßig abgetasteten 2D - Daten.
Würden Sie eine for-Schleife haben, die durch jedes Voxel geht und die entsprechende Formel berechnet?
Ja genau.
Matlab erspart Ihnen dies durch explizite for-Schleifen, da es für Matrizen und Vektoren (dh mehrdimensionale Arrays) ausgelegt ist. In Matlab wird dies als "Vektorisierung" bezeichnet. Definite Integrale mit angenähert werden sum
, cumsum
, trapz
, cumtrapz
etc.
Ich habe das Buch "Digital Image Processing" von Gonzalez und Woods gelesen, bin aber immer noch ratlos. Ich habe auch über die Buchreihe Numerical Recipes gelesen. Wäre das der richtige Weg?
Ja, numerische Rezepte wären ein guter Anfang. Es ist sehr praktisch und deckt die meisten numerischen Methoden ab, die Sie am Ende benötigen. (Sie werden feststellen, dass Matlab bereits alles implementiert, was Sie benötigen, aber numerische Rezepte liefern einen hervorragenden Hintergrund.)
Ich habe eine Klasse "Algorithmen und Datenstrukturen" besucht, sehe aber keinen Zusammenhang zwischen dem dort vorgestellten Material und der Implementierung wissenschaftlicher Algorithmen.
Das in den Kursen "Algorithmen und Datenstrukturen" behandelte Material konzentriert sich in der Regel auf Strukturen wie Listen, Arrays, Bäume und Diagramme, die Ganzzahlen oder Zeichenfolgen enthalten, sowie auf Operationen wie Sortieren und Auswählen: Probleme, für die es normalerweise nur ein einziges korrektes Ergebnis gibt. Wenn es um wissenschaftliche Algorithmen geht, ist dies nur die Hälfte der Geschichte. Die andere Hälfte betrifft Methoden zur Schätzung von reellen Zahlen und analytischen Funktionen. Sie finden dies in einem Kurs über "Numerische Methoden" (oder "Numerische Analyse") wie diesem- Scrollen Sie für die Folien nach unten): wie Sie Sonderfunktionen schätzen, wie Sie Integrale und Ableitungen schätzen usw. Hier besteht eine der Hauptaufgaben darin, die Genauigkeit Ihres Ergebnisses zu schätzen, und ein gängiges Muster besteht darin, eine Routine zu durchlaufen, die die Funktion verbessert schätzen, bis es ausreichend genau ist. (Sie könnten sich fragen, wie Matlab etwas so Einfaches tun kann, als einen Wert von sin(x)
für einige zu schätzen x
.)
Als einfaches Beispiel sehen Sie hier ein kurzes Skript, das eine Radontransformation eines Bildes in Matlab berechnet. Die Radontransformation nimmt Projektionen eines Bildes über einen Satz von Projektionswinkeln auf. Anstatt zu versuchen, die Projektion entlang eines beliebigen Winkels zu berechnen, drehe ich stattdessen das gesamte Bild mit imrotate
, sodass die Projektionsaufnahme immer vertikal ist. Dann können wir die Projektion einfach mit nehmen sum
, da diesum
einer Matrix einen Vektor zurückgibt, der die Summe über jede Spalte enthält.
Sie können Ihre eigene schreiben, imrotate
wenn Sie möchten, mit interp2
.
%%# Home-made Radon Tranform
%# load a density map (image).
A = phantom;
n_pixels = size(A, 1); %# image width (assume square)
%# At what rotation angles do we want to take projections?
n_thetas = 101;
thetas = linspace(0, 180, n_thetas);
result = zeros(n_thetas, n_pixels);
%# Loop over angles
for ii=1:length(thetas)
theta = thetas(ii);
rotated_image = imrotate(A, theta, 'crop');
result(ii, :) = sum(rotated_image);
end
%# display the result
imagesc(thetas, 1:n_pixels, result.');
xlabel('projection angle [degrees]');
Was früher ein Integral der Dichte entlang eines Strahls war, ist jetzt eine Summe über einer Spalte eines diskret abgetasteten Bildes, was wiederum durch Interpolation des Originalbildes über ein transformiertes Koordinatensystem gefunden wurde.