martes, 12 de febrero de 2013

Lab 2: Sal y Pimienta - Quitar Sal y Pimienta - Bordes

Para el laboratorio 2 de la materia de visión computacional, hice un script en python en donde le agrego ruido Sal y Pimienta, para luego quitarselo por medio de un filtro sacando la mediana de los pixeles vecinos, y saco los bordes de una imagen sacando la diferencia, normalizando y binarizando, expongo los resultados.

Agregar y eliminar Sal-Pimienta. 

Con intensidad de 0.2 y una polarización de 0.5



Original

Sal pimienta

Restaurado


Con intensidad de 0.08 y una polarización de 0.9



Original

Sal Pimienta

Restaurado
Con intensidad de 0.01 y una polarización de 0.7


Original

Sal - Pimienta

Restaurada

Procesamiento de Bordes.





Código.

from Tkinter import *
from PIL import Image, ImageTk
from math import ceil
import numpy
import random
def ventana():
root = Tk()
root.title('Lab 2')
frame = Frame()
frame.pack(padx=5,pady=5)
poner_imagen(obtener_original(path_imagen_original))
b1 = Button(text='Original', command = boton_original).pack(in_=frame, side=LEFT)
b2 = Button(text='S&P', command = boton_sp).pack(in_=frame, side=LEFT)
b3 = Button(text='Quitar S&P', command = boton_quitar_sp).pack(in_=frame, side=LEFT)
b4 = Button(text='Bordes', command = boton_bordes).pack(in_=frame, side=LEFT)
b4 = Button(text='Guardar', command = boton_guardar).pack(in_=frame, side=LEFT)
root.mainloop()
def poner_imagen(image):
photo = ImageTk.PhotoImage(image)
global label
label = Label(image=photo)
label.imagen = photo
label.pack()
def cambiar_agrises(path_original):
imagen = Image.open(path_imagen_original).convert("RGB")
pixeles = imagen.load()
x, y = imagen.size
imagen_nueva = Image.new("RGB", (x, y))
colores = []
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
promedio = sum(pixel_color)/3
tupla_promedio = (promedio, promedio, promedio)
colores.append(tupla_promedio)
imagen_nueva.putpixel((a, b), tupla_promedio)
return imagen_nueva
def cambiar_promedio(imagen):
pixeles = imagen.load()
x, y = imagen.size
imagen_nueva_prom = Image.new("RGB", (x, y))
colores = []
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
veces = 5
suma = 0
promedio = 0
try:
pixel_norte = pixeles[a-1,b]
except IndexError:
pixel_norte = (0, 0, 0)
veces = veces - 1
try:
pixel_sur = pixeles[a+1, b]
except IndexError:
pixel_sur = (0, 0, 0)
veces = veces - 1
try:
pixel_este = pixeles[a, b+1]
except IndexError:
pixel_este = (0, 0, 0)
veces = veces - 1
try:
pixel_oeste = pixeles[a, b-1]
except IndexError:
pixel_oeste = (0, 0, 0)
veces = veces - 1
Rojos_suma = pixel_norte[0] + pixel_sur[0] + pixel_este[0] + pixel_oeste[0] + pixel_color[0]
Verdes_suma = pixel_norte[1]+ pixel_sur[1] + pixel_este[1] + pixel_oeste[1] + pixel_color[1]
Azul_suma = pixel_norte[2]+ pixel_sur[2] + pixel_este[2] + pixel_oeste[2] + pixel_color[2]
Rojo_prom = Rojos_suma/veces
Verdes_prom = Verdes_suma/veces
Azul_prom = Azul_suma/veces
tupla_promedio = (Rojo_prom, Verdes_prom, Azul_prom)
colores.append(tupla_promedio)
imagen_nueva_prom.putpixel((a, b), tupla_promedio)
return imagen_nueva_prom
def diferencia(imagen):
pixeles = imagen.load()
x, y = imagen.size
imagen_nueva_prom = Image.new("RGB", (x, y))
colores = []
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
veces = 5
suma = 0
promedio = 0
try:
pixel_norte = pixeles[a-1,b]
except IndexError:
pixel_norte = (0, 0, 0)
veces = veces - 1
try:
pixel_sur = pixeles[a+1, b]
except IndexError:
pixel_sur = (0, 0, 0)
veces =veces - 1
try:
pixel_este = pixeles[a, b+1]
except IndexError:
pixel_este = (0, 0, 0)
veces =veces - 1
try:
pixel_oeste = pixeles[a, b-1]
except IndexError:
pixel_oeste = (0, 0, 0)
veces =veces - 1
Rojos_suma = pixel_norte[0] + pixel_sur[0] + pixel_este[0] + pixel_oeste[0] + pixel_color[0]
Verdes_suma = pixel_norte[1]+ pixel_sur[1] + pixel_este[1] + pixel_oeste[1] + pixel_color[1]
Azul_suma = pixel_norte[2]+ pixel_sur[2] + pixel_este[2] + pixel_oeste[2] + pixel_color[2]
Rojo_prom = Rojos_suma/veces
Verde_prom = Verdes_suma/veces
Azul_prom = Azul_suma/veces
Rojo_dif = pixel_color[0] - Rojo_prom
Verde_dif = pixel_color[1] - Verde_prom
Azul_dif = pixel_color[2] - Azul_prom
tupla_promedio = (Rojo_dif, Verde_dif, Azul_dif)
colores.append(tupla_promedio)
imagen_nueva_prom.putpixel((a, b), tupla_promedio)
return imagen_nueva_prom
def normalizacion(imagen):
pixeles = imagen.load()
x, y = imagen.size
min = 0
max = 0
imagen_nueva = Image.new("RGB", (x, y))
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
max_ant = max
max_new = pixel_color[0]
min_ant = min
min_new = pixel_color[0]
if (max_new >= max_ant):
max = max_new
elif (min_new <= min_ant):
min = min_new
elif (min == 0 and max == 255):
break
print min
print max
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
nuevo_pixel = ( float(pixel_color[0]) - float(min) )*( float(255) / (float(max) - float(min)) )
nuevo_pixel = int(ceil(nuevo_pixel))
tupla_promedio = (nuevo_pixel, nuevo_pixel, nuevo_pixel)
imagen_nueva.putpixel((a, b), tupla_promedio)
return imagen_nueva
def cambiar_umbral(imagen, umbral_valor):
pixeles = imagen.load()
x, y = imagen.size
imagen_nueva = Image.new("RGB", (x, y))
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
valor_canal = float(pixel_color[0])
color_nor = valor_canal/255.0
if(color_nor > umbral_valor):
poner_pixel = 255
else:
poner_pixel = 0
tupla_pixel = (poner_pixel, poner_pixel, poner_pixel)
imagen_nueva.putpixel((a, b), tupla_pixel)
return imagen_nueva
def cambiar_SP(imagen, inten, pola):
#aleatoriamente agrega ruido
pixeles = imagen.load()
x, y = imagen.size
imagen_nueva = Image.new("RGB", (x, y))
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
valor_canal = float(pixel_color[0])
color_nor = valor_canal/255.0
if(inten > random.random()):
poner_pixel = random.choice([int(ceil(255.0 * pola)), 0])
else:
poner_pixel = pixel_color[0]
tupla_pixel = (poner_pixel, poner_pixel, poner_pixel)
imagen_nueva.putpixel((a, b), tupla_pixel)
return imagen_nueva
def quitar_SP(imagen):
#Saco la mediana de los pixeles vecinos para eliminar
pixeles = imagen.load()
x, y = imagen.size
imagen_nueva_prom = Image.new("RGB", (x, y))
for a in range(x):
for b in range(y):
pixel_color = pixeles[a, b]
veces = 4
suma = 0
promedio = 0
try:
pixel_norte = pixeles[a-1,b]
except IndexError:
pixel_norte = (0, 0, 0)
veces = veces - 1
try:
pixel_sur = pixeles[a+1, b]
except IndexError:
pixel_sur = (0, 0, 0)
veces = veces - 1
try:
pixel_este = pixeles[a, b+1]
except IndexError:
pixel_este = (0, 0, 0)
veces = veces - 1
try:
pixel_oeste = pixeles[a, b-1]
except IndexError:
pixel_oeste = (0, 0, 0)
veces = veces - 1
arreglo = [pixel_norte[0], pixel_sur[0], pixel_este[0], pixel_oeste[0]]
arreglo.sort()
resultado = int(ceil(mediana(arreglo)))
tupla_promedio = (resultado, resultado, resultado)
imagen_nueva_prom.putpixel((a, b), tupla_promedio)
return imagen_nueva_prom
def mediana(arreglo):
if len(arreglo) % 2 == 1:
return arreglo[(len(arreglo)+1)/2-1]
else:
izq = arreglo[len(arreglo)/2-1]
der = arreglo[len(arreglo)/2]
return (float(izq + izq)) / 2.0
def obtener_original(path_imagen_original):
imagen = Image.open(path_imagen_original)
return imagen
def boton_bordes():
label.destroy()
#Pongo a grises
imagen_grises = cambiar_agrises(path_imagen_original)
imagen_grises.save("paso_1.jpg")
#Agrego diferencia
imagen_prom = diferencia(imagen_grises.convert("RGB"))
imagen_prom.save("paso_2.jpg")
#Agrego normalizacion
imagen_nor = normalizacion(imagen_prom)
imagen_nor.save("paso_3.jpg")
#Agrego umbral para binarizar
umbral_valor = 0.1
imagen_bin = cambiar_umbral(imagen_nor.convert("RGB"), umbral_valor)
imagen_bin.save("paso_4.jpg")
#Pongo promedio
imagen_prom = cambiar_promedio(imagen_bin.convert("RGB"))
imagen_prom.save("paso_5.jpg")
poner_imagen(imagen_prom)
def boton_original():
label.destroy()
global imagen_original
imagen_original = obtener_original(path_imagen_original)
poner_imagen(imagen_original)
def boton_sp():
label.destroy()
global imagen_original
imagen_original = cambiar_SP(imagen_original.convert("RGB"), 0.01, 0.7) #inten, pola
poner_imagen(imagen_original)
def boton_quitar_sp():
label.destroy()
global imagen_original
imagen_original = quitar_SP(imagen_original.convert("RGB"))
poner_imagen(imagen_original)
def boton_guardar():
global imagen_original
imagen_original.save("Guardada.jpg")
path_imagen_original = "woody.jpg"
imagen_original = obtener_original(path_imagen_original)
ventana()
view raw sal_pimienta.py hosted with ❤ by GitHub


Esto sería todo para el laboratorio 2, si tienen alguna duda acerca del código, pueden comentar.


1 comentario: