Etiquetas

Mostrando entradas con la etiqueta Lab Vision Computacional. Mostrar todas las entradas
Mostrando entradas con la etiqueta Lab Vision Computacional. Mostrar todas las entradas

viernes, 24 de mayo de 2013

Wavelets Compresión de Imagenes

La entrada de esta semana para laboratorio de Visión computacional consiste en wavelets(onduletas).

Transformada de Wavelet

La transformada de wavelet consiste en comparar la señal con ciertas funciones wavelet, las cuales se obtienen a partir de las wavelet madre. Al realizar las comparaciones obtenemos lo que son los coeficientes.  En la transformada de wavelet se utiliza el DWT(Transformada de Wavelet Discreta). El DWT consiste en escalas y posiciones basadas en potencias de dos. El análisis de wavelets nos permite el poder descomponer la señal en aproximaciones y detalles, a lo que bien se le puede considerar un filtro, que si bien nos generara el doble de datos esto se puede solucionar con diezmado. 

Descomposición de Imágenes


Si se aplica DWT a una imagen lo que se obtiene son cuatro tipos de coeficientes:

  • cA: Coeficiente de aproximación. (LL)
  • cH: Coeficiente de detalles horizontales. (LH)
  • cV: Coeficiente de detalles verticales. (HL)
  • cD: Coeficiente de detalles diagonales. (HH)

Esto se puede dividir en 4 sub-imágenes  el coeficiente de aproximación contendrá la mayor parte de informacion el resto de los coeficientes contendrán detalles. Lo que se logra al descomponer la imagen es, obtener 4 imágenes que nos permiten tener un histograma concentrado lo que facilita la compresión de imágenes.


Compresión de Imágenes

En la actualidad contamos con cámaras fotográficas que toman excelentes fotos de alta resolución  el problema viene a la hora de querer transferirlas, si bien contamos con este tipo de tecnología la transmisión de estos archivos es bastante tardada ademas que también ocupan bastante espacio. Uno de los principios básicos en la compresión de imágenes es el reducir la redundancia espacial y espectral dentro de una imagen. 

Tipos de compresión

  • Con Perdida: Elimina informacion redundante y logra mayores tasas de compresión.
  • Sin Perdida: Es capas de reconstruir la imagen de vuelta al 100%
Entre algunas de las aplicaciones en compresión de imágenes encontramos lo que es el formato JPEG, el cual esta basado en DCT, tomando bloques de 8x8 y aplicando DCT. Una desventaja es que la calidad de la imagen baja ademas de que existe un porcentaje de perdida. Los radios de compresión de JPEG van desde 10:1 hasta 100:1 dependiendo de la imagen. Por otra parte el formato GIF es un formato sin perdida y sus radios de compresión van desde 4:1 hasta 10:1, no mas ya que de aplicar mas podría haber alguna perdida en la imagen.

Retomando un poco el tema principal de la tarea que consiste en experimentar con algún tipo de compresión por medio de wavelets con ayuda de la librería Pywavelets.

Para mas informacion sobre esta librería:


Compresión de Imágenes aplicando DCT y su inversa - 2D.

Para realizar esto se utilizaron funciones de la librería Pywavelets:

Se utilizo la función dwt2() la cual toma como parámetros lo siguiente:

La informacion en este caso debe ser una matriz ya que estamos trabajando con 2D y el tipo de wavelet que utilizaremos, esta librería cuenta con una gran variedad de wavelets en este caso utilizaremos haar.

Lo primero que se hizo fue transformar la imagen que usaríamos a escala de grises.

Después generamos nuestro array, que es el parametro que nos pide la función como datos de entrada.

Después de esto lo que haremos es obtener los 4 coeficientes con la función que mencione anteriormente, lo único que haremos es en otra función enviar como parámetro el array para poder trabajar con el.


Una ves que tenemos los 4 coeficientes lo que se hará es crear una imagen nueva para cada uno de ellos y realizar un filtrado ya que varios resultados nos pueden dar valores negativos o valores que sobre pasen los valores permitidos del rango 0-255 por lo que cualquier valor negativo lo pondremos como 0 y cualquier valor que sobre pase los 255 quedara como 255, cualquier otro valor quedara con el valor que ya tiene asignado simplemente se convertirán a enteros para poder asignarlos a las nuevas imágenes.

Creamos una función para recorrer cada uno de los coeficientes.


Y a partir de aquí recorremos los valores de cada coeficientes y los enviamos al filtro mencionado anteriormente.


Una ves que termina con un coeficiente nos genera su imagen y continua con el siguiente. Para las pruebas utilice la siguiente función  en donde tome en cuenta el coeficiente utilizado, el porcentaje de compresión con base a la imagen original y la nueva creada según el coeficiente, y por ultimo el tiempo que toma en realizar la compresión.

Ejemplos




Imagen Original











Coeficiente de Aproximación




Coeficiente detalles horizontales

Coeficiente detalles verticales
Coeficiente detalles diagonales



