Saltar al contenido principal

Operaciones básicas

info

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.

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)

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.

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

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.

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

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.

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

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.