Lab 9
Lab 9
Lab 9
Laboratorio #9
Procesamiento Digital de Imágenes – Dr. Boris Vintimilla
20/01/2020
import numpy
import cv2 as cv
import random as rd
#Código para ruido tipo sal, añade puntos blancos al azar en la imagen.
def salt(image):
h,w,ch = image.shape
par=round(w*h*0.01)
for x in range(par):
a=rd.randint(0,h-1)
b=rd.randint(0,w-1)
image[a,b]=(255,255,255)
return 0
#Código para ruido tipo primienta, añade puntos negros al azar en la imagen.
def pepper(image):
h,w,ch = image.shape
par=round(w*h*0.01)
for x in range(par):
a=rd.randint(0,h-1)
b=rd.randint(0,w-1)
image[a,b]=(0,0,0)
return 0
#Código para ruido tipo sal y pimienta, añade puntos blancos y negros al azar
en la imagen.
def saltnpepper(image):
salt(image)
pepper(image)
return 0
#Código para ruido tipo uniforme.
def uniform(image):
h,w,ch = image.shape
a=88
b=169
pixel=h*w
per = float(1)/float(b-a)
V = [0]*256
for x in range(256):
if(x>=a and x<=b):
fact = round(pixel*per)
V.insert(x,fact+1)
for x in range(w-1):
for y in range(h-1):
if ((x+y)%2==0):
while True:
valor = rd.randint(0,255)
if(V[valor]<=0):
break
image[y,x]=image[y,x]+valor
return 0
#Menú principal
def get_function():
print("\nRuido:\n")
print("1. Sal")
print("2. Pimienta")
print("3. Sal Pimienta")
print("4. Uniforme")
print("5. Gaussiano")
print("Cualquier otro número - Salir")
while True:
option=input("\nIngrese el número del ruido que desea aplicar:\n")
if(option.isdigit()):
return int(option)
#Código para ruido tipo gaussiano, usando numpy, media de 127 y varianza de
100
def gaussiano(frame):
mean = 127
var = 100
sigma = var ** 0.5
gaussian = numpy.random.normal(mean, sigma, frame.shape[0:2])
if len(frame.shape) == 2:
noisy_image = frame + gaussian
else:
noisy_image[:, :, 0] = frame[:, :, 0] + gaussian
noisy_image[:, :, 1] = frame[:, :, 1] + gaussian
noisy_image[:, :, 2] = frame[:, :, 2] + gaussian
opt = get_function()
if (opt>0 and opt<6):
elif (opt==2):
#Aplico el ruido tipo pimienta
pepper(frame)
#Aplico la mediana 3x3 para eliminar los valores alejados de la mediana
median = cv.medianBlur(frame, 5)
#Corrijo el contraste con clahe y muestro el resultado concatenando las
imágenes
compare = numpy.concatenate((frame,
corregir_contraste(median)), axis=1)
cv.imshow('Pimienta', compare)
else:
#Aplico ruido gaussiano
noise= gaussiano(frame)
#Corrijo con filtro medio 9x9
blur = cv.blur(noise,(9,9))
#Aplico una mejora en el contraste, conservando el brillo con Laplace
kernel = numpy.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]],
dtype=numpy.float32)
im = cv.filter2D(blur, -1, kernel)
#Realzo el contraste cambiando la escala alpha y beta
dst=cv.convertScaleAbs(im, alpha=1.0, beta=15)
#Muestro el resultado y comparo
compare = numpy.concatenate((noise, dst), axis=1)
# Q para salir
if cv.waitKey(25) & 0xFF == ord('q'):
break
# Rompo el ciclo
else:
break