11 de enero de 2011

Numpy y OpenCV

Como lo explique en la anterior entrada, desde la versión 2.2 de OpenCV es requisito el uso de la librería numpy. Esta librería provee una sintaxis parecida a Matlab y permite realizar operaciones con vectores y matrices de una forma optimizada y cómoda. Numpy posee un objeto llamado "array" que es muy similar a las listas de Python, sin embargo, una lista puede contener cualquier tipo de datos en la misma lista. Por ejemplo

a=[ 1, 'Perro', 3.5]

Como vemos esta lista contiene tres datos de diferente tipo. Un entero, un cadena y un decimal.

El objeto array de numpy se parece en su forma a las listas pero solo permite tener un tipo de dato en la misma lista, por lo que pueden ser llamadas "listas homogéneas". Esto permite a python hacer cálculos a gran velocidad sobre los "arrays". Por otro lado numpy tiene funciones para manejo de álgebra linear, transformadas de Fourier y generación de números aleatorios.

La mejor forma para demostrar el funcionamiento de numpy es con ejemplos

- Creación de un vector






importo el modulo numpy y le digo que quiero llamarlo en mi programa como np osea que cuando llame una función de numpy debería comenzar con el prefijo np. de la misma manera como lo vengo haciendo con opencv que es el prefijo cv. También podría importarlo como "import numpy" pero me tocaría iniciar cada función escribiendo numpy. 
Se puede apreciar que cree un array con la funcion array y le asigne 5 valores. Después imprimo el vector.

- Creación de una matriz








Es básicamente lo mismo. Solo ahí que poner atención en los corchetes para definir una matriz.

- Seleccionar un elemento de la matriz

el índice es muy sencillo. Primero se escribe la fila y después la columna. En numpy las índices comienzan desde cero.

Numpy tiene muchísimas funciones para el manejo de matrices las cuales son explicadas en detalle aquí.

Cuando leí que OpenCV desde la versión 2.2 trataba las imágenes como matrices numpy, pensé de inmediato que podría manejar las imágenes mas fácilmente, y no estaba equivocado. ( recordar que una imagen digital es una matriz de 3 dimensiones. En una imagen de color un plano es para el color rojo, otro para el verde y el otro para el azul. En una imagen en escala de grises solo se tiene un plano)

Voy a mostrar un par de pruebas que hice para comenzar a trabajar con numpy. Pero las posibilidades que abre esta nueva opción son muchísimas. Sera cuestión de probar.
_____________________________________________________________________













Este código me muestra lo que hay en el pixel [10,10] de la imagen el cual se ve claramente que es blanco y como se esperaba, en ese pixel hay 3 valores uno para cada color que compone el pixel.
_______________________________________________________________________






















En este ejemplo creo 2 matrices. Las dos son de 200x200 pixeles pero una es llenada con unos y otra con ceros mediante las funciones ones y zeros respectivamente. Las muestro y en las dos imprimo el valor en el pixel 10,10. Como se ve a diferencia de la anterior imagen, estas solo tienen un valor en el pixel, a diferencia del otro que tenia 3 valores. Esto es debido a que las matrices que creen son unidimensionales y no imágenes RGB.

_______________________________________________________________________


Estos ejemplos sencillos permiten ver la versatilidad que le agrega la inclusión de numpy a opencv. Ahora solo queda seguir probando y encontrando muchas mas opciones.

No hay comentarios:

Publicar un comentario