Exercice 1¶

Table des matières

  • La fonction de gestion de la touche 'n'
  • La fonction de gestion de la touche 'c'
  • La fonction de gestion de la tourche 'r'
  • Le programme principal
In [ ]:
import cv2
import numpy as np
import matplotlib.pyplot as plt

La fonction de gestion de la touche 'n'¶

Toutes les valeurs de la matrice nd image doivent être initialisées à 0.

In [ ]:
def remplirNoir(image):
    # rempli une image en noir : toutes les valeurs de la matrice nd sont mises à 0
    image[...] = 0
    return image

On profite des simplifications possibles de numpy :

image[...]

le ... correspond à toutes les valeurs possibles des indices des 3 dimensions. Cela revient à écrire :

for y in range(image.shape[0]):
    for x in range(image.shape[1]):
        for c in range(image.shape[2]):
            image[y,x,c] = 0

La fonction de gestion de la touche 'c'¶

Pour générer une couleur aléatoire, on utilise la fonction random de numpy :

np.random.randint(0,255,3,np.uint8)

Cet appel renvoie une liste de 3 éléments dont les valeurs sont comprises entre 0 et 255.

In [ ]:
def remplirCouleur(image):
    # rempli l'image 
    image[...] = np.random.randint(0, 255,3,np.uint8)
    return image

On profite encore de la notation ... de numpy :

image[...] = np.random.randint(0,255,3,np.uint8)

Dans cette affectation, les ... correspondent à

couleur = np.random.randint(0,255,3,np.uint8)
for y in range(image.shape[0]):
    for x in range(image.shape[1]):
        image[y,x] = couleur

Numpy adapte l'affectation en fonction des dimensions de la partie droite de l'affectation.

La fonction de gestion de la tourche 'r'¶

Le rectangle à remplir doit être centré dans l'image avec une largeur de 100 pixels et une hauteur de 50 pixels. Ainsi le remplissage du rectangle se fera entre les lignes :

ymin = image.shape[1]/2 - largeur/2
ymax = image.shape[1]/2 + largeur/2

et entre les colonnes :

xmin = image.shape[2]/2 - hauteur/2
xmax = image.shape[2]/2 + heuteur/2
In [ ]:
def remplirRectangle(image,largeur,hauteur):
    resultat = image.copy()
    xmin = int((image.shape[1]-largeur)/2)
    xmax = int((image.shape[1]+largeur)/2)
    ymin = int((image.shape[0]-hauteur)/2)
    ymax = int((image.shape[0]+hauteur)/2)
    resultat[ymin:ymax,xmin:xmax] = np.random.randint(0, 255,3,np.uint8)
    return resultat

On profite encore d'une notation simplifiée des accès indexés à un matrice nd :

resultat[ymin:ymax,xmin:xmax] = np.random.randint(0, 255,3,np.uint8)

Ce qui revient à écrire :

couleur = np.random.randint(0,255,3,np.uint8)
for y in range(ymin,ymax):
    for x in range(xmin,xmax):
        image[y,x] = couleur

Le programme principal¶

In [ ]:
image = np.zeros((480,640,3), np.uint8)
largeur = 100
hauteur = 50

cv2.namedWindow('image originale')
cv2.imshow('image originale',image)

while True:
    key = cv2.waitKey(30) & 0x0FF
    if key == 27 or key==ord('q'):
        break;
    if key ==ord('n'):
        image = remplirNoir(image)
        cv2.imshow('image originale',image)
    if key ==ord('c'):
        image = remplirCouleur(image)
        cv2.imshow('image originale',image)
    if key ==ord('r'):
        image = remplirRectangle(image,largeur,hauteur)
        cv2.imshow('image originale',image)

print('arrêt du programme par l\'utilisateur')
cv2.destroyWindow('image originale')
arrêt du programme par l'utilisateur