Skip to content

OpenCV, NumPy : Rotation et retournement d’une image

OpenCV de Python gère les images en tant que tableau NumPy ndarray. Il existe des fonctions pour faire pivoter ou retourner des images (= ndarray) dans OpenCV et NumPy, qui peuvent être utilisées l’une ou l’autre.

Cet article décrit le contenu suivant.

  • Faire pivoter l’image avec OpenCV :cv2.rotate()
  • Retourner l’image avec OpenCV :cv2.flip()
  • Faire pivoter l’image avec NumPy :np.rot90()
  • Retourner l’image avec NumPy :np.flip()

Pour les bases du traitement d’image avec NumPy, consultez l’article suivant qui décrit comment lire un fichier image avec Pillow(PIL) et le convertir en ndarray sans utiliser OpenCV, et comment enregistrer ndarray en tant que fichier image.

Pour lire et écrire des images avec OpenCV, consultez l’article suivant :

Vous pouvez également utiliser Oreiller (PIL) pour faire pivoter et retourner une image.

L’utilisation de Pillow est le moyen le plus simple et le plus simple de charger un fichier image existant, de le faire pivoter, de le retourner et de l’enregistrer. Il peut tourner à n’importe quel angle, pas par incréments de 90 degrés.

L’exemple de code utilise l’image suivante comme exemple.

avec

Faire pivoter l’image avec OpenCV :cv2.rotate()

La fonction OpenCV qui fait pivoter l’image (= ndarray) est cv2.rotate().

Spécifiez le ndarray d’origine comme premier argument et la constante indiquant l’angle et la direction de rotation comme deuxième argument rotateCode.

Les trois constantes suivantes peuvent être spécifiées dans rotateCode.

  • cv2.ROTATE_90_CLOCKWISE
  • cv2.ROTATE_90_COUNTERCWISE
  • cv2.ROTATE_180

Exemple de code et résultats ci-dessous.

import cv2

img = cv2.imread('data/src/lena.jpg')
print(type(img))
# 

print(img.shape)
# (225, 400, 3)

img_rotate_90_clockwise = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
cv2.imwrite('data/dst/lena_cv_rotate_90_clockwise.jpg', img_rotate_90_clockwise)
# True

img_rotate_90_counterclockwise = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imwrite('data/dst/lena_cv_rotate_90_counterclockwise.jpg', img_rotate_90_counterclockwise)
# True

img_rotate_180 = cv2.rotate(img, cv2.ROTATE_180)
cv2.imwrite('data/dst/lena_cv_rotate_180.jpg', img_rotate_180)
# True

OpenCV tourner ROTATE_90_CLOCKWISE

Rotation OpenCV ROTATE_90_COUNTERCLOCKWISE

OpenCV rotation ROTATE_180

Retourner l’image avec OpenCV :cv2.flip()

La fonction OpenCV qui retourne l’image (= ndarray) verticalement et horizontalement est cv2.flip().

Spécifiez le ndarray d’origine comme premier argument et une valeur indiquant les directions comme second argument flipCode.

L’image est retournée en fonction de la valeur de flipCode comme suit :

  • flipcode = 0 : retourner verticalement
  • flipcode > 0 : retourner horizontalement
  • flipcode

Exemple de code et résultats ci-dessous.

import cv2

img = cv2.imread('data/src/lena.jpg')
print(type(img))
# 

print(img.shape)
# (225, 400, 3)

img_flip_ud = cv2.flip(img, 0)
cv2.imwrite('data/dst/lena_cv_flip_ud.jpg', img_flip_ud)
# True

img_flip_lr = cv2.flip(img, 1)
cv2.imwrite('data/dst/lena_cv_flip_lr.jpg', img_flip_lr)
# True

img_flip_ud_lr = cv2.flip(img, -1)
cv2.imwrite('data/dst/lena_cv_flip_ud_lr.jpg', img_flip_ud_lr)
# True

OpenCV flip UP-DOWN

OpenCV flip GAUCHE-DROITE

OpenCV flip HAUT-BAS, GAUCHE-DROITE

Faire pivoter l’image avec NumPy :np.rot90()

La fonction NumPy qui fait pivoter ndarray est np.rot90().

Spécifiez le ndarray d’origine comme premier argument et le nombre de rotations de 90 degrés comme deuxième argument.

Lorsque le deuxième argument est omis, la rotation par défaut est de 90 degrés dans le sens antihoraire, et lorsque le deuxième argument est 2 et 3, la rotation est de 180 degrés et 270 degrés dans le sens antihoraire. Voir les articles suivants pour plus de détails.

Exemple de code et résultats ci-dessous.

import numpy as np
from PIL import Image

img = np.array(Image.open('data/src/lena.jpg'))
print(type(img))
# 

print(img.shape)
# (225, 400, 3)

Image.fromarray(np.rot90(img)).save('data/dst/lena_np_rot90.jpg')

Image.fromarray(np.rot90(img, 2)).save('data/dst/lena_np_rot90_180.jpg')

Image.fromarray(np.rot90(img, 3)).save('data/dst/lena_np_rot90_270.jpg')

image numpy rot90

image numpy rot90 180

image numpy rot90 270

Ici, le fichier image est lu et écrit à l’aide de Pillow(PIL), mais lors de la lecture et de l’écriture avec OpenCV comme dans l’exemple ci-dessus, vous pouvez également utiliser la fonction NumPy au lieu de la fonction OpenCV pour traiter la rotation. Les deux ne font que tourner ndarray.

Il en va de même pour l’exemple suivant de retournement.

Retourner l’image avec NumPy :np.flip()

La fonction NumPy qui retourne ndarray verticalement et horizontalement est np.flip(). Il y a aussi np.flipud() qui retourne verticalement (haut et bas) et np.fliplr() qui retourne horizontalement (gauche et droite).

Vous pouvez retourner ndarray uniquement verticalement ou horizontalement en spécifiant un argument de np.flip(), mais il est plus facile d’utiliser np.flipud() et np.fliplr().

Si vous voulez retourner ndarray verticalement et horizontalement, vous devez utiliser np.flip(). Voir l’article suivant pour plus de détails.

Exemple de code et résultats ci-dessous.

import numpy as np
from PIL import Image

img = np.array(Image.open('data/src/lena.jpg'))
print(type(img))
# 

print(img.shape)
# (225, 400, 3)

Image.fromarray(np.flipud(img)).save('data/dst/lena_np_flipud.jpg')

Image.fromarray(np.fliplr(img)).save('data/dst/lena_np_fliplr.jpg')

Image.fromarray(np.flip(img, (0, 1))).save('data/dst/lena_np_flip_ud_lr.jpg')

image nupmy flipud

image nupmy fliplr

image flip nupmy