martes, 12 de febrero de 2013

Actividad 2: Ruido Sal y Pimienta

En esta entrada veremos como meter y quitar ruido. El ruido que se empleará es sal y pimienta en la cuál consiste que en una imagen dada tiene algunos pixeles en blanco y negro.

Importancia
Es importante saber como quitar en una imagen ruido, ya que nos podemos encontrar que en un imagen   su contenido sea afectado por la lente de la cámaras, ondas magnéticas, entre otras.

Sal y Pimienta
Para generar el ruido lo que se pide es la intensidad, donde nos servirá para que tan frecuente tendremos ruido en la image, entonces lo que hacemos es tomar un de forma aleatoria aleatoria, para después darle a ese mismo pixel una tonalidad blanca o negra.

def sal_pimienta(self, inensidad):
w, h = self.img.size
self.pixel = self.img.load()
intesidad = 0.05
for i in range(w):
for j in range(h):
if(random() <= intesidad):
if(randrange(1,3) == 1):
self.pixel[i,j] = (0, 0, 0)
else:
self.pixel[i,j] = (255, 255, 255)
self.img.save('salPimienta05.png', 'PNG')
return self.img
view raw gistfile1.py hosted with ❤ by GitHub

[intensidad 0.01]

[intensidad 0.05]

[intensidad 0.1]

Remover Sal y Pimienta
Para remover el pixel de sal y pimienta, se pueden emplear varias técnicas, en mi caso empleo la técnica de media aritmética, donde consiste en tomar el pixel actual y sus vecinos, dentro de cada pixel estará su rgb, así que lo ordenamos y sacamos su valor medio, para después meterlo a la lista donde pondremos el actual con sus vecinos, para hacer nuevamente el mismo proceso, que es ordenarlo y sacar el valor medio, una vez obtenido ese valor es el que se pondrá en el pixel actual.
def remove_sal_pimienta(self):
w, h = self.img.size
self.pixel = self.img.load()
for i in range(w):
for j in range(h):
p_a = []
actual = []
arriba = []
abajo = []
izq = []
der = []
actual.append(self.pixel[i,j][0])
actual.append(self.pixel[i,j][1])
actual.append(self.pixel[i,j][2])
actual.sort()
p_a.append(actual[1])
if(i-1 >= 0):
izq.append(self.pixel[i-1,j][0])
izq.append(self.pixel[i-1,j][1])
izq.append(self.pixel[i-1,j][2])
izq.sort()
p_a.append(izq[1])
if(i+1 < w):
der.append(self.pixel[i+1,j][0])
der.append(self.pixel[i+1,j][1])
der.append(self.pixel[i+1,j][2])
der.sort()
p_a.append(der[1])
if(j-1 >= 0):
arriba.append(self.pixel[i,j-1][0])
arriba.append(self.pixel[i,j-1][1])
arriba.append(self.pixel[i,j-1][2])
arriba.sort()
p_a.append(arriba[1])
if(j+1 < h):
abajo.append(self.pixel[i,j+1][0])
abajo.append(self.pixel[i,j+1][1])
abajo.append(self.pixel[i,j+1][2])
abajo.sort()
p_a.append(abajo[1])
p_a.sort()
p = p_a[int(len(p_a)/2)]
self.pixel[i,j] = (p, p, p)
self.img.save('quitarSalPimienta.png', 'PNG')
return self.img
view raw gistfile1.py hosted with ❤ by GitHub

Resultado:
A continuación dejo el resultado y como podemos ver en la imagen que se removió sal y pimienta es casi efectivo, ya que podemos ver a simple vista uno o dos pixeles con ruido.

[Sal y Pimienta]

[Remover Sal y Pimienta]

Código Completo:
from PIL import Image
from sys import argv
import math, time
from random import randrange, random
class Filtro(object):
"""docstring for Filtro"""
def __init__(self, fileName):
self.img = Image.open(fileName)
self.pixel = self.img.load()
def grayScale(self):
start = time.time()
w, h = self.img.size
for i in range(w):
for j in range(h):
r = self.pixel[i,j][0]
g = self.pixel[i,j][1]
b = self.pixel[i,j][2]
media = (r+g+b)/3
self.pixel[i,j] = (media, media, media)
self.img.save('grayScale.png', 'PNG')
end = time.time()
print 'Tiempo tomado: '+str(end-start)
return self.img
def blurFilter(self, repeticiones):
w, h = self.img.size
self.pixel = self.img.load()
if(repeticiones == None): repeticiones = 5
for n in range(repeticiones):
for i in range(w):
for j in range(h):
array_prom = []
if(i-1 >= 0):
array_prom.append(self.pixel[i-1,j][0])
if(i+1 < w):
array_prom.append(self.pixel[i+1,j][0])
if(j-1 >= 0):
array_prom.append(self.pixel[i,j-1][0])
if(j+1 < h):
array_prom.append(self.pixel[i,j+1][0])
npixel = sum(array_prom)/len(array_prom)
self.pixel[i,j] = (npixel, npixel, npixel)
self.img.save('blurFilter.png', 'PNG')
return selg.img
def sal_pimienta(self, inensidad):
w, h = self.img.size
self.pixel = self.img.load()
intesidad = 0.05
for i in range(w):
for j in range(h):
if(random() <= intesidad):
if(randrange(1,3) == 1):
self.pixel[i,j] = (0, 0, 0)
else:
self.pixel[i,j] = (255, 255, 255)
self.img.save('salPimienta05.png', 'PNG')
return self.img
def remove_sal_pimienta(self):
w, h = self.img.size
self.pixel = self.img.load()
for i in range(w):
for j in range(h):
p_a = []
actual = []
arriba = []
abajo = []
izq = []
der = []
actual.append(self.pixel[i,j][0])
actual.append(self.pixel[i,j][1])
actual.append(self.pixel[i,j][2])
actual.sort()
p_a.append(actual[1])
if(i-1 >= 0):
izq.append(self.pixel[i-1,j][0])
izq.append(self.pixel[i-1,j][1])
izq.append(self.pixel[i-1,j][2])
izq.sort()
p_a.append(izq[1])
if(i+1 < w):
der.append(self.pixel[i+1,j][0])
der.append(self.pixel[i+1,j][1])
der.append(self.pixel[i+1,j][2])
der.sort()
p_a.append(der[1])
if(j-1 >= 0):
arriba.append(self.pixel[i,j-1][0])
arriba.append(self.pixel[i,j-1][1])
arriba.append(self.pixel[i,j-1][2])
arriba.sort()
p_a.append(arriba[1])
if(j+1 < h):
abajo.append(self.pixel[i,j+1][0])
abajo.append(self.pixel[i,j+1][1])
abajo.append(self.pixel[i,j+1][2])
abajo.sort()
p_a.append(abajo[1])
p_a.sort()
p = p_a[int(len(p_a)/2)]
self.pixel[i,j] = (p, p, p)
self.img.save('quitarSalPimienta.png', 'PNG')
return self.img
def main():
im = argv[1]
imagen = Filtro(im)
imagen.grayScale()
imagen.sal_pimienta(5)
#imagen.remove_sal_pimienta()
main()
view raw gistfile1.py hosted with ❤ by GitHub


Referencias:

1 comentario:

  1. Bien; lo obligatorio está hecho muy bien, pero de lo complementario no hay nada. Van 8 pts lab 2.

    ResponderEliminar