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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
[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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Referencias:
Bien; lo obligatorio está hecho muy bien, pero de lo complementario no hay nada. Van 8 pts lab 2.
ResponderEliminar