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))

cv2_imshow(image)

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°.
image_tourne2 = cv2.rotate(image, cv2.ROTATE_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))
cv2_imshow(blur)

median = cv2.medianBlur(image,7)
cv2_imshow(median)

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))

Retour en haut