February 14, 2013

Laboratorio 2. Sal y Pimienta

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

Con ruido

Sin Sal


Original

Con sal


Sin sal



Saludos!

1 comment: