OpenCV: Manipulación imágenes
Aprende a redimensionar, rotar y combinar imágenes usando OpenCV y domina los primeros pasos en el procesamiento de imágenes.
Aprende OpenCV GRATIS y certifícateLa manipulación de imágenes en OpenCV abarca diversas operaciones que permiten ajustar, transformar y combinar imágenes de acuerdo con los requerimientos de un proyecto. Al trabajar con OpenCV, se accede a funciones eficaces para controlar el color, la geometría y la intensidad de cada píxel, tanto en entornos de investigación como de desarrollo. A continuación, se presentan metodologías y ejemplos de código que ilustran estas técnicas, siempre considerando las buenas prácticas recomendadas a la fecha.
Para comenzar, es frecuente aplicar ajustes de brillo y contraste en imágenes cuyos niveles de iluminación o saturación de color no son óptimos. En OpenCV, la función cv2.convertScaleAbs()
facilita este proceso. Al sumar un valor (beta) y multiplicar por un factor (alpha), se determina la variación de brillo y contraste de forma directa. Un fragmento de código típico sería:
import cv2
imagen = cv2.imread("ruta/de/tu_imagen.jpg")
alpha = 1.5 # factor de contraste
beta = 20 # incremento de brillo
resultado = cv2.convertScaleAbs(imagen, alpha=alpha, beta=beta)
cv2.imwrite("imagen_brillo_contraste.jpg", resultado)
En esta muestra, OpenCV ejecuta el escalado y permite refinar rápidamente la apariencia de la imagen sin perder la referencia de color. El ajuste de estos parámetros suele hacerse de manera iterativa hasta que el resultado sea satisfactorio.
Cuando se habla de operaciones aritméticas entre imágenes, OpenCV ofrece funciones como cv2.add()
, cv2.subtract()
o incluso la posibilidad de sumar con máscaras para realizar fusiones selectivas. Estas técnicas permiten, por ejemplo, superponer un logotipo sobre una imagen principal. Con la ayuda de enmascaramientos, puede definirse qué región se verá afectada por la operación. Un ejemplo simplificado:
import cv2
import numpy as np
fondo = cv2.imread("ruta/de/fondo.jpg")
logo = cv2.imread("ruta/de/logo.png")
# Crear una máscara a partir del canal alfa si la imagen lo tiene
mask = logo[:,:,3]
logo_rgb = logo[:,:,:3]
# Zona del fondo donde se pegará el logo
x, y, w, h = 50, 50, logo.shape[1], logo.shape[0]
region = fondo[y:y+h, x:x+w]
# Combinar regiones usando la máscara
mask_inv = cv2.bitwise_not(mask)
fondo_region = cv2.bitwise_and(region, region, mask=mask_inv)
logo_region = cv2.bitwise_and(logo_rgb, logo_rgb, mask=mask)
fusion = cv2.add(fondo_region, logo_region)
fondo[y:y+h, x:x+w] = fusion
cv2.imwrite("imagen_con_logo.jpg", fondo)
Aquí, la máscara delimita la zona exacta donde se sobrepone el logo, y las funciones de OpenCV combinan los píxeles de manera selectiva. Este flujo es esencial para procesar marcas de agua o composiciones de gráficos en tiempo real.
Otro aspecto importante de la manipulación de imágenes es la transformación geométrica, con operaciones de recorte, escalado y rotación. Para cambiar el tamaño de una imagen, se emplea cv2.resize()
, que acepta dimensiones específicas o factores de escalado. Si se busca rotar la imagen, se puede utilizar cv2.getRotationMatrix2D()
y cv2.warpAffine()
, de modo que OpenCV aplique la matriz de rotación resultante:
import cv2
imagen = cv2.imread("ruta/de/tu_imagen.jpg")
# Redimensionar
imagen_resized = cv2.resize(imagen, (400, 200))
# Rotar 90 grados
centro = (imagen.shape[1] // 2, imagen.shape[0] // 2)
mat_rotacion = cv2.getRotationMatrix2D(centro, 90, 1.0)
imagen_rotada = cv2.warpAffine(imagen, mat_rotacion, (imagen.shape[1], imagen.shape[0]))
cv2.imwrite("imagen_redimensionada.jpg", imagen_resized)
cv2.imwrite("imagen_rotada.jpg", imagen_rotada)
Estas transformaciones ayudan a estandarizar los tamaños o la orientación de las imágenes antes de su posterior análisis con OpenCV. Si se requiere simplemente voltear una imagen (flip), se emplea cv2.flip(imagen, 0)
para invertir en el eje vertical o cv2.flip(imagen, 1)
en el horizontal.
La conversión de espacios de color también forma parte de la manipulación. OpenCV maneja múltiples formatos, como BGR, RGB, HSV o LAB, y permite transiciones rápidas con cv2.cvtColor()
. Un ejemplo común es convertir a escala de grises:
import cv2
imagen = cv2.imread("ruta/de/tu_imagen.jpg")
gris = cv2.cvtColor(imagen, cv2.COLOR_BGR2GRAY)
cv2.imwrite("imagen_gris.jpg", gris)
En este caso, OpenCV reordena los canales y reduce la información de color para trabajar únicamente con intensidades. Estos cambios de espacio de color resultan útiles en algoritmos de segmentación, detección de características y reconocimiento facial.
Por otro lado, la ecualización de histograma constituye una forma de realzar el contraste de manera automática. Con cv2.equalizeHist()
, se redistribuyen los niveles de gris para que la imagen ocupe un rango más amplio de intensidades. Este procedimiento es muy empleado cuando se requiere compensar condiciones de iluminación variables:
import cv2
imagen = cv2.imread("ruta/de/tu_imagen.jpg", cv2.IMREAD_GRAYSCALE)
ecualizada = cv2.equalizeHist(imagen)
cv2.imwrite("imagen_ecualizada.jpg", ecualizada)
El resultado de la ecualización puede favorecer la detección de bordes y detalles en imágenes que presenten áreas oscuras o sobreexpuestas. OpenCV facilita su uso tanto en la escala de grises como en canales de color, separando primero cada canal y luego ecualizándolo por separado cuando la aplicación lo requiera.
En ciertas ocasiones, resulta necesario remapear la imagen, reubicando píxeles de acuerdo con un campo de coordenadas específico. OpenCV ofrece la función cv2.remap()
, que con ayuda de dos mapas (X e Y) indica la ubicación de cada píxel de salida. Este planteamiento se utiliza en correcciones de distorsión o en efectos de deformación, siempre conservando la capacidad de OpenCV para administrar el mapeo a gran escala.
La suma de todas estas técnicas da lugar a un amplio abanico de posibilidades para la manipulación de imágenes en OpenCV, donde se destacan la facilidad de uso y el rendimiento. Al dominar el brillo, contraste, transformaciones geométricas, fusiones de imágenes y conversiones de color, es posible abordar tareas complejas como la preparación de datos para modelos de reconocimiento o el realce de información visual en flujos de procesamiento industrial o científico.
Lecciones de este módulo de OpenCV
Lecciones de programación del módulo Manipulación imágenes del curso de OpenCV.
Ejercicios de programación en este módulo de OpenCV
Evalúa tus conocimientos en Manipulación imágenes con ejercicios de programación Manipulación imágenes de tipo Test, Puzzle, Código y Proyecto con VSCode.