Manipulation de pixels

On considère une image en 256 niveaux de gris que l’on représente par une grille de nombres, c’est-à-dire une liste composée de sous-listes toutes de longueurs identiques.

La largeur de l’image est donc la longueur d’une sous-liste et la hauteur de l’image est le nombre de sous-listes. On donne d'ailleurs les deux fonctions largeur et hauteur définies ci-dessous :

largeur et hauteur

🐍 Script Python
def largeur(image):
    return len(image[0])

def hauteur(image):
    return len(image)

Chaque sous-liste représente une ligne de l’image et chaque élément des sous-listes est un entier compris entre 0 et 255, représentant l’intensité lumineuse du pixel.

On s'intéresse à deux opérations :

  • Le négatif d’une image est l’image constituée des pixels x_n tels que x_n + x_i = 255x_i est le pixel correspondant de l’image initiale.
  • La binarisation d'une image qui consiste à remplacer tous les pixels par des 0 ou des 1 en fonction la position de la valeur initiale par rapport à un seuil donné.

Exemples

🐍 Console Python
>>> image_1 = [[20, 34, 254, 145, 6], 
...            [23, 124, 217, 225, 69], 
...            [197, 174, 207, 25, 87], 
...            [255, 0, 24, 197, 189]]
>>> hauteur(image_1)
4
>>> largeur(image_1)
5
>>> negatif(image_1)
[[235, 221, 1, 110, 249], [232, 131, 38, 30, 186], [58, 81, 48, 230, 168], [0, 255, 231, 58, 66]]
>>> binaire(image_1, 120)
[[0, 0, 1, 1, 0], [0, 1, 1, 1, 0], [1, 1, 1, 0, 0], [1, 0, 0, 1, 1]]
Compléter le code ci-dessous :

