La fonction reduit4Bits

Question

Écrire une fonction reduit4Bits(im) ayant pour arguments la forme matricielle de l'image à traiter et qui renvoie un nouveau tableau numpy dont les 4 bits de poids faibles de chaque couleur pour chaque pixel ont été remplacés par des 0. On utilisera la fonction & proposée dans l'ANNEXE.

Tester la fonction sur masque.png.

Afficher l'image masque d'origine et l'image réduite. Voit-on une différence ?

Indice

Voici la documentation de la fonction

1
def reduit4Bits(im):
2
    """
3
    im : un tableau numpy (au format uint8) représentant une image couleur codée en RGB, chaque couleur est codée sur 8 bits.
4
    La fonction permet de mettre à 0 les quatre bits de poids le plus faible de chaque couleur.
5
    Remarque : l'image peut comporter un 4éme bit pour la transparence.
6
    Exemple :
7
    si un pixel de l'image argument est codée par : array([168, 150, 104, 255], dtype=uint8)
8
    le pixel associé de l'image renvoyée sera codé par : array([160, 144,  96], dtype=uint8)
9
    
10
    Pour le pixel Rouge de l'image d'origine on a 168 en décimal soit '10101000' en binaire
11
    Pour le pixel Rouge de l'image réduite on  a  160 en décimal soit '10100000' en binaire
12
    
13
    De même pour les pixels vert et bleu :
14
    Pour le pixel Vert de l'image d'origine on a 150 en décimal soit '10010110' en binaire
15
    Pour le pixel Vert de l'image réduite on  a  144 en décimal soit '10010000' en binaire
16
    
17
    Pour le pixel Bleu de l'image d'origine on a 104 en décimal soit '1101000' en binaire
18
    Pour le pixel Bleu de l'image réduite on  a  96 en décimal soit '1100000' en binaire
19
    """
20
    return 'A vous de faire'

Indice

Il faut créer un nouveau tableau numpy de même dimension que l'image originale pour stocker les nouvelles valeurs des couleurs.

1
def reduit4Bits(im):
2
    """
3
    im : un tableau numpy (au format uint8) représentant une image couleur codée en RGB, chaque couleur est codée sur 8 bits.
4
    La fonction permet de mettre à 0 les quatre bits de poids le plus faible de chaque couleur.
5
    Remarque : l'image peut comporter un 4éme bit pour la transparence.
6
    Exemple :
7
    si un pixel de l'image argument est codée par : array([168, 150, 104, 255], dtype=uint8)
8
    le pixel associé de l'image renvoyée sera codé par : array([160, 144,  96], dtype=uint8)
9
    
10
    Pour le pixel Rouge de l'image d'origine on a 168 en décimal soit '10101000' en binaire
11
    Pour le pixel Rouge de l'image réduite on  a  160 en décimal soit '10100000' en binaire
12
    
13
    De même pour les pixels vert et bleu :
14
    Pour le pixel Vert de l'image d'origine on a 150 en décimal soit '10010110' en binaire
15
    Pour le pixel Vert de l'image réduite on  a  144 en décimal soit '10010000' en binaire
16
    
17
    Pour le pixel Bleu de l'image d'origine on a 104 en décimal soit '1101000' en binaire
18
    Pour le pixel Bleu de l'image réduite  on  a  96 en décimal soit '1100000' en binaire
19
    """
20
    L,C=np.shape(im)[0:2] # on recupere la taille en pixel des colonnes et lignes de l'image à traiter
21
    im_R=np.zeros((L,C,3),dtype=np.uint8) # pour faire une image dont les couleurs sont codées sur 4 bits
22
    
23
    return 'A vous de faire !'
24

Indice

Il faut travailler travailler pixel par pixel en traitant chaque couleur indépendamment, donc en faisant au minimum double boucle, car la fonction & ne peut pas s'appliquer à un tableau numpy.

Indice

Pour un pixel donné, si le niveau de rouge est 168, tester dans votre shell :

1
>>> bin(168)
2
'0b10101000'
3
4
>>> 168 & 0b11110000
5
160
6
7
>>> bin(160) # On a bien mis à 0 les 4 bits de poids faibles.
8
'0b10100000'

La fonction bin ne doit pas être utilisée, elle nous sert juste à comprendre le fonctionnement de la fonction &.

Indice

1
## la fonction reduit4Bits
2
def reduit4Bits(im):
3
    """
4
    im : un tableau numpy (au format uint8) représentant une image couleur codée en RGB, chaque couleur est codée sur 8 bits.
5
    La fonction permet de mettre à 0 les quatre bits de poids le plus faible de chaque couleur.
6
    Remarque : l'image peut comporter un 4éme bit pour la transparence.
7
    Exemple :
8
    si un pixel de l'image argument est codée par : array([168, 150, 104, 255], dtype=uint8)
9
    le pixel associé de l'image renvoyée sera codé par : array([160, 144,  96], dtype=uint8)
10
    
11
    Pour le pixel Rouge de l'image d'origine on a 168 en décimal soit '10101000' en binaire
12
    Pour le pixel Rouge de l'image réduite on  a  160 en décimal soit '10100000' en binaire
13
    
14
    De même pour les pixels vert et bleu :
15
    Pour le pixel Vert de l'image d'origine on a 150 en décimal soit '10010110' en binaire
16
    Pour le pixel Vert de l'image réduite on  a  144 en décimal soit '10010000' en binaire
17
    
18
    Pour le pixel Bleu de l'image d'origine on a 104 en décimal soit '1101000' en binaire
19
    Pour le pixel Bleu de l'image réduite on  a  96 en décimal soit '1100000' en binaire
20
    """
21
    L,C=np.shape(im)[0:2] # on recupere la taille en pixel des colonnes et lignes de l'image à traiter
22
    im_R=np.zeros((L,C,3),dtype=np.uint8) # pour faire une image dont les couleurs sont codées sur 4 bits
23
    for ligne in range(L): # double boucle pour travailler pixel par pixel
24
        for colonne in range(C):
25
            pixelOriginal = im[ligne,colonne]
26
            R=pixelOriginal[0] & # A compléter
27
            G=pixelOriginal[1] & # A compléter
28
            B=pixelOriginal[2] & # A compléter
29
            im_R[ligne,colonne]=[R,G,B]
30
    return im_R

Question

Tester la fonction avec masque.png.

Afficher l'image masque d'origine et l'image réduite. Voit-on une différence ?

Solution

1
masqueReduit = reduit4Bits(masque)
2
3
# Pour aficher les deux images dans une même fenétre
4
plt.figure('les images masques')
5
plt.subplot(121)
6
plt.title('l image masque')
7
plt.imshow(masque)
8
plt.subplot(122)
9
plt.title('l image masque réduite')
10
plt.imshow(masqueReduit)
11
plt.show()

On peut remarquer que la nuance des couleurs est moins importante sur l'image réduite, mais c'est assez léger et indiscernable si on ne connaît pas l'image originale.