commandes utiliseés : Image.open(), split(), merge(), getdatata(), putdata(),save().

Réduction de la palette d'une image avec Python

On va réduire le nombre de couleurs de 16777216 ( 256×256×256 ) à 512 (8×8×8)

Le principe

Pour chaque pixel, on va remplacer la composante rouge, verte ou bleue (comprise entre 0 et 255) par un multiple de 32 . Ainsi la composante rouge, verte ou bleue sera l'une des 8 valeurs : 0 ,32 , 64, 96,…,224.

Action de la transformation

Statistiques sur les 512 couleurs

On fait apparaître les 10 couleurs les plus utilisées

Il y a 176 400 pixels.

La première couleur apparaît sur 25 752 pixels, la seconde sur 19 407 et la troisième sur 17 797 pixels.

Le code

#-*- coding:Latin-1 -*-
#-*- coding:Latin-1 -*-
def reduction(m):

    n=[0]*len(m)
    for k in range(len(m)):
        n[k]=m[k]//32*32
    return n

import Image

im = Image.open("meleagan.png")
#on recupere les dimensions de l image
w,h=im.size
#On eclate l emage en trois (rouge vert bleu)
r,g,b=im.split()
#on transforme l image en liste
r=list(r.getdata())
g=list(g.getdata())
b=list(b.getdata())
###################creation de la nouvelle image
#application de la fonction
r=reduction(r)
g=reduction(g)
b=reduction(b)

#creation de trois nouvelles images
nr = Image.new("L",(w,h))
nr.putdata(r)
ng = Image.new("L",(w,h))
ng.putdata(g)
nb = Image.new("L",(w,h))
nb.putdata(b)

#fusion des trois nouvelles images
resultat = Image.merge('RGB',(nr,ng,nb)) 

resultat.save("redu.png") 
##################creation de la barre
#creation d'une liste de 512 couleurs
palette=[0]*512
#on parcourt l'image et on note les couleurs
for k in range(w*h):
    c=2*r[k]+g[k]/4+b[k]/32
    palette[c]+=1

tri=[palette.index(x) for x in sorted(palette,reverse=True)]
#creation d'une image pour la barre de statistiques
stat=Image.new('RGB',(500,50))
pix=stat.load()
for i in range(10):    
    for y in range(50):
        for x in range (50*i,50*i+50):
            pix[x,y]=(32*(tri[i]//64),32*((tri[i]%64)//8),32*(tri[i]%8))
stat.save('barre.png')
 

fait le 24 juin 2014