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
def reduit4Bits(im):
"""
im : un tableau numpy (au format uint8) représentant une image couleur codée en RGB, chaque couleur est codée sur 8 bits.
La fonction permet de mettre à 0 les quatre bits de poids le plus faible de chaque couleur.
Remarque : l'image peut comporter un 4éme bit pour la transparence.
Exemple :
si un pixel de l'image argument est codée par : array([168, 150, 104, 255], dtype=uint8)
le pixel associé de l'image renvoyée sera codé par : array([160, 144, 96], dtype=uint8)
Pour le pixel Rouge de l'image d'origine on a 168 en décimal soit '10101000' en binaire
Pour le pixel Rouge de l'image réduite on a 160 en décimal soit '10100000' en binaire
De même pour les pixels vert et bleu :
Pour le pixel Vert de l'image d'origine on a 150 en décimal soit '10010110' en binaire
Pour le pixel Vert de l'image réduite on a 144 en décimal soit '10010000' en binaire
Pour le pixel Bleu de l'image d'origine on a 104 en décimal soit '1101000' en binaire
Pour le pixel Bleu de l'image réduite on a 96 en décimal soit '1100000' en binaire
"""
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.
def reduit4Bits(im):
"""
im : un tableau numpy (au format uint8) représentant une image couleur codée en RGB, chaque couleur est codée sur 8 bits.
La fonction permet de mettre à 0 les quatre bits de poids le plus faible de chaque couleur.
Remarque : l'image peut comporter un 4éme bit pour la transparence.
Exemple :
si un pixel de l'image argument est codée par : array([168, 150, 104, 255], dtype=uint8)
le pixel associé de l'image renvoyée sera codé par : array([160, 144, 96], dtype=uint8)
Pour le pixel Rouge de l'image d'origine on a 168 en décimal soit '10101000' en binaire
Pour le pixel Rouge de l'image réduite on a 160 en décimal soit '10100000' en binaire
De même pour les pixels vert et bleu :
Pour le pixel Vert de l'image d'origine on a 150 en décimal soit '10010110' en binaire
Pour le pixel Vert de l'image réduite on a 144 en décimal soit '10010000' en binaire
Pour le pixel Bleu de l'image d'origine on a 104 en décimal soit '1101000' en binaire
Pour le pixel Bleu de l'image réduite on a 96 en décimal soit '1100000' en binaire
"""
L,C=np.shape(im)[0:2] # on recupere la taille en pixel des colonnes et lignes de l'image à traiter
im_R=np.zeros((L,C,3),dtype=np.uint8) # pour faire une image dont les couleurs sont codées sur 4 bits
return 'A vous de faire !'
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 :
>>> bin(168)
'0b10101000'
>>> 168 & 0b11110000
160
>>> bin(160) # On a bien mis à 0 les 4 bits de poids faibles.
'0b10100000'
La fonction bin ne doit pas être utilisée, elle nous sert juste à comprendre le fonctionnement de la fonction &.
Indice
## la fonction reduit4Bits
def reduit4Bits(im):
"""
im : un tableau numpy (au format uint8) représentant une image couleur codée en RGB, chaque couleur est codée sur 8 bits.
La fonction permet de mettre à 0 les quatre bits de poids le plus faible de chaque couleur.
Remarque : l'image peut comporter un 4éme bit pour la transparence.
Exemple :
si un pixel de l'image argument est codée par : array([168, 150, 104, 255], dtype=uint8)
le pixel associé de l'image renvoyée sera codé par : array([160, 144, 96], dtype=uint8)
Pour le pixel Rouge de l'image d'origine on a 168 en décimal soit '10101000' en binaire
Pour le pixel Rouge de l'image réduite on a 160 en décimal soit '10100000' en binaire
De même pour les pixels vert et bleu :
Pour le pixel Vert de l'image d'origine on a 150 en décimal soit '10010110' en binaire
Pour le pixel Vert de l'image réduite on a 144 en décimal soit '10010000' en binaire
Pour le pixel Bleu de l'image d'origine on a 104 en décimal soit '1101000' en binaire
Pour le pixel Bleu de l'image réduite on a 96 en décimal soit '1100000' en binaire
"""
L,C=np.shape(im)[0:2] # on recupere la taille en pixel des colonnes et lignes de l'image à traiter
im_R=np.zeros((L,C,3),dtype=np.uint8) # pour faire une image dont les couleurs sont codées sur 4 bits
for ligne in range(L): # double boucle pour travailler pixel par pixel
for colonne in range(C):
pixelOriginal = im[ligne,colonne]
R=pixelOriginal[0] & # A compléter
G=pixelOriginal[1] & # A compléter
B=pixelOriginal[2] & # A compléter
im_R[ligne,colonne]=[R,G,B]
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
masqueReduit = reduit4Bits(masque)
# Pour aficher les deux images dans une même fenétre
plt.figure('les images masques')
plt.subplot(121)
plt.title('l image masque')
plt.imshow(masque)
plt.subplot(122)
plt.title('l image masque réduite')
plt.imshow(masqueReduit)
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.