Faculté des sciences et de la technologie
Master : traitement et analyse d'images et de la parole
Chapitre II : Manipulation des images par OpenCV
1 - Chargement et affichage d'une image a partir d'un fichier :
Dans cette section, nous allons voir comment:
• Charger une image (en utilisant la fonction imread)
• Afficher une image dans une fenêtre OpenCV (à l'aide de la fonction imshow)
Supposons que le préparatoire de travail contient le fichier image « house.tiff » . Pour le lire par
OpenCV, on exécute les instructions suivantes :
>> from cv2 import *
>> image = imread("house.tiff",CV_LOAD_IMAGE_COLOR)
>> imshow('affichage de l\'image',image)
>> waitKey(0)
Explication
– La première instruction appel le module OpenCV (toutes les fonctions) ;
– L'instruction imread charge une image à partir le fichier « house.tiff ». Le deuxième
argument spécifie le format de l'image. Cela peut être:
• CV_LOAD_IMAGE_UNCHANGED : charge l'image telle qu'elle est
• CV_LOAD_IMAGE_GRAYSCALE : charge l'image en niveau de gris
• CV_LOAD_IMAGE_COLOR :charge l'image en format RGB
– Après avoir vérifié si les données d'image ont été chargés correctement, on l'affiche en
utilisant la fonction imshow.
I-1
– Enfin, pour mettre à jour le contenu de la fenêtre OpenCV avec une nouvelle image, on utilise
la fonction imshow. Pour ce faire, on indique le nom de la fenêtre OpenCV pour mettre à jour
et l'image à utiliser au cours de cette opération:
imshow('nom_de_la_fenetre',image)
– Parce qu'on veut que notre fenêtre s'affiche jusqu'à ce que l'utilisateur appuie sur une touche,
nous utilisons la fonction waitKey dont le seul paramètre est le temps faut-il attendre une
intervention de l'utilisateur (mesuré en millisecondes). Zéro signifie d'attendre indéfiniment.
Remarques :
- OpenCV supporte les formats d'image suivants :
Windows bitmap (bmp), portable image formats (pbm, pgm, ppm), Sun raster (sr, ras), JPEG (jpeg,
jpg, jpe), JPEG 2000 (jp2), TIFF (tiff, tif) et portable network graphics (png).
- Pour connaître la taille de l'image, on utilise la méthode shape de la donnée image comme suite :
>> print "size of image: ", image.shape
- Il vaut mieux mettre la suite des instructions précédente dans fichier texte afficher_image.py, pour
l'utiliser au fur et à mesure de nos besoins.
Exemple
from cv2 import *
import sys
if len(sys.argv)!=2:
print "Usage : python afficher_image.py <fichier>"
else:
image = imread(sys.argv[1],CV_LOAD_IMAGE_COLOR)
if (image == None):
print "erreur d\'ouverture du fichier image"
else:
imshow('affichage de l\'image',image)
waitKey(0)
Pour exécuter ce code , il suffit de taper (dans le terminal)
~$ python afficher_image.py house.tiff
2 - Modifier et sauvegarder une image
Dans cette section, nous allons voir comment:
• Charger une image en utilisant la fonction imread
• Transformer une image en niveaux de gris à partir de BGR format en utilisant cvtColor
• Enregistrez votre image transformée dans un fichier sur le disque en utilisant imwrite
I-2
# Ergistrer ce code dans fichier modifier_image.py
from cv2 import *
image = imread('house.tiff')
image_gris = cvtColor(image, COLOR_BGR2GRAY)
imwrite('image_gris.jpg',image_gris)
imshow('image_couleur',image)
imshow('image_gris',image_gris)
waitKey(0)
destroyAllWindows()
Explication
- La fonction cvtColor convertir notre image RGB en format niveaux de gris. Elle prend comme
arguments:
• une image source (image)
• une image de destination ou l'image convertie (image_gris)
• un paramètre qui indique quel genre de transformation sera effectuée. Dans ce cas, nous
utilisons CV_BGR2GRAY
- La fonction imwrite converte et sauvegarde la nouvelle image (image_gris) sur le disque. Dans le
programme précédent le format JPEG est utilisé dans la conversion.
– La fonction destroyAllWindows() : on peut appeler destroyWindow() ou destroyAllWindows()
pour fermer la fenêtre et de-allouer l'utilisation de la mémoire associée. Pour un programme
simple, on'a pas vraiment besoin d'appeler ces fonctions parce que toutes les ressources et les
fenêtres de l'application sont fermés automatiquement par le système d'exploitation à la sortie.
–
I-3
3- Modification du contraste et de la luminosité d'une image
Un opérateur général de traitement d'image est une fonction qui prend une ou plusieurs images en
entrée et produit une image de sortie.
Les transformations d'image peuvent être considérés comme:
- Des opérateurs ponctuels (transformations pixels)
- Des opérateurs de voisinage (zone )
Transformations Pixels
Dans ce genre de transformation de traitement de l'image, la valeur de chaque pixel de sortie dépend
uniquement de la valeur de pixel d'entrée correspondante comme et le réglage de la luminosité et du
contraste d'une image.
Exemple : Réglages de la luminosité et de contraste
Deux processus ponctuels couramment utilisés sont la multiplication et l'addition avec une constante:
g (i , j)=α . f (i , j)+β
où i et j indique que la pixel est située dans le i-ème ligne et j-ème colonne.
Les paramètres α >0 et β sont souvent appelés les paramètres de gain et de biais; ou paramètres de
contrôle de contraste et de la luminosité respectivement.
Code Python
# coding: latin1
from cv2 import *
from numpy import *
alpha = float(input(" Entrer la valeur de alpha [1.03.0]: "))#contraste
beta = int(input("Entrer la valeur de beta [0100]: ")) # luminosité
image = imread('rice.tif')
mul_image = multiply(image,array([alpha])) # mul_image = image*alpha
image1 = add(mul_image,array([beta])) # image1 = image*alpha +
beta
#image1 = image*alpha + beta
imshow('image_originale', image)
imshow('image_nouvelle',uint8(image1))
waitKey(0)
destroyAllWindows()
4- Fusion (mélange) de deux images
Dans cette section on va apprendre comment fusionnner linéairement des images. Un opérateurs
pixels dyadique (deux entrées) intéressant est l'opérateur de mélange linéaire:
g ( x)=(1−α) f 0 ( x)+α f 1 ( x)
I-4
En faisant varier α de 0 à 1 cet opérateur peut être utilisé pour effectuer une fusion temporelle entre deux
images ou des vidéos :
Code Python
from cv2 import *
from numpy import *
alpha = float(input("Entrer la valeur de alpha "))
if 0<=alpha<=1:
beta = 1.0 alpha
gamma = 0.5
img1 = imread('LinuxLogo.png')
img2 = imread('WindowsLogo.png')
if img1==None:
print "erreur image1 "
elif img2==None:
print "erreur image2 "
else:
dist = addWeighted(img1,alpha,img2,beta,gamma)
# dist = uint8(alpha*(img1)+beta*(img2))
imshow('distination',dist)
waitKey(0)
destroyAllWindows()
else:
print "valeur de alpha doit etre entre 0 et 1"
Pour α=0.5 nous obtenons le resultat suivant :
I-5
5- Opérateurs de voisinage (zone ) sur les images
Dans ces opérateurs on recalcule chaque valeur des pixels d'une image selon une matrice de masque
(ou noyau). Ce masque contient des valeurs qui va ajuster l'influence de pixels voisins (et le pixel en
cours) sur la nouvelle valeur de pixel. D'un point de vue mathématique, nous faisons une moyenne
pondérée, comme suit :
Exemple 1 : accentuation du contraste de l'image (sharpening)
Dans ce cas, on veut appliquer pour chaque pixel de l'image la formule suivante:
Pour implémenter cet opérateur par OpenCV on utilise la la fonction filter2D :
Code Python
from cv2 import *
from numpy import *
img = imread('house.tiff')
masque = array([ [0.,1.,0.],
[1.,5.,1.],
[0.,1.,0.] ])
img1 = filter2D(img,1,masque)
imshow('originale',img)
imshow('nouvelle',img1)
waitKey(0)
destroyAllWindows()
I-6
Explication
La fonction filter2D fait la convolution entre l'image et le masque. Elle prend comme arguments:
• l'image source (img)
• une matrice de masquage (masque) de type réel
• un parametre de profondeur -1, signifie que la estination a une profondeur initiale (8 bits)
• une image de destination ou l'image convertie (img1)
Dans cette exemple on voit clairement que ce type de masquage est un filtrage pass-haut.
Exemple 2 : lissage d'une image (smoothing)
Si on utilise un autre masque, comme ceci :
Nous obtenons un résultat inverse; l'image résultante devient floue (filtrage pass-bas) :
Il existe d'autre type de filtres de lissage d'image tels que le filtrage Gaussien et le filtrage median.
Exemple:
img1 = GaussianBlur(img,(3,3),0) # filtre Gaussien
img1 = medianBlur(img,5) # filtre median
I-7