Operaciones básicas
Todo el código de ejemplo se encuentra en Google Colab para su ejecución directa. Si no puedes ejecutar OpenCV localmente, puedes usar Google Colab junto con matplotlib para visualizar imágenes.
Objetivo
En esta sección aprenderás operaciones fundamentales sobre imágenes en OpenCV:
- Acceder a las propiedades de una imagen.
- Definir una región de interés (ROI).
- Dividir y fusionar canales de color.
- Agregar bordes a una imagen (padding).
Acceder a propiedades de la imagen
En OpenCV, cada imagen se representa como un array NumPy. Podemos consultar información como sus dimensiones, número de píxeles y tipo de datos.
- Python (PC con entorno gráfico)
- Python (Google Colab)
import cv2 as cv
# Cargar imagen
img = cv.imread('imagen.jpg')
print("============RGB============")
print("Dimensiones:", img.shape)
print("Número de píxeles:", img.size)
print("Tipo de datos:", img.dtype)
print(img[:1])
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
print("============GRIS============")
print("Dimensiones:", img_gray.shape)
print("Número de píxeles:", img_gray.size)
print("Tipo de datos:", img_gray.dtype)
print(img_gray)
import cv2 as cv
import matplotlib.pyplot as plt
from google.colab import files
# Subir archivo desde tu PC
uploaded = files.upload()
filename = list(uploaded.keys())[0]
# Cargar imagen
img = cv.imread(filename)
print("============RGB============")
print("Dimensiones:", img.shape)
print("Número de píxeles:", img.size)
print("Tipo de datos:", img.dtype)
print(img[:1])
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
print("============GRIS============")
print("Dimensiones:", img_gray.shape)
print("Número de píxeles:", img_gray.size)
print("Tipo de datos:", img_gray.dtype)
print(img_gray)
Región de Interés (ROI)
Una ROI (Region of Interest) es un área específica de la imagen que queremos aislar para procesar o analizar. Se define seleccionando un rango de filas y columnas.
- Python (PC con entorno gráfico)
- Python (Google Colab)
import cv2 as cv
# Cargar imagen
img = cv.imread('imagen.jpg')
# Seleccionar un área (y1:y2, x1:x2)
roi = img[70:250, 320:510]
cv.imshow("Original", img)
cv.imshow("ROI", roi)
cv.waitKey(0)
cv.destroyAllWindows()
import cv2 as cv
import matplotlib.pyplot as plt
from google.colab import files
# Subir archivo desde tu PC
uploaded = files.upload()
filename = list(uploaded.keys())[0]
# Cargar imagen
img = cv.imread(filename)
img_copy = img.copy()
# Seleccionar un área (y1:y2, x1:x2)
roi = img_copy[70:250, 320:510]
fig, axes = plt.subplots(1, 2, figsize=(20, 6))
# Imagen Original
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("Imagen Original")
axes[0].axis("off")
# Imagen con ROI
axes[1].imshow(cv.cvtColor(roi, cv.COLOR_BGR2RGB))
axes[1].set_title("Imagen ROI")
axes[1].axis("off")
plt.show()
División y fusión de canales
Las imágenes en color están compuestas por 3 canales: Azul, Verde y Rojo (BGR). Podemos separar estos canales para analizarlos individualmente o volver a unirlos.
- Python (PC con entorno gráfico)
- Python (Google Colab)
import cv2 as cv
import numpy as np
# Cargar imagen
img = cv.imread('imagen.jpg')
# Dividir en canales
b, g, r = cv.split(img)
zeros = np.zeros(img.shape[:2], dtype="uint8")
cv.imshow("Canal Azul", cv.merge([b, zeros, zeros]))
cv.imshow("Canal Verde", cv.merge([zeros, g, zeros]))
cv.imshow("Canal Rojo", cv.merge([zeros, zeros, r]))
# Fusionar canales nuevamente
merged = cv.merge([b, g, r])
cv.imshow("Imagen fusionada", merged)
cv.waitKey(0)
cv.destroyAllWindows()
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from google.colab import files
# Subir archivo desde tu PC
uploaded = files.upload()
filename = list(uploaded.keys())[0]
# Cargar imagen
img = cv.imread(filename)
# Dividir en canales
b, g, r = cv.split(img)
# Crear array con ceros
zeros = np.zeros(img.shape[:2], dtype="uint8")
# Azul a la izquierda, Verde al medio, Rojo a la derecha
fig, axes = plt.subplots(1, 4, figsize=(18, 6))
# Imagen Original
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("Imagen Original")
axes[0].axis("off")
# Imagen Roja
axes[1].imshow(cv.merge([r, zeros, zeros]))
axes[1].set_title("Imagen Roja")
axes[1].axis("off")
# Imagen Verde
axes[2].imshow(cv.merge([zeros, g, zeros]))
axes[2].set_title("Imagen Verde")
axes[2].axis("off")
# Imagen Azul
axes[3].imshow(cv.merge([zeros, zeros, b]))
axes[3].set_title("Imagen Azul")
axes[3].axis("off")
plt.show()
Creación de bordes (padding)
A veces es útil ampliar una imagen agregando bordes alrededor de ella. Esto se logra con cv.copyMakeBorder()
, que permite diferentes tipos de relleno.
- Python (PC con entorno gráfico)
- Python (PC con entorno gráfico)
import cv2 as cv
# Cargar imagen
img = cv.imread("imagen.jpg")
img_copy = img.copy()
BLUE = [255, 0, 0]
borders = cv.copyMakeBorder(img_copy, 70, 70, 70, 70,
cv.BORDER_CONSTANT, value=BLUE)
img_copy = cv.cvtColor(borders, cv.COLOR_BGR2RGB)
cv.imshow("Imagen original", img)
cv.imshow("Imagen con borde", cv.cvtColor(img_copy, cv.COLOR_BGR2RGB))
cv.waitKey(0)
cv.destroyAllWindows()
import cv2 as cv
import matplotlib.pyplot as plt
from google.colab import files
# Subir archivo desde tu PC
uploaded = files.upload()
filename = list(uploaded.keys())[0]
# Cargar imagen
img = cv.imread(filename)
BLUE = [255, 0, 0]
borders = cv.copyMakeBorder(img, 70, 70, 70, 70,
cv.BORDER_CONSTANT, value=BLUE)
# Imagen original a la izquierda, Imagen con borde a la derecha
fig, axes = plt.subplots(1, 2, figsize=(18, 6))
# Imagen Original
axes[0].imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))
axes[0].set_title("Imagen Original")
axes[0].axis("off")
# Imagen con borde
axes[1].imshow(cv.cvtColor(borders, cv.COLOR_BGR2RGB))
axes[1].set_title("Imagen con borde")
axes[1].axis("off")
plt.show()
Tipos de bordes disponibles:
cv.BORDER_CONSTANT
: Relleno con un color fijo.cv.BORDER_REFLECT
: Refleja los bordes de la imagen.cv.BORDER_REPLICATE
: Copia el borde más cercano.cv.BORDER_WRAP
: Envuelve la imagen.