2010-04-28 19 views
5

Tengo un dispositivo para adquirir imágenes de XRay. Debido a algunas limitaciones técnicas, el detector está hecho de un tamaño de píxel heterogéneo y múltiples mosaicos inclinados y parcialmente superpuestos. La imagen está así distorsionada. La geometría del detector se conoce con precisión.¿Modificar una imagen con OpenGL?

Necesito una función para convertir estas imágenes distorsionadas en una imagen plana con un tamaño de píxel homogéneo. Ya lo hice por CPU, pero me gustaría probar con OpenGL para usar la GPU de forma portátil.

No tengo experiencia con la programación de OpenGL, y la mayoría de la información que pude encontrar en la web no sirvió para este uso. Cómo debo proceder ? Cómo hago esto ?

El tamaño de la imagen es de 560x860 píxeles y tenemos lotes de 720 imágenes para procesar. Estoy en Ubuntu.

+0

versión wihch OpenGL qué objetivo? – Danvil

+0

Esto suena un poco como la "cosa" de PhotoSynth de Microsoft. http://photosynth.net/ – epatel

Respuesta

0

Puede ser útil this tutorial (es un poco viejo, pero tenga en cuenta que contiene algo de OpenGL 2.x GLSL después de la sección Cg). No creo que haya ningún atajo para el procesamiento de imágenes en GLSL, si eso es lo que estás buscando ... necesitas entender mucho del aspecto de rasterización 3D y el bagaje histórico para usarlo efectivamente, aunque una vez que lo haces tener un marco para la configuración de entradas y salidas, puede olvidarse de eso y jugar con sus propios algoritmos en el código de sombreado con relativa facilidad.

Después de haber estado haciendo este tipo de cosas durante años (inicialmente usando sombreadores Direct3D, pero más recientemente con CUDA), tengo que decir que estoy totalmente de acuerdo con las publicaciones aquí recomendando CUDA/OpenCL. Hace la vida mucho más simple, y generalmente funciona más rápido. Tendría que estar bastante desesperado por volver a la implementación de API gráfica de algoritmos que no son gráficos ahora.

+0

Ok. Veré si la nueva versión de Ubuntu ha hecho algún progreso para simplificar el uso de controladores habilitados para CUDA. Tenga en cuenta que usaría la textura para almacenar los pesos de la combinación lineal de los píxeles de entrada. CUDA es realmente impresionante. ¡Mi programa de reconstrucción tomográfica fue 600 veces más rápido que la versión de la CPU en mi GTX280! – chmike

2

En lugar de OpenGL, esto suena como un problema CUDA, o más generalmente GPGPU.

Si tiene un código C o C++ para hacerlo, CUDA debería ser poco más que descifrar los tipos que desea usar en la GPU y cómo se puede formar el algoritmo.

+0

Ya programé en CUDA pero estaba buscando una solución portátil que OpenGL debería poder proporcionar. La otra cosa es que Ubuntu no es amigable con CUDA. – chmike

+0

CUDA funciona perfectamente con Ubuntu. He hecho mucho con Ubuntu 9.04/9.10/10.04 y CUDA SDK de NVIDIA. Por supuesto, CUDA está limitado al hardware de Nvidia ... – Danvil

+0

Yup ... CUDA y OpenCL funcionan bien en Ubuntu. OpenCL es probablemente la mejor idea, es más portátil. –

4

OpenGL es para renderizar polígonos. Es posible que pueda hacer varias pasadas y usar sombreadores para obtener lo que desea, pero es mejor que vuelva a escribir el algoritmo en Abrir C L. La ventaja entonces sería que tiene algo portátil que incluso usará CPU multinúcleo si no hay una tarjeta aceleradora de gráficos disponible.

+0

OpenGL es más portátil que OpenCL, especialmente en Ubuntu. – chmike

+0

OpenCL funciona perfectamente con Ubuntu. He hecho mucho con Ubuntu 9.04-10.04 y OpenCL SDK de NVIDIA. – Danvil

+0

@danvil ¿Cómo se instala el controlador? Instalé el controlador "a mano", pero cada vez que se actualiza el kernel, me encuentro en VGA y tengo que volver a instalar el controlador. Lo hago en mi PC de trabajo, pero esto no es aceptable en una máquina de producción. – chmike

1

Si desea hacer esto con OpengGL, normalmente lo haría suministrando los datos actuales como una textura, y escribiendo un sombreador de fragmentos que procesa esos datos, y configúrelos para renderizarlos en una textura. Una vez que la textura de salida se haya procesado por completo, puede recuperarla nuevamente en la CPU y escribirla como un archivo.

Me temo que es difícil hacer mucho más que un esbozo muy general del flujo general sin saber más acerca de lo que estás haciendo, pero si (como dijiste) ya has hecho esto con CUDA, aparentemente ya tienes una idea bastante buena de la mayoría de los detalles.

+0

Esto es lo que quería hacer. Una explicación más detallada con un código de ejemplo sería muy útil. Al menos un buen puntero en un tutorial que podríamos usar como ejemplo de código funcional completo. – chmike

1

En esencia, lo que está preguntando aquí es "¿cómo puedo usar una GPU para resolver este problema?"

GPU modernas son esencialmente motores de álgebra lineal, por lo que su primer paso sería definir su problema como una matriz que transforma una coordenada de entrada < x, y> a su salida en el espacio homogéneo:

alt text

por ejemplo, representaría una transformación de escala x por y frac12 ;, escala y un 1,2, y la traducción de arriba ya la izquierda por dos unidades como:

alt text

y puede calcular transformaciones análogas para rotation, shear, etc., también.

Una vez que haya representado su transformación como una multiplicación de matriz-vector, todo lo que necesita hacer es cargar sus datos de origen en una textura, especificar su transformación como projection matrix y representarla en el resultado. La GPU realiza la multiplicación por píxel. (También puede escribir sombreadores, etc., que hacen matemática más complicada, factorizan en múltiples vectores y matrices y lo que no, pero esta es la idea básica.)

Dicho esto, una vez que tienes el problema expresado como una transformación lineal, puede hacer que se ejecute mucho más rápido en la CPU también mediante el aprovechamiento por ejemplo SIMD o uno de los many linear algebralibraries por ahí. A menos que necesite un rendimiento en tiempo real o tenga que procesar una inmensa cantidad de datos, usar CUDA/GL/shaders, etc. puede ser más problemático de lo que vale, ya que hay un poco de maquinaria torpe involucrada en inicializar las bibliotecas, configurar render objetivos, aprendiendo los detalles del desarrollo de gráficos, etc.

Simplemente convirtiendo su bucle interno de matemática ad-hoc a una subrutina de álgebra lineal bien optimizada puede darle suficiente impulso de rendimiento en la CPU que está hecho bien ahí.

+0

Empiezo a pensar que probablemente tengas razón con tu sugerencia de usar CPU en lugar de GPU. Para mi caso de uso, debo aplicar la misma corrección exacta a muchas imágenes. Por lo tanto, los parámetros de la función de mapeo se pueden calcular previamente para que cada valor de píxel se pueda calcular de una suma ponderada simple de los píxeles de la imagen de entrada. Ya implementé un programa así. – chmike

Cuestiones relacionadas