Lab 9

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

Daniela Carolina Montenegro Pozo

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])

noisy_image = numpy.zeros(frame.shape, numpy.float32)

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

cv.normalize(noisy_image, noisy_image, 0, 255, cv.NORM_MINMAX, dtype=-1)


noisy_image = noisy_image.astype(numpy.uint8)
return noisy_image
#Corrección de contraste con equalización de histograma concontraste limitado
def corregir_contraste(img):
#(Contrast Limited Adaptive Histogram Equalization)
clahe = cv.createCLAHE(clipLimit=1., tileGridSize=(8, 8))
#LIGHTNESS, y componentes de color AB
lab = cv.cvtColor(img, cv.COLOR_BGR2LAB) # convierte de BGR al espacio
de color LAB
l, a, b = cv.split(lab) # lo separo en sus canals para corregir solo el
lightness de la imagen
l2 = clahe.apply(l) # aplico CLAHE a la lightness
#l2=cv.equalizeHist(l)
lab = cv.merge((l2, a, b)) # uno los canales
img2 = cv.cvtColor(lab, cv.COLOR_LAB2BGR) # la convierto a bgr de nuevo
return img2

opt = get_function()
if (opt>0 and opt<6):

cap = cv.VideoCapture("cats.mp4")#0 para videocamara

# revisar si la cámara se ha abierto


if (cap.isOpened() == False):
print("Error opening video stream or file")

# leer cuando el video haya cargado


while (cap.isOpened()):
# capturar cuadro por cuadro
ret, frame = cap.read()
if ret == True:
#Nota: El filtro mediano funciona muy bien para corregir el ruido sal,
pimienta y sal y pimienta también.
if (opt==1):

#Aplico el ruido tipo sal


salt(frame)
#Aplico la mediana 3x3 para eliminar los valores alejados de la mediana
median = cv.medianBlur(frame, 3)
#Muestro el resultado concatenando las imagenes
compare = numpy.concatenate((frame, median), axis=1)
cv.imshow('Sal', compare)

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)

elif (opt == 3):


#Aplico el ruido tipo sal y pimienta
saltnpepper(frame)
#Aplico la mediana 3x3 para eliminar los valores alejados de la mediana
median = cv.medianBlur(frame, 3)
#Corrijo el contraste con clahe y muestro el resultado concatenando las
imágenes
compare = numpy.concatenate((frame,
corregir_contraste(median)), axis=1)
cv.imshow('Sal & Pimienta', compare)
elif (opt == 4):
original = frame.copy()
#Aplico el ruido uniforme
uniform(frame)
#Corrijo con mediana 5x5
dst = cv.medianBlur(frame, 5)
#Elimino el ruido restante aplicando de nuevo la mediana 5x5
dst = cv.medianBlur(dst, 5)
#Realzo el contraste y ,maestro la imagen
compare = numpy.concatenate((frame, corregir_contraste(
Dst)), axis=1)
cv.imshow("Uniforme",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

# Release cuando termine


cap.release()

# Cerrar todos los frames


cv.destroyAllWindows()
else:
exit(0)

También podría gustarte