miércoles, 13 de febrero de 2013

Tarea #2 - LAB Visión - Sal y Pimienta - Procesamiento de imagenes - Python

Que tal para esta entrada se nos encargo modificar o agregar a nuestro código, una rutina que agregara degradación por adición de ruido(Sal y pimienta) base a dos parámetros:

  • Intensidad = que tanto porcentaje de la imagen se le agregara sal y pimienta
  • Polarización = que tan negros/blancos se pone un pixel seleccionado.
y otra rutina que quitara filtrara ese ruido.

Antes de comenzar
Mi programa se esta empezando a poner "FEO" son demasiados métodos y por cada tarea esta creciendo considerablemente, pese a esto, esta sera la ultima entrada que estaré modificando este código, el las siguientes trabajare por clases. 

El los avances de la tarea están en mi github.

Un poco de teoría
Les comparto información de relevante que me ayudo a despejar dudas, al final de la entrada en el apartado de REFERENCIAS pondré los links de TODA esta información.

El RUIDO en las imágenes es un deterioro que se puede producir debido a:
  • Pixeles perdidos en un sensor CCD
  • Cuando se comprime o transmite la imagen
  • Inadecuada iluminación de la escena
  • Escáner de documentos
  • Sensibilidad inadecuada de las cámaras, etc.
y su formula:

Para quitar este ruido existen varios métodos:
  • El de la Media(yo utilice este)
  • Media Contraharmonic
  • Mediana
  • Máxima
  • Media de sección
  • Laplaciano
  • Punto medio
  • y otros  
ahora que ya sabemos que es y como quitarla, estamos listos para la explicación.

Explicación

Para la rutina de generar ruido. Mi función recibe 3 parámetros:
  1. pixeles: esta una listas de listas que contienen los valores de todos los pixeles de la imagen.
  2. INTENSIDAD: es un float entre 0 y 1, este es el porcentaje de sal y pimienta en la imagen(mientras mas cerca a 1 mas sal y pimienta)
  3. POLARIZACION: es un float entre 0 y 1, este es que porcentaje de que tan negros o blancos se pone un pixel seleccionado.
En donde lo que hago es recorrer todo los pixeles de la imagen; dentro del FOR compara la INTENSIDAD con un numero RANDOM entre 0-1; si cumple la condición aplicamos POLARIZACION si no el pixel se deja como estaba.



Después aplicamos el filtro de la MEDIA, este método trata de sacar la MEDIA de los pixeles vecinos incluyendo también el pixel actual, las definiciones siempre se entienden mejor con ejemplos.

imagen de 3x3 pixeles

  • Pruebas de escritorio:
    • Para el pixel #1 y sus vecinos:
      • Media pixel #1 = 2
      • Media pixel #2 = 5
      • Media pixel #4 = 11
      • Medio pixel #5 = 14
    • Media de los seleccionados = 8(nuevo contenido del pixel #1)
    • Para el pixel #2 y sus vecinos:
      • Media pixel #2 = 5
      • Media pixel #1 = 2
      • Media pixel #3 = 8
      • Media pixel #4 = 11
      • Media pixel #5 = 14
      • Media pixel #6 = 17
    • Media de los seleccionados = 8(nuevo contenido del pixel #2)
    • Y así consecutivamente hasta terminar con los pixeles de la imagen

Una aclaración antes de mostrar mi código... tuve problemas con los vecinos en diagonal y no me dio chanse de corregirlo, únicamente tome los vecinos en forma de cruz, aunque no es tan perfecto como se esperaba los resultados son notables.


Resultados
CON SAL-PIMIENTA  =>  INTENSIDIDAD = 0.1 & POLARIZACIÓN = 1.0

SIN SAL-PIMIENTA   =>    INTENSIDAD  = 0.1 & POLARIZACIÓN = 0.0

CON SAL-PIMIENTA   =>  INTENSIDAD = 0.9 & POLARIZACIÓN = 0.9


SIN SAL-PIMIENTA  => INTENSIDAD = 0.9 & POLARIZACIÓN = 0.9

Ejecución y tiempos

argv[1] => nombre de la imagen
argv[2] => método a utilizar
argv[3] => intensididad
argv[4] => polarización



El mismo ,py funciona para ambas tareas



Puntos extras

Esta tarea es la misma que lo que hicimos en clase #2(Normalizar y binarizar) así que pongo la liga a la entrada.

Aquí encontraran la explicación detallada.
http://4imedio.blogspot.mx/2013/02/tarea-1-vision-computacional-python.html


REFERENCIAS

liga 1
liga 2
liga 3