HOWTO · Python
Girar una imagen con OpenCV
Este artículo le enseña a rotar una imagen usando las funciones de rotación() y warpAffine() de OpenCV.
En esta página
En Python, OpenCV ofrece dos formas de girar una imagen. Usa cv2.rotate() para un giro en ángulo recto; usa cv2.warpAffine() con cv2.getRotationMatrix2D() para otros ángulos o cuando necesites controlar el centro y la escala de la transformación. Ambas funciones operan sobre matrices de imagen. Los ejemplos crean matrices pequeñas en el propio código, así que no dependen de un archivo de imagen externo. Instala OpenCV y NumPy para ejecutar los ejemplos de OpenCV.
Usar OpenCV rotate() para giros de 90°, 180° y 270°
cv2.rotate() recibe una matriz de imagen y una de tres constantes de orientación. Usa cv2.ROTATE_90_CLOCKWISE para un cuarto de vuelta en sentido horario, cv2.ROTATE_90_COUNTERCLOCKWISE para un cuarto de vuelta en sentido antihorario (la misma orientación que un giro de 270° en sentido horario) o cv2.ROTATE_180 para media vuelta. Un cuarto de vuelta intercambia el ancho y el alto; media vuelta los mantiene. Este ejemplo aplica las tres opciones a una matriz de imagen pequeña e imprime la forma del resultado de cada una. Si OpenCV o NumPy no están instalados, imprime un recordatorio para configurarlos.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
try:
import cv2
import numpy as np
except ImportError:
print("Install opencv-python and numpy to run this example.")
else:
image = np.zeros((2, 3, 3), dtype=np.uint8) # 2 rows, 3 columns, 3 color channels
rotations = {
"clockwise": cv2.ROTATE_90_CLOCKWISE,
"counterclockwise": cv2.ROTATE_90_COUNTERCLOCKWISE,
"half-turn": cv2.ROTATE_180,
}
for name, orientation in rotations.items():
rotated = cv2.rotate(image, orientation)
print(f"{name}: {rotated.shape[1]}x{rotated.shape[0]}")
El siguiente ejemplo con listas ilustra por separado cómo se reorganizan las coordenadas. Ejecuta este ejemplo:
image = [["A", "B", "C"], ["D", "E", "F"]]
rotated = [list(row) for row in zip(*image[::-1])]
print(f"original: {len(image[0])}x{len(image)}")
print(f"rotated: {len(rotated[0])}x{len(rotated)}")
print("rows:", rotated)
original: 3x2
rotated: 2x3
rows: [['D', 'A'], ['E', 'B'], ['F', 'C']]
Las celdas etiquetadas permiten ver la dirección del giro y el cambio de dimensiones sin abrir una ventana de visualización; el ejemplo de OpenCV indica las dimensiones como ancho por alto, aunque NumPy almacena la forma de una imagen como alto, ancho y canales. Para trabajar con un archivo, pasa a cv2.rotate() la matriz que devuelve cv2.imread() y comprueba primero que la lectura haya tenido éxito. Usa cv2.rotate() solo para estas orientaciones en ángulo recto; no acepta ángulos arbitrarios.
Usar OpenCV warpAffine() para giros con ángulos arbitrarios
cv2.getRotationMatrix2D(center, angle, scale) devuelve una matriz afín de 2 por 3. center es un punto (x, y), angle se expresa en grados (los valores positivos giran en sentido antihorario según las coordenadas de imagen de OpenCV) y scale multiplica el tamaño de la imagen: 1.0 lo mantiene, un valor inferior a 1.0 lo reduce y uno superior a 1.0 lo amplía. cv2.warpAffine(image, matrix, (width, height)) aplica la matriz sobre un lienzo de destino; el argumento de tamaño se ordena primero como ancho y luego como alto. Este ejemplo gira 30° una imagen de 120 por 80 alrededor de su centro y conserva las dimensiones originales del lienzo, por lo que las esquinas pueden quedar recortadas. Si los paquetes necesarios no están disponibles, imprime un recordatorio para configurarlos.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
try:
import cv2
import numpy as np
except ImportError:
print("Install opencv-python and numpy to run this example.")
else:
height, width = 80, 120
image = np.zeros((height, width, 3), dtype=np.uint8)
center = (width / 2, height / 2)
angle = 30
scale = 1.0
matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(image, matrix, (width, height))
print(f"input canvas: {width}x{height}")
print(f"rotated canvas: {rotated.shape[1]}x{rotated.shape[0]}")
El ejemplo conserva intencionadamente el destino original (width, height), por lo que la salida mantiene las mismas dimensiones y se recortan las esquinas que quedan fuera del lienzo. Para conservar la imagen completa, calcula un destino más grande a partir de los límites de la imagen girada y ajusta la traslación de la matriz para mover el centro transformado al centro del nuevo lienzo; aumentar solo las dimensiones del destino deja la transformación anclada en sus coordenadas originales.
warpAffine() rellena los píxeles del destino que no corresponden a ningún píxel de origen. De forma predeterminada, cv2.BORDER_CONSTANT usa un color de relleno uniforme (negro de manera predeterminada); establece borderValue para elegir otro color. cv2.BORDER_REPLICATE extiende los píxeles más cercanos del borde de origen. cv2.BORDER_TRANSPARENT deja sin cambios los píxeles correspondientes del destino, así que inicialízalo si usas este modo; no reproduce automáticamente el borde de origen. Consulta la referencia de modos de borde de OpenCV para ver los modos disponibles.