Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Retourner et pivoter une image
En deep learning, un des secrets pour obtenir un bon modèle c'est d'avoir beaucoup de données d'entraînement. L'augmentation de données consiste à créer des variantes de tes images existantes : retournées, pivotées, légèrement zoomées. Avec 1000 photos de chats et ces transformations, tu peux facilement passer à 4000 ou 8000 images. C'est aussi comme ça que les filtres selfie de ton téléphone fonctionnent quand ils retournent l'image pour te montrer un miroir.
Pense à une photo imprimée que tu tiens dans tes mains. Le flip horizontal, c'est comme la retourner face à un miroir : la droite et la gauche s'inversent. Le flip vertical, c'est comme la retourner de haut en bas. La rotation, c'est tourner la feuille d'un quart de tour.
En pratique, tu utiliserais cv2.flip(image, 1) pour un flip horizontal, cv2.flip(image, 0) pour un flip vertical, et cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) pour une rotation. Ici on le fait avec NumPy pour comprendre que tout repose sur du slicing.
Avec NumPy, le flip est simple grâce au slicing inverse :
flip_horizontal = image[:, ::-1] # inverse les colonnes flip_vertical = image[::-1, :] # inverse les lignes
Pour pivoter de 90 degrés dans le sens horaire, NumPy fournit np.rot90 qui fait une rotation de 90 degrés dans le sens antihoraire. Avec k=-1 ou k=3, tu obtiens le sens horaire.
Écris trois fonctions :
flip_horizontal(image) qui retourne l'image horizontalement (miroir gauche-droite).
flip_vertical(image) qui retourne l'image verticalement (miroir haut-bas).
rotation_90_horaire(image) qui pivote l'image de 90 degrés dans le sens des aiguilles d'une montre.
Exemple : img = np.array([[[1,1,1], [2,2,2]], [[3,3,3], [4,4,4]]], dtype=np.uint8) Cet array 2x2 représente : 1 2 3 4 flip_horizontal donne : 2 1 4 3 rotation_90_horaire donne : 3 1 4 2
Ce que tu devrais voir sur ta machine : charge une photo avec cv2.imread, applique ces transformations et compare les résultats.
Tests (5/5)
Flip horizontal
import numpy as np
img = np.array([[[1,1,1], [2,2,2], [3,3,3]]], dtype=np.uint8)
result = flip_horizontal(img)
assert list(result[0, 0]) == [3, 3, 3], 'Le premier pixel doit etre le dernier de la ligne'
assert list(result[0, 2]) == [1, 1, 1]
Flip vertical
import numpy as np
img = np.array([[[10,10,10]], [[20,20,20]], [[30,30,30]]], dtype=np.uint8)
result = flip_vertical(img)
assert list(result[0, 0]) == [30, 30, 30], 'La première ligne doit etre la dernière'
assert list(result[2, 0]) == [10, 10, 10]
Rotation 90 forme
import numpy as np
img = np.zeros((10, 20, 3), dtype=np.uint8)
result = rotation_90_horaire(img)
assert result.shape == (20, 10, 3), f'Apres rotation 90, (10,20) doit devenir (20,10), obtenu {result.shape}'
Rotation 90 valeurs
import numpy as np
img = np.zeros((2, 3, 3), dtype=np.uint8)
img[0, 0] = [255, 0, 0]
result = rotation_90_horaire(img)
assert list(result[0, 1]) == [255, 0, 0], 'Le pixel (0,0) doit aller en (0, h-1) apres rotation horaire'
Double flip = original
import numpy as np
img = np.random.randint(0, 255, (5, 5, 3), dtype=np.uint8)
result = flip_horizontal(flip_horizontal(img))
assert np.array_equal(result, img), 'Deux flips horizontaux doivent donner l original'