Este post es para generar ruido en una imagen, en específico el ruido conocido como Sal y pimienta. Este ruido consiste en colocar puntos blancos y negros en una imagen.
Para realizar el ruido lo que realicé fue definir una frecuencia con la que sal y pimienta serán colocadas en la imagen, después utilizando un número random y si este número es menor que la frecuencia se colocará al azar un gránulo de sal o pimienta.
Para colocar sal y pimienta utilicé las imágenes en grises.
def salPimienta(self):
'''Aplica ruido sal y pimienta escogiendo pixeles al azar '''
salPim = self.imActual.copy()
pixeles = salPim.load()
frec = 0.02
if salPim.mode == 'RGB':
for x in range(self.w):
for y in range(self.h):
cambio = random.uniform(0,1)
if cambio < frec:
if random.choice([True,False]):
pixeles[x,y] = (255,255,255)
else:
pixeles[x,y] = (0,0,0)
elif salPim.mode == 'L':
for x in range(self.w):
for y in range(self.h):
cambio = random.uniform(0,1.0)
if cambio < frec:
if cambio > 0:
pixeles[x,y] = 255
else:
pixeles[x,y] = 0
salPim.save('salPimienta.png')
self.imActual = salPim
self.actualizarFondo()
Ahora para quitar este ruido realicé una función en la que tomo los vecinos de cada pixel, los sumo y saco un promedio, resto el promedio menos el valor del pixel actual y si el resultado es mayor a un rango definido este pixel es un gránulo de sal o pimienta y es cambiado por el promedio de los vecinos.
Aquí el código:
def quitarSalPimienta(self):
'''Quita el ruido sal y pimienta
'''
pixeles = self.imActual.load()
umbral = 30
if self.imActual.mode == 'L':
normal = Image.new('L', (self.w, self.h))
normPix = normal.load()
for x in range(self.w):
for y in range(self.h):
vecinos = []
if x > 0:
vecinos.append(pixeles[x-1, y])
if y > 0:
vecinos.append(pixeles[x, y-1])
if x < self.w-1:
vecinos.append(pixeles[x+1, y])
if y < self.h-1:
vecinos.append(pixeles[x, y+1])
prom = sum(vecinos)/len(vecinos)
if abs(prom - pixeles[x,y]) > 60:
normPix[x,y] = prom
else:
normPix[x,y] = pixeles[x,y]
normal.save('sinSal.png')
self.imActual = normal
self.actualizarFondo()
Estos son algunos de las pruebas que hice, cabe aclarar que no pude lograr quitar toda la sal y pimienta.
Original
Sin Sal
Original
Sin sal
Saludos!






Lo obligatorio quedó bien. 8 pts lab 2.
ReplyDelete