Como podemos ver los porcentajes de compresión son bastante altos pero por ende la calidad de la imagen se pierde casi por completo en algunos casos no es notorio casi nada de la imagen original, en cuanto a los tiempos son bastante buenos, aunque bueno también hay que tomar en cuenta que la imagen es de muy mala calidad y eso hace que sea mas fácil y rápido el proceso. Ahora una prueba con una imagen algo mas pesada.







Imagen Original




Coeficiente Aproximación




Coeficiente Detalles Horizontales





Coeficiente Detalles Verticales



Coeficiente Detalles Diagonales



En este caso los tiempos incrementaron un poco mas por el tamaño de la imagen, en cuanto a la tasa de compresión se mantuvo muy alta y en las imágenes de igual forma se puede apreciar. Por ultimo pondré un ejemplo en el cual sucedió algo interesante.






Imagen Original

En.wikipedia.org (2000) Wavelet transform - Wikipedia, the free encyclopedia. [online] Available at: https://en.wikipedia.org/wiki/Wavelet_transform [Accessed: 29 May 2013].


Coeficiente Aproximación



Coeficiente Detalles Horizontales






Coeficientes Detalles Verticales







Coeficiente Detalles Diagonales


En este ejemplo en particular podemos ver que la tasa de compresión no es tan alta como en los otros ejemplos. Y los tiempos son mas altos, a que se debe? si bien la imagen es de menor tamaño que la del ejemplo del paisaje estuve analizándolas de cerca y en el caso de la imagen de lena la calidad es mayor a la del paisaje haciendo algunas pruebas con zoom el paisaje a los pocos zooms se empieza a "pixelear" y perder las formas de la imagen dándome a entender que a pasado ya por algún tipo de compresión en cuanto a la imagen de lena no es de tan alta calidad pero al revisarla de cerca no se pierde tanto como el paisaje.

Reconstrucción-Inversa


Para aplicar DWT inverso se utiliza la función idwt() que ocupa como parámetros los coeficientes que utilizamos a la hora de la compresión y de igual forma damos el wavelet que se utilizo.

Mas informacion:


Ejemplos


Original 9,308 bytes

          
Inversa 7,851 bytes



614,998 bytes
9,050 bytes

Conclusión

En base a los resultados finales a la hora de realizar la inversa, se puede decir que el algoritmo es eficiente ya que se obtiene un alto porcentaje de compresión y sin tener mucha perdida general en la imagen si bien no se mantiene tanta calidad el objetivo era experimentar con la compresión, habría que seguir realizando pruebas y intentar con otros wavelets y métodos para comparar resultados por lo pronto esto seria todo.

Código Completo

El código completo se encuentra en mi repositorio del curso: Respositorio

Referencias

  • En.wikipedia.org (2010) Image compression - Wikipedia, the free encyclopedia. [online] Available at: http://en.wikipedia.org/wiki/Image_compression [Accessed: 24 May 2013].
  • Wasilewski, F. (2006) PyWavelets - Discrete Wavelet Transform in Python — PyWavelets Documentation. [online] Available at: http://www.pybytes.com/pywavelets/ [Accessed: 24 May 2013].
  • Henao González, A. (n.p.) Compresión de imágenes usando la transformada de wavelet y el algoritmo de Huffman. [e-book] Manizales: [Accessed: 24 May 2013].













jueves, 16 de mayo de 2013

Detección de movimiento

Para el laboratorio de esta semana se trabajo con lo que fue detección de movimientos. El procedimiento que yo realice, consistió en utilizar técnicas de visión computacional utilizadas en tareas anteriores.

Técnicas Utilizadas

  • Escala de grises
  • Filtro
  • Convolucion
  • Binarizacion
  • Diferencia

Procedimiento

Lo primero que hice fue obtener las 2 imágenes con las que se trabajaran, en mi caso utilice open cv solamente para trabajar con la webcam y a partir de aquí poder obtener las 2 imágenes.

El código que utilice para realizar esto fue lo siguiente:

Son 2 funciones en cada una de captura las 2 imágenes las cuales llamo desde el main y les coloque un if para poder saber si se obtuvieron ambas imágenes y también un mensaje de prepararse para la foto ya que preferí no abrir una ventana de la cámara solamente las toma una ves que uno presiona que se tomen las fotos. En caso de que no se tomen las 2 imágenes no se continua con el programa ya que sin las mismas no se puede trabajar. Una ves que se obtienen las imágenes se guardan y se obtiene la informacion relevante que se necesita como lo es el tamaño de ambas imágenes.


Ejemplo de imágenes tomadas de la cámara:

Imagen 1

Imagen 2


Después aplique lo que es escala de grises a ambas imágenes para poder aplicar el resto de los filtros. Para informacion del proceso de escala de grises:




Posteriormente se pasaron las imágenes por el filtro, esto con el fin de intentar eliminar un poco el ruido, de igual forma los detalles del filtro ya se tienen documentados y se pueden encontrar en la siguiente liga:




Después se aplico convolucion a ambas imágenes para obtener los bordes de las imágenes  Informacion de la técnica de convolucion:




Posteriormente aplique binarizacion para remarcar los pixeles importantes y poder sacar la diferencia después. Detalles de la técnica de binarizacion:





