HOWTO · Python
OpenCV Faire pivoter l'image
Cet article vous apprend à faire pivoter une image à l'aide des fonctions rotate() et warpAffine() d'OpenCV.
Sur cette page
En Python, OpenCV propose deux méthodes pour faire pivoter une image. Utilisez cv2.rotate() pour une rotation à angle droit ; choisissez cv2.warpAffine() avec cv2.getRotationMatrix2D() pour un autre angle ou pour contrôler le centre et l’échelle de la transformation. Ces deux fonctions traitent des tableaux d’image. Les exemples créent de petits tableaux dans le code et ne dépendent donc d’aucun fichier image externe. Installez OpenCV et NumPy pour exécuter les exemples OpenCV. Les libellés et les résultats affichés par les exemples restent en anglais.
Utiliser OpenCV rotate() pour des rotations de 90°, 180° et 270°
cv2.rotate() prend un tableau d’image et l’une des trois constantes d’orientation. Utilisez cv2.ROTATE_90_CLOCKWISE pour un quart de tour dans le sens horaire, cv2.ROTATE_90_COUNTERCLOCKWISE pour un quart de tour dans le sens antihoraire (soit la même orientation qu’une rotation de 270° dans le sens horaire), ou cv2.ROTATE_180 pour un demi-tour. Un quart de tour échange la largeur et la hauteur ; un demi-tour les conserve. Cet exemple applique les trois rotations à un petit tableau d’image et affiche la forme de chaque résultat. Si OpenCV ou NumPy n’est pas installé, il affiche à la place un rappel sur la configuration.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
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]}")
L’exemple de liste suivant illustre séparément le réarrangement des coordonnées. Exécutez cet exemple :
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']]
Les libellés visibles dans cet exemple restent en anglais. Les cellules étiquetées rendent le sens de rotation et le changement de dimensions visibles sans fenêtre d’affichage ; l’exemple OpenCV indique les dimensions dans l’ordre largeur puis hauteur, tandis que NumPy stocke la forme d’une image dans l’ordre hauteur, largeur et canaux. Pour traiter un fichier, transmettez à cv2.rotate() le tableau renvoyé par cv2.imread() et vérifiez d’abord que la lecture a réussi. Utilisez cv2.rotate() uniquement pour ces orientations à angle droit : cette fonction n’accepte pas d’angle arbitraire.
Utiliser OpenCV warpAffine() pour des rotations d’angle arbitraire
cv2.getRotationMatrix2D(center, angle, scale) renvoie une matrice affine de 2 × 3. center est un point (x, y), angle s’exprime en degrés (dans le repère d’image d’OpenCV, les valeurs positives correspondent à une rotation antihoraire) et scale multiplie la taille de l’image : 1.0 la conserve, une valeur inférieure à 1.0 la réduit et une valeur supérieure à 1.0 l’agrandit. cv2.warpAffine(image, matrix, (width, height)) applique la matrice sur une zone de destination ; son argument de taille est ordonné largeur puis hauteur. Cet exemple fait pivoter une image de 120 × 80 de 30° autour de son centre et conserve les dimensions d’origine de la zone, ce qui peut rogner les coins. Si les paquets nécessaires ne sont pas disponibles, un rappel de configuration s’affiche.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
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]}")
L’exemple conserve volontairement la taille de destination (width, height) d’origine : le résultat garde donc les mêmes dimensions et les coins qui dépassent de cette zone sont rognés. Pour conserver l’image entière, calculez une zone de destination plus grande à partir des limites après rotation, puis ajustez la translation de la matrice afin de déplacer le centre transformé vers le centre de la nouvelle zone. Augmenter uniquement les dimensions de destination laisse la transformation ancrée à ses coordonnées d’origine.
warpAffine() remplit les pixels de destination qui ne correspondent à aucun pixel source. Par défaut, cv2.BORDER_CONSTANT utilise une couleur de remplissage constante (noire par défaut) ; définissez borderValue pour en choisir une autre. cv2.BORDER_REPLICATE prolonge les pixels du bord source le plus proche. cv2.BORDER_TRANSPARENT laisse inchangés les pixels correspondants de la destination : initialisez donc celle-ci lorsque vous utilisez ce mode. Celui-ci ne reproduit pas automatiquement la bordure source. Consultez la référence OpenCV sur les modes de bordure pour connaître les modes disponibles.