Gli algoritmi di elaborazione del segnale definiti in tempo / spazio / frequenza continui sono in genere implementati campionando il segnale su una griglia discreta e convertendo gli integrali in somme (e derivati in differenze). I filtri spaziali vengono implementati attraverso la convoluzione con un kernel di convoluzione (ovvero la somma ponderata dei vicini).
Vi è un enorme corpus di conoscenze riguardanti il filtraggio dei segnali nel dominio del tempo campionati; i filtri nel dominio del tempo sono implementati come filtri di risposta agli impulsi finiti , in cui il campione di output corrente viene calcolato come somma ponderata dei precedenti campioni di input N; o filtri di risposta all'impulso infiniti, in cui l'uscita corrente è una somma ponderata degli ingressi precedenti e delle uscite precedenti . Formalmente, i filtri del tempo discreto sono descritti usando la trasformata z , che è l'analogo del tempo discreto della trasformata di Laplace . La trasformata bilineare si mappa l'una sull'altra ( c2d
e d2c
in Matlab).
Come valuteresti le funzioni in punti arbitrari?
Quando è necessario il valore di un segnale in un punto che non si trova direttamente sulla griglia di campionamento, si interpola il suo valore dai punti vicini. L'interpolazione può essere semplice come scegliere il campione più vicino, calcolare una media ponderata dei campioni più vicini o adattare una funzione analitica arbitrariamente complicata ai dati campionati e valutare questa funzione alle coordinate necessarie. L'interpolazione su una griglia più fine uniforme è il sovracampionamento . Se il segnale originale (continuo) non contiene dettagli (cioè frequenze) più fini della metà della griglia di campionamento, la funzione continua può essere perfettamente ricostruita dalla versione campionata (il teorema di campionamento di Nyquist-Shannon ). Per un esempio di come puoi interpolare in 2D, vedi interpolazione bilineare .
In Matlab è possibile utilizzare interp1
o interp2
per interpolare dati 2D 1D o regolarmente campionati (rispettivamente) o griddata
per interpolare dati 2D campionati in modo irregolare.
Avresti un for-loop che passa attraverso ogni voxel e calcola la formula corrispondente?
Si, esattamente.
Matlab ti evita di doverlo fare tramite cicli espliciti perché è progettato per operare su matrici e vettori (cioè array multidimensionali). In Matlab questo si chiama "vettorializzazione". Integrali definiti possono essere approssimate con sum
, cumsum
, trapz
, cumtrapz
, etc.
Ho letto il libro "Digital Image Processing" di Gonzalez e Woods ma sono ancora perplesso. Ho anche letto delle serie di libri di Ricette numeriche. Sarebbe quello il modo corretto?
Sì, le ricette numeriche sarebbero un ottimo inizio. È molto pratico e copre la maggior parte dei metodi numerici di cui avrai bisogno. (Scoprirai che Matlab implementa già tutto ciò di cui hai bisogno, ma le Ricette Numeriche forniranno un eccellente background.)
Ho preso una classe di "algoritmi e strutture di dati", ma non vedo la relazione tra il materiale presentato lì e l'implementazione di algoritmi scientifici.
Il materiale trattato nei corsi "Algoritmi e strutture di dati" tende a concentrarsi su strutture come elenchi, matrici, alberi e grafici contenenti numeri interi o stringhe e operazioni come l'ordinamento e la selezione: problemi per i quali in genere esiste un unico risultato corretto. Quando si tratta di algoritmi scientifici, questa è solo metà della storia. L'altra metà riguarda metodi per stimare numeri reali e funzioni analitiche. Lo troverai in un corso su "Metodi numerici" (o "Analisi numerica", come questo- scorrere verso il basso per le diapositive): come stimare funzioni speciali, come stimare integrali e derivati, ecc. Qui uno dei compiti principali è stimare l'accuratezza del risultato e un modello comune è quello di iterare una routine che migliora un stimare fino a quando non è sufficientemente accurato. (Potresti chiederti come Matlab sa come fare qualcosa di semplice come stimare un valore sin(x)
per alcuni x
.)
Come semplice esempio, ecco un breve script che calcola una trasformazione radon di un'immagine in Matlab. La trasformazione del radon prende le proiezioni di un'immagine su una serie di angoli di proiezione. Invece di provare a calcolare la proiezione lungo un angolo arbitrario, io invece ruoto l'intera immagine usando imrotate
, in modo che la presa di proiezione sia sempre verticale. Quindi possiamo prendere la proiezione semplicemente usando sum
, poiché il sum
di una matrice restituisce un vettore contenente la somma su ogni colonna.
Puoi scrivere il tuo imrotate
se preferisci, usando 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]');
Ciò che una volta era parte integrante della densità lungo un raggio è ora una somma su una colonna di un'immagine discretamente campionata, che a sua volta è stata trovata interpolando l'immagine originale su un sistema di coordinate trasformato.