Como se puede observar a partir de aquí las imágenes contienen bastante ruido lo que no es favorable para la detección :S.

Después de esto aplicamos diferencia entre las 2 imágenes para obtener el movimiento, en caso de que los pixeles se encuentren en la misma posición anterior quedaran de color negro y en los puntos donde hayan cambiado quedaran de color blanco.





Como lo dije anteriormente existe demasiado ruido lo que me genero bastantes problemas en lo que fue la detección posteriormente se realizo lo que fue marcar el movimiento en si con lineas.


Aquí los resultados fueron muy malos ya que se torno todo rojo y no debería, esto creo se debió al excesivo ruido de las imágenes obtenidas por la cámara lo cual no e encontrado solución para que no salgan con tanto ruido.

Código Completo



Repositorio













jueves, 9 de mayo de 2013

Detección de esquinas

Para esta semana en el laboratorio de visión comunicacional la tarea consistió en, generar un programa capaz de detectar esquinas a partir de una imagen. Para hacer esto lo que hice fue primero utilizar escala de grises de aquí pasamos a realizar un filtro medio para después sacar una diferencia de la imagen de escala de grises y de la del filtro medio de esta manera nos quedan marcadas las esquinas, ya después agregamos bordes y binarizacion para mostrarlas de una manera mas clara y marcada.

Proceso

Como lo mencione lo primero que hay que hacer es escala de grises esto ya se a utilizado en muchas tareas anteriores por lo que solo dejo la liga.


Lo segundo que se hizo fue el filtro medio para realizar esto se sigue algo parecido a lo que se hizo en la tarea de filtro solo hay que agregar algunas cosas la liga para filtro es la siguiente.


Como lo que se realizo en la tarea de filtro consistita en revisar los vecinos de cada uno de los pixeles en este caso se agregaron también los vecinos de las esquinas para tener un mejor parámetro. Cada uno de los vecinos se agrega a una cola la cual después la ordenamos de menor a mayor para poder sacar el mediano de la cola, anteriormente en el filtro promedio el pixel central tomaba el valor promedio en este caso toma el valor medio, en mi caso utilice una función de numpy para obtener el mediano.


Hasta este punto solo obtenemos una imagen medio borrosa a partir de la original no hay gran cambio para notar las esquinas procedemos a sacar la diferencia de las imágenes.



En este caso lo único que se hizo fue cargar la imagen de escala de grises y la imagen que nos genero el filtro medio y restar los pixeles para obtener la diferencia y esto se lo asignamos a otra imagen.


Ya aquí podemos notar un poco las esquinas para apreciarlas mejor lo que se puede hacer es agregar binarizacion y convolucion explicación en la siguiente liga.

http://m8sem.blogspot.mx/2013/02/filtro-y-deteccion-de-bordes.html

Obtenemos mejores resultados:

 Convolucion
Binarizacion

Mas ejemplos

 Escala de Grises
Filtro Medio

Diferencia

Convolucion

Escala

Filtro Medio

Diferencia

Convolucion


Código Completo

En mi repositorio

jueves, 2 de mayo de 2013

Lab Visión Poligonos

La tarea de esta semana para el laboratorio de visión computacional, consistió en la detección de poligonos a partir de una imagen. Como ya lo sabemos un polígono es una figura geométrica compuesta de una cantidad finita de segmentos rectos que se unen para crear una figura.



Para esto lo primero que había que hacer es utilizar el bfs para separar la imagen en figuras en caso de ser una imagen con varias formas, esto ya se a hablado en varias ocaciones en entradas anteriores.

http://m8sem.blogspot.mx/2013/02/clase-2-deteccion-de-formas.html

Después hay que verificar por medio de los pixeles que conforman la figura si se sigue alguna misma pendiente para ir sacando las rectas de la misma y comprobar si es un polígono o no, esto se hace recorriendo todo el interior de cada figura. Aquí se puede apoyar con el código de lineas que se realizo anteriormente.

Una ves que se conocen todos los segmentos de la figura se puede saber si es un polígono o no.

Avance parcial   


Repositorio

https://github.com/rodo2043/VisionComputacional

Referencias

http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/poligonos.pdf

miércoles, 24 de abril de 2013

Gráficas-Histogramas Lab Vision

La tarea de esta semana para lab de Visión Computacional consistió en realizar gráficas de intensidad en base a los histogramas tomados de la tarea anterior, esto nos sirvió para poder detectar los agujeros en la tarea anterior.  Para realizar las gráficas utilice gnuplot y los datos generados con el programa anterior.

Para generar los histogramas se creo el siguiente código:


Esto nos genera archivos .dat con 2 datos primero el pixel revisado y su intensidad quedando el archivo con el siguiente formato:




Para no ser tan repetitivo código relevante para generar todo esto y los cruces todo esta publicado en la entrada de clase:
http://m8sem.blogspot.mx/2013/04/deteccion-de-agujeros.html


Para las gráficas simplemente se realizo un script que se llama desde el código y nos genera las gráficas según sean los datos de los archivos .dat:


Ejemplos