###
# Testsbksl-nlbksl-nlimagepy-und1 = [[20, 34, 254, 145, 6], [23, 124, 217, 225, 69], [197, 174, 207, 25, 87], [255, 0, 24, 197, 189]]bksl-nlbksl-nlassert negatif(imagepy-und1) == [[235, 221, 1, 110, 249], [232, 131, 38, 30, 186], [58, 81, 48, 230, 168], [0, 255, 231, 58, 66]]bksl-nlassert binaire(imagepy-und1, 120) == [[0, 0, 1, 1, 0], [0, 1, 1, 1, 0], [1, 1, 1, 0, 0], [1, 0, 0, 1, 1]]bksl-nlbksl-nlbksl-nl# Autres testsbksl-nlbksl-nlimagepy-und2 = [[185, 221, 90, 106, 68, 59, 67],bksl-nl [100, 209, 65, 50, 152, 147, 34],bksl-nl [180, 121, 103, 1, 208, 190, 89],bksl-nl [71, 157, 44, 126, 75, 241, 180],bksl-nl [239, 254, 241, 52, 61, 135, 213]]bksl-nlbksl-nlassert negatif(imagepy-und2) == [[70, 34, 165, 149, 187, 196, 188], [155, 46, 190, 205, 103, 108, 221], [75, 134, 152, 254, 47, 65, 166], [184, 98, 211, 129, 180, 14, 75], [16, 1, 14, 203, 194, 120, 42]]bksl-nlassert binaire(imagepy-und2, 100) == [[1, 1, 0, 1, 0, 0, 0], [1, 1, 0, 0, 1, 1, 0], [1, 1, 1, 0, 1, 1, 0], [0, 1, 0, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1, 1]]bksl-nlassert binaire(imagepy-und2, 255) == [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]bksl-nlbksl-nl 5/5
def hauteur(image):bksl-nl '''renvoie le nombre de lignes de l'image'''bksl-nl return len(image)bksl-nlbksl-nldef largeur(image):bksl-nl '''renvoie la largeur de l'image'''bksl-nl return len(image[0])bksl-nlbksl-nldef negatif(image):bksl-nl '''renvoie le négatif de l'image sous la forme d'une liste de listes'''bksl-nl # on créé une image de 0 aux mêmes dimensions que le paramètre imagebksl-nl hauteurpy-undimg = ...bksl-nl largeurpy-undimg = ...bksl-nl nouvellepy-undimage = [[0 for j in range(...)] for i in range(...)] bksl-nl for i in range(...):bksl-nl for j in range(...):bksl-nl nouvellepy-undimage[i][j] = ...bksl-nl return ...bksl-nlbksl-nldef binaire(image, seuil):bksl-nl '''renvoie une image binarisée de l'image sous la formebksl-nl d'une liste de listes contenant des 0 si la valeurbksl-nl du pixel est strictement inférieure au seuilbksl-nl et 1 sinon'''bksl-nl # on crée une image de 0 aux mêmes dimensions que le paramètre imagebksl-nl hauteurpy-undimg = ...bksl-nl largeurpy-undimg = ...bksl-nl nouvellepy-undimage = [[0 for j in range(...)] for i in range(...)]bksl-nl for i in range(...):bksl-nl for j in range(...):bksl-nl if ...:bksl-nl nouvellepy-undimage[i][j] = ...bksl-nl else:bksl-nl nouvellepy-undimage[i][j] = ...bksl-nl return nouvellepy-undimage bksl-nlbksl-nlbksl-nl# Testsbksl-nlbksl-nlimagepy-und1 = [[20, 34, 254, 145, 6], [23, 124, 217, 225, 69], [197, 174, 207, 25, 87], [255, 0, 24, 197, 189]]bksl-nlbksl-nlassert negatif(imagepy-und1) == [[235, 221, 1, 110, 249], [232, 131, 38, 30, 186], [58, 81, 48, 230, 168], [0, 255, 231, 58, 66]]bksl-nlassert binaire(imagepy-und1, 120) == [[0, 0, 1, 1, 0], [0, 1, 1, 1, 0], [1, 1, 1, 0, 0], [1, 0, 0, 1, 1]]bksl-nlbksl-nldef hauteur(image):bksl-nl '''renvoie le nombre de lignes de image'''bksl-nl return len(image)bksl-nlbksl-nldef largeur(image):bksl-nl '''renvoie la largeur de l'image'''bksl-nl return len(image[0])bksl-nlbksl-nldef negatif(image):bksl-nl '''renvoie le négatif de l'image sous la forme d'une liste de listes'''bksl-nl # on créé une image de 0 aux mêmes dimensions que le paramètre imagebksl-nl hauteurpy-undimg, largeurpy-undimg = hauteur(image), largeur(image)bksl-nl nouvellepy-undimage = [[0 for j in range(largeurpy-undimg)] for i in range(hauteurpy-undimg)]bksl-nl for i in range(hauteurpy-undimg):bksl-nl for j in range(largeurpy-undimg):bksl-nl nouvellepy-undimage[i][j] = 255 - image[i][j]bksl-nl return nouvellepy-undimagebksl-nlbksl-nldef binaire(image, seuil):bksl-nl '''renvoie une image binarisée de l'image sous la formebksl-nl d'une liste de listes contenant des 0 si la valeurbksl-nl du pixel est strictement inférieure au seuilbksl-nl et 1 sinon'''bksl-nl # on crée une image de 0 aux mêmes dimensions que le paramètre imagebksl-nl hauteurpy-undimg, largeurpy-undimg = hauteur(image), largeur(image)bksl-nl nouvellepy-undimage = [[0 for j in range(largeurpy-undimg)] for i in range(hauteurpy-undimg)]bksl-nl for i in range(hauteurpy-undimg):bksl-nl for j in range(largeurpy-undimg):bksl-nl nouvellepy-undimage[i][j] = 0 if image[i][j] < seuil else 1bksl-nl return nouvellepy-undimage bksl-nlbksl-nl


Grille de nombres

Une grille de nombre est aussi appelée matrice. Chaque élément de cette matrice se trouve à une certaine ligne, et à une certaine colonne.

Il est habituel d'appeler i le numéro de la ligne, et j le numéro de la colonne.

Listes en compréhension

Liste en compréhension pour des versions ultra compactes, mais néanmoins compréhensibles :

🐍 Script Python
def negatif(image):
    return [[255 - image[i][j] for j in range(largeur(image))] for i in range(hauteur(image))]

def binaire(image, seuil):
    return [[0 if image[i][j] < seuil else 1 for j in range(largeur(image))] for i in range(hauteur(image))]