Documentos de Académico
Documentos de Profesional
Documentos de Cultura
# OpenCV usa por defecto el espacio de color BGR, hay que cambiarlo a RGB
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
import cv2 as cv
from matplotlib import pyplot as plt
# Mostramos el histograma
plt.show()
plt.imshow(img, cmap="gray")
plt.show()
plt.imshow(equ, cmap="gray")
plt.show()
plt.imshow(cl1, cmap="gray")
plt.show()
Ejemplo de detectores de bordes
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from skimage import data
from skimage import img_as_ubyte
CELDA 2
# Ejecutamos detección de bordes con Sobel, en los ejes x e y, con un kernel de 5 x 5
sobelxy = cv.Sobel(src=img_blur, ddepth=cv.CV_8U, dx=1, dy=1, ksize=5)
CELDA 3
# Deteccion de bordes laplaciano con un kernel de 5 x 5
laplacian = cv.Laplacian(src=img_blur, ddepth=cv.CV_8U, ksize=5)
CELDA 5 (CONTORNOS)
# Con esta funcion dibujamos los contornos indicando color, grosor y tipo de linea
cv.drawContours(image=img_copy, contours=contours, contourIdx=-1, color=(0, 255, 0),
thickness=2, lineType=cv.LINE_AA)
# Mostramos el resultado
plt.imshow(img_copy)
plt.show()
# Repetimos mismo procedimiento pero en este caso empleamos una aproximación simple
contours, _ = cv.findContours(image=edges, mode=cv.RETR_TREE,
method=cv.CHAIN_APPROX_SIMPLE)
img_copy = img.copy()
plt.imshow(img_copy)
plt.show()
Detección de rectas y círculos
import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np
import math
# Es esencial cambiar esta ruta por la ubicacion de la imagen que hemos descargado
img_path = "C:/Users/User/Images/sudoku.png"
img = cv.imread(img_path, cv.IMREAD_GRAYSCALE)
plt.imshow(img, cmap='gray')
plt.show()
CELDA 2
# Ejecutamos Canny sobre nuestra imagen, y la mostramos por pantalla
canny = cv.Canny(img, 50, 200, None, 3)
plt.imshow(canny, cmap='gray')
plt.show()
CELDA 3
''' Ejecutamos la función de HoughLines. Esta función devuelve una lista de lineas en
forma de ecuaciones paramétricas '''
lines = cv.HoughLines(canny, 1, np.pi / 180, 145)
''' Convertimos la imagen original (en escala de grises) a una imagen a color para
poder dibujar las lineas encontradas en un color que resalte, en lugar de en negro
'''
img_rgb = cv.cvtColor(img, cv.COLOR_GRAY2BGR)
''' Iteramos a lo largo de todas las lineas encontradas para poder dibujarlas en la
imagen. No es necesario comprender estos calculos. '''
for i in range(0, len(lines)):
''' calculamos los valores a y b, que sirven para calcular los puntos que definen
la ecuacion de nuestra recta '''
a = math.cos(theta)
b = math.sin(theta)
''' Calculamos dos puntos cualesquiera por los que pasa nuestra recta segun su
ecuacion '''
''' Usamos la funcion cv.line() para dibujar la recta que pasa por pt1 y pt2
sobre nuestra imagen a color en violeta y con grosor 3 '''
cv.line(img_rgb, pt1, pt2, (255, 0, 255), 3, cv.LINE_AA)
''' Convertimos la imagen de grises en color para poder dibujar los circulos
encontrados en verde brillante '''
cimg = cv.cvtColor(img, cv.COLOR_GRAY2BGR)
import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np
# Lanzamos busqueda de esquinas para las mejores 25 al menos a 10 pixeles cada una
corners = cv.goodFeaturesToTrack(img, 25, 0.01, 10)
corners = np.int0(corners)
import cv2 as cv
from matplotlib import pyplot as plt
''' Dibujamos las features sobre nuestra imagen, de color azul, y la mostramos por
pantalla '''
img2 = cv.drawKeypoints(img, features, None, color=(0,255,255))
plt.imshow(img2)
plt.show()
Feature matching
import cv2 as cv
import matplotlib.pyplot as plt
# Inicializamos un objeto de tipo ORB para extraer las features de ambas imagenes
orb = cv.ORB_create()
''' Mostramos el resultado por pantalla aumentando el tamaño por defecto de plt para
poder ver todos los datos relevantes '''
plt.rcParams['figure.figsize'] = [12, 6]
plt.imshow(img3)
plt.show()
Reconocimiento de objetos con ORB
''' Convertimos las caracteristicas encontradas en puntos planos para poder estimar
su homografia '''
src_pts = np.float32([ kp1[m.queryIdx].pt for m in matches[:12] ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in matches[:12] ]).reshape(-1,1,2)
# Buscamos la homografia entre los dos conjuntos de puntos mediante el metodo RANSAC
M, mask = cv.findHomography(src_pts, dst_pts, cv.RANSAC,5.0)
# Obtenemos el tamaño de la imagen, para saber el tamaño del objeto que buscamos
h,w = img1.shape
''' Dibujamos las lineas que unen los puntos resultantes de las coordenadas del libro
una vez aplicada la perspectiva con la funcion polylines de OpenCV '''
img2 = cv.polylines(img2,[np.int32(dst)],True,255,3, cv.LINE_AA)
CELDA 2
plt.hist(img.ravel(), bins=256, range=[0, 256])
plt.show()
CELDA 3
# Detección de bordes Canny
edges = cv.Canny(image=img, threshold1=100, threshold2=200)
Clasificación de objetos
# TensorFlow y tf.keras
import tensorflow as tf
from tensorflow import keras
CELDA 3
plt.figure(figsize=(10,10))
for i in range(10):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap='gray')
plt.xlabel(class_names[train_labels[i]])
plt.show()
CELDA 4
'''
Inicializamos un objeto de tipo Sequential de keras, que nos permite
implementar de forma muy sencilla las distintas capas de una CNN.
'''
model = keras.Sequential()
model.add(keras.layers.Flatten())
# Por ultimo, añadimos una Fully Connected de 10 neuronas, una por cada clase
model.add(keras.layers.Dense(10, activation='softmax'))
'''
Compilamos el modelo con los parametros de calculo de error y optimizador
Usaremos adam, que es una implementacion de Stochastic Gradient Descent
'''
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
CELDA 5
CELDA 6
CELDA 7
# Convertimos la imagen a un tensor para que pueda ser procesada por Keras
img = (np.expand_dims(img,0))
import os
import pathlib
import matplotlib
import matplotlib.pyplot as plt
import scipy.misc
import numpy as np
from six import BytesIO
from PIL import Image, ImageDraw, ImageFont
from six.moves.urllib.request import urlopen
import tensorflow as tf
import tensorflow_hub as hub
CELDA 2
print('loading model...')
hub_model = hub.load(model_url)
print('model loaded!')
CELDA 3
CELDA 5
CELDA 6
%%bash
sudo apt install -y protobuf-compiler
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
cp object_detection/packages/tf2/setup.py .
python -m pip install .
CELDA 7
PATH_TO_LABELS = './models/research/object_detection/data/
mscoco_label_map.pbtxt'
category_index = label_map_util.create_category_index_from_labelmap(PATH_T
O_LABELS, use_display_name=True)
label_id_offset = 0
image_np_with_detections = image_np.copy()
viz_utils.visualize_boxes_and_labels_on_image_array(
image_np_with_detections[0],
result['detection_boxes'][0],
(result['detection_classes'][0] + label_id_offset).astype(int),
result['detection_scores'][0],
category_index,
use_normalized_coordinates=True,
max_boxes_to_draw=200,
min_score_thresh=.30,
agnostic_mode=False)
plt.figure(figsize=(15,20))
plt.imshow(image_np_with_detections[0])
plt.show()
Ejemplo GAN
import torch
import urllib
from PIL import Image
from torchvision import transforms
import matplotlib.pyplot as plt
CELDA 2
input_tensor = preprocess(input_image)
input_batch = input_tensor.unsqueeze(0)
CELDA 4
''' Creamos una paleta de color para que cada clase pueda ser coloreada distit
a en el output '''
palette = torch.tensor([2 ** 25 - 1, 2 ** 15 - 1, 2 ** 21 - 1])
colors = torch.as_tensor([i for i in range(21)])[:, None] * palette
colors = (colors % 255).numpy().astype("uint8")