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