Il s'agit de changer de place tous les pixels d'une image.
On part d'une image carrée de côté 420 pixels , les pixels sont repérés par un couple (c;l) où 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 |
![]() |
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) |
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é.
#-*- 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