Este video es una prueba de alineamiento automático de 2 Fibras ópticas multimodo (62.5/125) en un eje, utilizando una montura para fibras hecha a la medida controlada por medio de motores a pasos.
Para el alineamiento utilizo el algoritmo de correlación de fase de imágenes a partir del video proveniente de un microscopio usb.
El Siguiente programa representa una superficie en 3d utilizando OpenGL y muParser, a través de una función de la forma z(x,y) . Este programa puede ser modificado fácilmente para representar cualquier tipo de datos en 3d a partir de los datos de una región en 2d.
Enlaces:
http://muparser.sourceforge.net/
Programa: (Requiere OpenGL, muParser y libglade para compilar)
El siguiente programa muestra una animación de una galaxia en espiral basada en la teoria de ondas de densidad. Para cambiar el número de cuerpos a representar, así como otros parametros es necesario modificar el programa y recompilar.
Comunmente como primer paso antes de procesar una imágen, debemos reducir la cantidad de datos con los que trabajaremos, usualmente representaremos los 3 componentes de cada pixel ( Rojo, Verde, Azul) a partir de su luminancia relativa.
El siguiente video pretende ser una muestra de algunos algoritmos de procesamiento de imágenes, que describiré mas adelante en está sección, implementados en este caso, utilizando la libreria OpenCV.
El siguiente programa lo diseñe hace tiempo como parte del material didáctico para el trabajo titulado: “El Vínculo de la Teoría con la Práctica como vía para el Estudio Integral del Fenómeno Físico”, presentado en el L congreso Nacional de Física en el 2007. Por ahora sigo modificando el programa, por lo que esta vez no subire el código fuente.
En los últimos años han surgido significativos avances en los CPUs de tipo doméstico, las nuevas tecnologías brindan la capacidad de aumentar cada vez mas el poder de computo en nuestras aplicaciones. Uno de estos avances y tal vez uno de los mas recientes (aunque nada nuevo en equipos de alta gama), son los procesadores multi-núcleo.
El uso de los procesadores multi-núcleo supone reducir el tiempo de computo de nuestras aplicaciones, sin embargo, para poder utilizar esta tecnología, nuestros programas deben ser diseñados para utilizar este modelo de memoria compartida y contar con un compilador adecuado. Para esto, los principales fabricantes de procesadores tanto de tipo doméstico como AMD e Intel, así como fabricantes de supercomputadoras tales como Cray o Sun, crearon un nuevo estándar multi-plataforma llamado OpenMP para compiladores de C/C++ y Fortran.
OpenMP esta basado en el modelo Fork-Join donde una tarea es descompuesta en diversas tareas que serán procesadas en paralelo para después reunir sus resultados.
El uso de OpenMP supone agregar ciertas directivas en las secciones del código a ser paralelizado, sin embargo, es importante recalcar que es necesario que nuestro programa sea diseñado para que cada hilo trabaje de forma independiente.
Existen ciertas clausulas que son especificadas dentro de las directivas que anteceden a los bloques a ser paralelizados que especifican las variables que pueden ser compartidas por cada hilo, como variables privadas (Private), variables en común pero totalmente independientes entre hilos (Firstprivate, Lastprivate,..), así como también secciones dentro del código que sirven de punto de unión para los hilo del programa. El uso correcto de estas clausulas en las lineas directivas ayuda a obtener los resultados esperados en el menor tiempo posible.
El calculo de los puntos del conjunto de Mandelbrot es un buen ejemplo que puede ser fácilmente paralelizable, debido a que cada punto dentro del conjunto es completamente independiente de los demás.
En los siguientes programas se calculan el conjunto de Mandelbrot a partir del código del post anterior pero modificado para trabajar en paralelo(v2), la tercera versión (v3) genera un video avi del cálculo de los puntos utilizando Opencv.
Es posible comparar el tiempo de los programas utilizando el comando time en la terminal, así como también cambiar el programa de paralelización (schedule) dentro del código.
Como primer post y como una introducción para el siguiente, empezare brevemente con el conjunto de Mandelbrot y su representación usando el algoritmo de tiempo de fuga.
El conjunto de Mandelbrot se define como el conjunto de puntos conexos en un plano complejo que cumplen la siguiente relación:
tal que:
donde: s representa la distancia al origen del disco de radio 2 que contiene al conjunto y n representa la n-esima iteración de P.
En la imagen se muestran diferentes secciones llamadas orbitas representadas por diferentes colores, dichas orbitas corresponden al numero de iteraciones que fueron necesarias antes de que el punto tendiera a infinito.
En la imagen se muestra el conjunto de Mandelbrot, como el conjunto de puntos de orbita 0 representado en color negro.
El programa adjunto genera una imagen en formato ppm, que es uno de los formatos mas sencillos y que mas utilizare en adelante en los siguientes programas.
Para hacer un zoom solo es cuestión de cambiar el intervalo de la región donde se iterarán los puntos y recompilar.