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

Action d' une involution sur les pixels d'une image avec Python

Il s'agit de changer de place tous les pixels d'une image.

Le principe

On part d'une image carrée de côté 420 pixels , les pixels sont repérés par un couple (c;l) c est un numéro de colonne allant de 0 à 419 et l est un numéro de ligne allant de 0 à 419 . La colonne 0 est celle de gauche. La ligne 0 est celle du haut

Soit f la fonction qui à un entier n compris entre 0 et 419 fait correspondre 169n+42 modulo 420

Le pixel repéré par le couple (c;l) est envoyé sur le pixel (f(c);f(l))

Action de la transformation
Nouvelle action de la transformation

Un exemple

On prend le pixel sur la 6e ligne (l=5) et la 9e colonne (c=8). On calcule f(5). Comme 169×5+42=887 et que le reste de la division de 887 par 420 est 47, on a f(5)=47. De même f(8)=134. On en déduit que le pixel de départ va être envoyé sur la 48e ligne et la 135e colonne. Sur l'image de départ, ce pixel a été colorié en rouge, on l'aperçoit en haut à gauche et on peut le retrouver sur l'image suivante.

On le vérifie avec Gimp

Position (8;5)Position (134;47)

Conclusion

La transformation est une bijection : deux pixels différents sont envoyés à des positions différentes. Cette bijection est une involution car composée avec elle-même, elle est l'identité.

Le code

#-*- coding:Latin-1 -*-
 def bijection(m,a,b):
    #creation d une liste nulle de meme longueur que m
    p=[0]*a*b

    for k in range(a*b):
        #on transforme en ligne et colonne
        l=k//a
        c=k%a
        l=(169*l+42)%420
        c=(169*c+42)%420 
            
        p[a*l+c]=m[k]
    return p

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())


r=bijection(r,w,h)
g=bijection(g,w,h)
b=bijection(b,w,h)

#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("mele1.png") 
 
 

fait le 19 juin 2014