Implementazione di algoritmi di supporto tecnico in C ++ o MATLAB


14

Sono un laureando in ingegneria elettrica. Ho letto molti articoli tecnici sugli algoritmi di elaborazione del segnale e dell'immagine (ricostruzione, segmentazione, filtro, ecc.). La maggior parte degli algoritmi mostrati in questi articoli sono definiti nel tempo continuo e nella frequenza continua e spesso forniscono le soluzioni in termini di equazioni complicate. Come implementeresti un documento tecnico da zero in C ++ o MATLAB per replicare i risultati ottenuti in tale documento?

Più specificamente, stavo guardando il documento "Un algoritmo di ricostruzione del fascio conico generale" di Wang et al ( IEEE Trans Med Imaging. 1993; 12 (3): 486-96 ), e mi chiedevo, come posso anche iniziare implementando il loro algoritmo? L'equazione 10 ti dà la formula dell'immagine ricostruita in. Come lo codificheresti? Avresti un for-loop che passa attraverso ogni voxel e calcola la formula corrispondente? Come codificheresti le funzioni delle funzioni in quella formula? Come valuteresti le funzioni in punti arbitrari?

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?

Quali sono le tue esperienze negli algoritmi di programmazione di articoli di ricerca? Qualche consiglio o suggerimento?


1
Vado a dare un'occhiata al giornale quando ne avrò la possibilità. Ma credo che tutto riguardi i punti XYZ in un dato grafico. Definisci un vertice e poi lavori da lì.

2
In genere, si discretizzano i segnali campionando e quindi convertendo gli integrali in somme.
nibot,

Quindi ho letto del campionamento e della conversione degli integrali in somme, ma come valuta l'integrando in ciascun punto di campionamento se le funzioni nell'integrando sono memorizzate come matrici?

1
Damian, hai visto come la trasformazione del radon viene invertita tramite la retroproiezione? Questo è un esempio leggermente più semplice che potrei spiegare se ti interesserebbe. È usato per la tomografia usando le onde piane piuttosto che il campionamento conico descritto nel documento che hai pubblicato. en.wikipedia.org/wiki/Radon_transform
nibot

1
@ mr-crt, è possibile migrare invece su dsp.SE?
nibot,

Risposte:


15

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 ( c2de d2cin 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 interp1o interp2per interpolare dati 2D 1D o regolarmente campionati (rispettivamente) o griddataper 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 sumdi una matrice restituisce un vettore contenente la somma su ogni colonna.

Puoi scrivere il tuo imrotatese 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.


Wow @nibot, grazie per la risposta così dettagliata. 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. Leggerò i link che mi hai dato e inizierò a esercitarmi con algoritmi più semplici (dai libri anziché dai documenti). Grazie ancora
Damian,

Ciao Damian, ho modificato la mia risposta per rispondere al tuo commento. Penso che troverai quello che cerchi in un corso o in un libro sui metodi numerici / analisi numerica.
nibot,

In tutta la risposta!
Victor Sorokin,

@nibot: grazie per la modifica. Mi piace molto il corso di analisi numerica che hai collegato. Perché i "filtri di risposta agli impulsi finiti" sono collegati all'interpolazione? Mi chiedo perché questo non faccia parte del curriculum come studente EE. Oh bene. Grazie!
Damian,

@Damian: teoria del campionamento, interpolazione / decimazione, trasformazioni Z, trasformazione bilineare e filtri FIR / IIR vengono insegnati in classi / laboratori EE universitari come segnali e sistemi, sistemi di comunicazione, sistemi di controllo lineari e introduzione a DSP. Ho preso metodi numerici come parte del programma di doppia laurea in ingegneria informatica; Non penso che dovrebbe essere richiesto agli EE in generale.
Eryk Sun,

3

Aggiungendo all'eccellente spiegazione di Nibot , solo un paio di altri punti.

  • Ambienti di calcolo numerico come MATLAB, Octave o SciPy / NumPy ti risparmieranno molto impegno rispetto a fare tutto da solo in un linguaggio di programmazione generico come C ++. La giocoleria con doublearray e loop non è paragonabile al fatto di avere tipi di dati come numeri complessi e operazioni come integrali a portata di mano. (È fattibile di sicuro, e un buon codice C ++ può essere un ordine di grandezza più veloce, con buone astrazioni e modelli di libreria può anche essere ragionevolmente pulito e chiaro, ma è sicuramente più facile iniziare ad esempio con MATLAB.)

  • MATLAB ha anche "kit di strumenti", ad esempio Elaborazione di immagini ed Elaborazione di segnali digitali , che possono aiutare molto, a seconda di ciò che fai.

  • L' elaborazione digitale del segnale di Mitra è un buon libro per imparare (in MATLAB!) Le basi del tempo discreto, filtri, trasformazioni, ecc. Che è praticamente una conoscenza obbligatoria per fare qualsiasi algoritmo tecnico decente.

Sì, ho letto la documentazione di Image Processing Toolboox. Mi sembra estremamente utile, ma la mia domanda era orientata all'implementazione di qualcosa del genere. Fondamentalmente, volevo sapere come prendere un algoritmo / formula matematica e implementarlo (come ha fatto Mathworks con l'IPT). Volevo conoscere il modello di pensiero o alcune linee guida. Guarderò il libro di Mitra. Grazie!
Damian,

1
Per aggiungere alla risposta sopra, i toolkit C ++ come Armadillo possono semplificare notevolmente la conversione del codice Matlab in codice C ++ veloce. La sintassi di Armadillo è simile a Matlab. Puoi anche mixare il codice Matlab e C ++ tramite l'interfaccia messicana di Armadillo.
Mt

2

Metodi numerici. Di solito è un corso universitario e un libro di testo di livello superiore.

Il DSP è di solito vicino all'intersezione di metodi numerici e un'implementazione efficiente. Se si ignora l'efficienza, ciò che si potrebbe cercare è qualsiasi metodo di approssimazione numerica che possa produrre un risultato "abbastanza accurato" per le equazioni di interesse del documento tecnico. A volte si potrebbe avere a che fare con dati campionati, in cui i teoremi di campionamento porranno dei limiti sia sul metodo di acquisizione dei dati (pre-filtro) sia sull'intervallo o sulla qualità dei risultati che si possono ottenere dati.

A volte Matlab, ricette numeriche o varie librerie di elaborazione di immagini / segnali avranno algoritmi o codice efficienti per la soluzione numerica desiderata. Ma a volte potrebbe essere necessario rotolare da soli, quindi aiuta a conoscere la matematica dietro vari metodi di soluzione numerica. E questo è un grande argomento a sé stante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.