miércoles, 13 de febrero de 2013

Rudio Sal y pimienta y Detección de bordes

El ruido sal y pimienta es el nombre que recibe el efecto de una imagen cuando tiene píxeles de colores muy claros y muy obscuros que son totalmente diferentes a los píxeles de alrededor de la imagen. Este ruido aveces aparece en las fotos debido a polvo en el lente entre otras cosas.
El objetivo principal de esta entrada es aplicar a una imágen este efecto y poder limpiarle este ruido después.

Aplicar Ruido 

La manera en que aplico el filtro es la siguiente:
  • Calculo el número de píxeles de toda la imagen.
  • Elijo al azar que píxeles quiero modificar, el número de píxeles que decidí modificar esta definido por el parámetro de intensidad, aunque es posible aplicar varias veces el filtro en la interfaz para aumentar la intensidad del ruido,
  • Recorro todos los píxeles de la imagen original y si no esta entre los píxeles que elegí los paso igual, pero si esta en la lista de los píxeles elegidos les cambio de color aleatoriamente claro o negro y el color en especifico se elige al azar también, esto se elige con el parámetro polarización, yo use 40 es decir los pixeles obscuros van de 0 a 40 y los claros de 215 a 255 .
  • Y pongo todos los nuevos píxeles en la imagen resultante.

Así se ven las imágenes con ruido:






Este es el código para aplicar sal y pimienta:



Limpiar ruido

Para limpiar el ruido lo primero que hice fue poner en una lista todos los píxeles que son o totalmente blancos o totalmente negros, después analice esos píxeles tomando en cuenta los píxeles vecinos de arriba, abajo, derecha e izquierda, y lo primero que se me ocurrió hacer fue promediar a los vecinos y poner el valor del promedio en la posición del pixel que se analiza en la nueva imagen, pero esto no limpiaba bien la imagen entonces lo que hice fue probar con la mediana de los vecinos, y así se tiene la ventaja que el color que se va a poner el la nueva posición por lo menos existe ya en la imagen.
Aquí muestro el resultado en un png que muestra a la izquierda la imagen con ruido y a la derecha la que fue limpiada y en un gif, que empieza con la imagen original, la imagen en gris, después con ruido y por ultimo la imagen que fue limpiada con el algoritmo, en los ejemplos de abajo se uso polarización fue igual a 40 y la intensidad igual a .2, y estos parámetros se pueden cambiar:








Con más intensidad:


El código que hace esto es el siguiente:


Bordes de una imagen

La tarea aquí es tener una imagen en escala de grises, después tener la misma imagen pero con el filtro de difusa, y una vez que se tiene esto hacer una resta entre los pixeles de la imagen gris y los de la imagen gris difusa, así se obtiene una imagen a la cual se le pueden notar los bordes, ya al momento de hacer la imagen difusa como se obtiene un promedio de los vecinos en los bordes va a ser más obvio un cambio en los pixeles cuando hay bordes, es por esto que resaltan las líneas.
Imagen original


Resultado de aplicar la resta entre la imagen gris y la de promedio



Lo siguiente que hay que hacer es normalizar para que se puedan marcar más las diferencias entre los puntos blancos y los negros y así ver un poco mejor los contornos.



Y finalmente binarizada



Código para normalizar


Código que saca la diferencia



Aquí un gif que va desde la imagen a color después pasa la imagen a gris enseguida se aplica el promedio, después se muestra la diferencia entre la imagen gris y la imagen promedio, este resultado de imagen se normaliza y por último se binariza.


En los códigos hago uso de módulos que mando llamar de un python que hice que se llama filtros.py, para no tener que estar escribiendo siempre las rutinas de pasar a gris, umbral, difuso, etc. En mi repositorio se pueden descargar todos completos los códigos.

1 comentario: