2010-04-28 10 views
5

Ho un dispositivo per acquisire immagini XRay. A causa di alcuni vincoli tecnici, il rilevatore è costituito da pixel di dimensioni eterogenee e da più riquadri inclinati e parzialmente sovrapposti. L'immagine è quindi distorta. La geometria del rivelatore è nota con precisione.Modifica di un'immagine con OpenGL?

Ho bisogno di una funzione per convertire queste immagini distorte in un'immagine piatta con dimensioni pixel omogenee. L'ho già fatto con la CPU, ma vorrei provare con OpenGL per utilizzare la GPU in modo portatile.

Non ho esperienza con la programmazione OpenGL e la maggior parte delle informazioni che sono riuscito a trovare sul Web sono state inutili per questo utilizzo. Come dovrei procedere? Come faccio a fare questo ?

Le dimensioni dell'immagine sono 560x860 pixel e abbiamo un lotto di 720 immagini da elaborare. Sono su Ubuntu.

+0

La versione OpenGL di Wihch è la destinazione? – Danvil

+0

Sembra un po 'come la "cosa" di PhotoSynth di Microsoft. http://photosynth.net/ – epatel

risposta

0

È possibile trovare utile this tutorial (è un po 'vecchio, ma si noti che contiene alcuni OpenGL 2.x GLSL dopo la sezione Cg). Non credo ci siano scorciatoie per l'elaborazione delle immagini in GLSL, se è quello che stai cercando ... devi capire molto dell'aspetto della rasterizzazione 3D e del bagaglio storico per usarlo efficacemente, anche se una volta fatto avere un framework per gli input e gli output configurati, puoi dimenticarti di questo e giocare con i tuoi algoritmi nel codice dello shader con relativa facilità.

Avendo fatto questo genere di cose per anni (inizialmente usando gli shader Direct3D, ma più recentemente con CUDA), devo dire che sono completamente d'accordo con i post che raccomandano CUDA/OpenCL. Rende la vita molto più semplice e generalmente funziona più velocemente. Dovrei essere piuttosto disperato per tornare a un'implementazione dell'API di grafica di algoritmi non grafici ora.

+0

Ok. Vedrò se la nuova versione di Ubuntu ha fatto progressi per rendere più semplice l'utilizzo dei driver abilitati CUDA. Si noti che quindi utilizzerei la texture per memorizzare i pesi della combinazione lineare dei pixel di input. CUDA è davvero impressionante. Il mio programma di ricostruzione tomografica era 600 volte più veloce della versione CPU sulla mia GTX280! – chmike

2

Piuttosto che OpenGL, questo sembra un CUDA, o più in generale un problema GPGPU.

Se si dispone già del codice C o C++, CUDA dovrebbe essere poco più che capire i tipi che si desidera utilizzare sulla GPU e come l'algoritmo può essere affiancato.

+0

Ho già programmato in CUDA ma stavo cercando una soluzione portatile che OpenGL dovrebbe essere in grado di fornire. L'altra cosa è che Ubuntu non è amichevole con CUDA. – chmike

+0

CUDA funziona perfettamente con Ubuntu. Ho fatto molto con Ubuntu 9.04/9.10/10.04 e CUDA SDK di NVIDIA. CUDA è limitato all'hardware Nvidia ... – Danvil

+0

Yup ... CUDA e OpenCL funzionano bene su Ubuntu. OpenCL è probabilmente l'idea migliore, è più portabile. –

4

OpenGL è per il rendering di poligoni. Potresti essere in grado di eseguire più passaggi e utilizzare gli shader per ottenere ciò che desideri ma è meglio riscrivere l'algoritmo in Open C L. Il bonus sarebbe quindi avere qualcosa di portatile che userà anche CPU multi core se nessuna scheda grafica dell'acceleratore è disponibile.

+0

OpenGL è più portatile di OpenCL, specialmente su Ubuntu. – chmike

+0

OpenCL funziona perfettamente con Ubuntu. Ho fatto molto con Ubuntu 9.04-10.04 e OpenCL SDK di NVIDIA. – Danvil

+0

@danvil Come si installa il driver? Ho installato il driver "a mano" ma ogni volta che il kernel viene aggiornato, trovo me stesso in VGA e devo reinstallare il driver. Lo faccio sul mio PC di lavoro ma questo non è accettabile su una macchina di produzione. – chmike

1

Se si desidera eseguire questa operazione con OpengGL, lo si farebbe normalmente fornendo i dati correnti come trama e scrivendo uno shader di frammenti che li elabora e configurandoli per renderizzare una trama. Una volta che la trama di output è completamente renderizzata, è possibile recuperarla nuovamente nella CPU e scriverla come un file.

ho paura che è difficile fare molto di più di uno schizzo molto generale del flusso complessivo senza sapere di più su quello che stai facendo - ma se (come hai detto) hai già fatto questo con CUDA, a quanto pare hai già una buona idea della maggior parte dei dettagli.

+0

Questo è quello che volevo fare. Una spiegazione più dettagliata con un codice di esempio sarebbe molto utile. Almeno un buon puntatore su un tutorial che esempio di codice funzionale completo potrei seguire. – chmike

1

In fondo quello che stai chiedendo qui è "come posso utilizzare una GPU per risolvere questo problema?"

GPU moderne sono essenzialmente motori algebra lineare, in modo che il primo passo sarebbe quello di definire il problema come una matrice che trasforma una coordinata ingresso < x, y> alla sua uscita in spazio omogeneo:

alt text

Ad esempio, rappresenterebbe una trasformazione di scalatura x da & frac12 ;, scala y da 1.2, e traducendo e data da due unità come:

alt text

e si possono elaborare trasformazioni analoghe per , shear, ecc.

Una volta che hai la tua trasformano rappresentato come una moltiplicazione matrice-vettore, tutto quello che dovete fare è caricare i dati di origine in una texture, specificare il vostro trasformare come il projection matrix, e rendono al risultato. La GPU esegue la moltiplicazione per pixel. (Puoi anche scrivere shader, etc, che fanno matematica più complicata, fattore in più vettori e matrici e cosa no, ma questa è l'idea di base.

Detto questo, una volta che il problema è stato espresso come una trasformazione lineare, è possibile farlo funzionare molto più velocemente sulla CPU sfruttando ad esempio SIMD o uno dei many linear algebralibraries là fuori. A meno che tu non abbia bisogno di prestazioni in tempo reale o di avere una quantità veramente immensa di dati da elaborare, l'uso di CUDA/GL/shader ecc. Potrebbe essere più difficile di quanto non ne valga la pena, dato che c'è un po 'di goffo meccanismo coinvolto nell'inizializzazione delle librerie, impostazione del rendering obiettivi, apprendimento dei dettagli dello sviluppo della grafica, ecc.

Semplicemente la conversione del ciclo interno dalla matematica ad-hoc a una subroutine lineare ottimizzata algebrica può darti un incremento delle prestazioni della CPU che hai fatto bene Là.

+0

Inizio a pensare che probabilmente hai ragione con il tuo suggerimento di usare la CPU al posto della GPU. Per il mio caso di utilizzo devo applicare la stessa identica correzione a molte immagini. Quindi i parametri della funzione di mappatura possono essere precalcolati in modo tale che ogni valore di pixel possa essere calcolato con una semplice somma ponderata dei pixel dell'immagine di input. Ho già implementato un programma del genere. – chmike