La manipulation d'images avec OpenCV2
Sur cette page tu découvriras comment manipuler des images avec OpenCV2, ou même comment combiner les images pour faire une vidéo !
Si tu utilises CV2 dans le cadre d’ateliers d’intelligence artificielle, tu peux retourner au portail IA ici
Pense à bien ajouter la ligne d’import (import cv2) pour pouvoir utiliser les fonctions d’OpenCV2.
Dans cette page tu trouveras :
Ouvrir et afficher une image
Ouvrir une image
Pour ouvrir une image, on utilise la fonction imread() :
import cv2 image = cv2.imread(‘chemin’) #Afficher la taille de l’image print(image.shape) #(hauteur,largeur,couleurs) |
Enregistrer une image
Pour enregistrer l’image, on utilise imwrite().
Il faut alors préciser le chemin complet avec le nom de l’image
cv2.imwrite(‘nouveau/chemin’,image) |
Afficher une image
Pour afficher une image, après l’avoir ouverte grâce à la fonction imread(), on peut utiliser cv2_imshow(). Attention à bien importer cv2_imshow comme sur l’exemple :
from google.colab.patches import cv2_imshow cv2_imshow(image) |
Manipuler les images – modifications de base
Modifier la taille de l’image
Tu peux modifier la taille de l’image avec la fonction resize() :
image=cv2.resize(img,(200,200)) |
On peut aussi récupérer la hauteur et la largeur avec la fonction shape(). On peut alors utiliser la fonction resize() en fonction de ces valeurs :
hauteur = img.shape[0] largeur = img.shape[1] print(largeur, » x « , hauteur) → « 1200 x 900 » |
image=cv2.resize(img,(int(largeur/3),int(hauteur/3))) cv2_imshow(image) |
Tourner l’image
Pour faire tourner l’image, on utilise la fonction rotate() :
#Tourne l’image de 90° dans le sens horaire. image_tourne = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) #Tourne l’image de 180°. #Tourne l’image de 90° dans le sens anti-horaire. image_tourne3 = cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE) cv2_imshow(image_tourne) |
On peut aussi utiliser la fonction flip() pour retourner l’image selon un axe de symétrie.
Il faut alors préciser comme paramètre :
- 0 pour l’axe vertical
- 1 pour l’axe horizontal
- -1 pour l’axe horizontal et l’axe vertical
image_flip=cv2.flip(image, 1) cv2_imshow(image_flip) |
Recadrer l’image
En Python, mais plus généralement en programmation, les coordonnées sont un peu différentes de ce qu’on connaît en mathématiques classiques.
Comme tu peux le voir sur l’image ci-dessous, l’axe des ordonnées (Y) va vers le bas au lieu d’aller vers le haut 🙂
L’origine de l’image est donc le point en haut à gauche de celle-ci !
Pour recadrer les images, nous allons seulement « couper » le tableau contenant l’image :
image_crop=img[0:500,0:500] cv2_imshow(image_crop) |
Manipuler les images – modifications avancées
Filtrer les images
Tu peux utiliser les méthodes blur() ou medianBlur() pour ajouter un effet de flou sur ton image :
blur = cv2.blur(image,(10,10)) |
On peut également appliquer des filtres plus avancés, voici quelques exemples :
laplacian = cv2.Laplacian(image,cv2.CV_64F) sobel = cv2.Sobel(image,cv2.CV_64F,1,0,ksize=5) edges = cv2.Canny(image,100,200)
cv2_imshow(laplacian) cv2_imshow(sobel) cv2_imshow(edges) |
Mélanger deux images
On utilise la fonction addWeighted() pour pouvoir mélanger les 2 images.
On place en 1er argument, l’image de fond puis son opacité (1 pour totalement opaque, 0 pour totalement invisible).
Puis on place l’image de devant avec son opacité.
Enfin, on indique l’opacité globale de l’image (de -255 à 255).
Il faut aussi penser à utiliser cvtColor() avant pour que l’on puisse gérer la transparence de l’image.
panda = cv2.cvtColor(panda, cv2.COLOR_RGB2RGBA) bambou = cv2.cvtColor(bambou, cv2.COLOR_RGB2RGBA) background = cv2.addWeighted(bambou, 1, panda, 0.5, 0) cv2_imshow(background) |
Ajouter un bord
Pour ajouter un bord, on utilise la fonction copyMakeBorder() :
- 1er argument : tableau contenant l’image
- 2ème argument : largeur en pixels des bords haut, bas, gauche et droite
- 3ème argument : type de bordure
- 4ème argument : couleur du bord (en BGR)
img = cv2.cvtColor(background, cv2.COLOR_RGBA2RGB) img_bord = cv2.copyMakeBorder(img, 5, 5, 10, 10, cv2.BORDER_CONSTANT, value=[0, 0, 250]) cv2_imshow(img_bord) |
Ajouter du texte
Pour ajouter du texte, on utilisera putText() avec les polices Hershey :
position = (100,50) cv2.putText( img_bord, « Je suis Mimi Panda », position, cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 00, 255, 255), 3) cv2_imshow(img_bord) |
Créer un gif image par image
On commence par un tableau pour stocker les images.
# on créé un tableau dans lequel on va stocker les images. gif = [] |
… puis :
- On importe la librairie imageio
- On ouvre l’image avec imageio
- On ajoute dans le gif
- Un fois toute les images dans le gif, on l’écrit dans un fichier .gif
import imageio for chemin in tableau_images: image = imageio.imread(chemin) gif.append(image) imageio.mimwrite(« /content/MonGif.gif », gif) |
Le gif est enregistré, tu peux le télécharger, ou le lire directement dans colab en double-cliquant dessus.
Créer une vidéo image par image
On commence par créer la vidéo
# FourCC est le code du codec en 4 symboles qui permet de savoir comment encoder la vidéo fourcc = cv2.VideoWriter_fourcc(*‘MP4V’) video = cv2.VideoWriter(‘/chemin’,fourcc, frames,(largeur,hauteur)) |
… puis :
- on ajoute des images dans la vidéo avec video.write()
- on enregistre la vidéo avec video.release()
video.write(image) video.release() |
La vidéo est alors enregistrée, tu peux la télécharger – ou alors la visualiser directement dans Google Colab en ajoutant un lecteur de vidéo (voir ci-dessous).
Visualiser une vidéo dans Google Colab
On utilise mediapy pour lire une vidéo dans Google Colab. On commence donc par importer mediapy et ffmpeg
# Imports pour lire une vidéo !command -v ffmpeg >/dev/null || (apt update && apt install -y ffmpeg) !pip install -q mediapy |
Puis on peut simplement lire la vidéo avec mediapy !
Attention : pour qu’elle soit affichée, la vidéo sera transformée en gif, cela prend du temps.
import mediapy as media
video = media.read_video(‘mavideo.mp4’) media.show_video(video, fps=5, codec=‘gif’) |
Si jamais tu as besoin de redimensionner ta vidéo, tu peux aussi utiliser media.resize_video().
Ta vidéo s’affichera sur Colab comme sur la capture d’écran ci-dessous
hauteur = 200 largeur = 400 video = media.resize_video(video, (hauteur,largeur)) |