Déformer une image

ExempleFaire tourner l'image

Recopiez, analysez et exécutez ce programme

1
def setup():
2
    global monImage
3
    size(256,256)
4
    monImage = loadImage("monalisa_256.jpg")
5
    image(monImage,0,0)
6
7
def draw():
8
    pass
9
10
def keyPressed():
11
    newImage = createImage(monImage.width, monImage.height, RGB)
12
    for y in range(256):
13
        for x in range(256):
14
            couleur = get(x,y)
15
            newImage.set(255-x,y,couleur)
16
    image(newImage,0,0)
17
    
18
def keyReleased():
19
    image(monImage,0,0)
20
    
21
monImage=0

ComplémentQuelques explications

Le code intéressant se trouve dans la fonction keyPressed()

  • On commence par créer une nouvelle image vide de taille identique à monImage. Cette image sera référencée par la variable newImage. Voici comment on procède :

    newImage = createImage(monImage.width, monImage.height, RGB)

  • ensuite, à l'aide de deux boucles imbriquées, on lit le pixel aux coordonnées (x,y) de l'écran et on l'écrit dans des nouvelles coordonnées sur l'image newImage. Ici, on remplace x par 255-x de manière à ce qu'un pixel à droite se retrouve à gauche et réciproquement. Cela revient à faire une symétrie selon un axe vertical.

  • Pour finir, on affiche la nouvelle image newImage que l'on vient de compléter avec la fonction image(newImage,0,0)

En conservant la coordonnée y à l'identique et en remplaçant x par 255-x, on obtient donc cet effet miroir :

Exercice Im7 : Autres symétries

1. Modifiez le programme ci-dessus afin que l'appui sur une touche génère cette image :

2. Modifiez le programme ci-dessus afin que l'appui sur une touche génère cette image :

ExempleModifier la taille de l'image

Recopiez, analysez et exécutez ce programme :

1
def setup():
2
    size(256,256)
3
    monImage = loadImage("monalisa_256.jpg")
4
    newImage = createImage(monImage.width, monImage.height, RGB)
5
    for y in range(256):
6
        for x in range(256):
7
            couleur = monImage.get(x,y)
8
            newImage.set(x/2,y/2,couleur)
9
    image(newImage,0,0)
10
11
def draw():
12
    pass

ComplémentQuelques explications

Comme dans l'activité précédente, on travaille sur deux variables de type image :

  • monImage contient l'image d'origine

  • newImage contient la nouvelle image qui sera affichée après calcul par l'instruction image(newImage,0,0)

Exercice Im8 : Mona Lisa au photomaton

Tout cet espace vide, c'est quand même dommage ! et si nous le complétions un peu ... Voici dans cet exercice, deux manières de combler cet espace.

1. Dans un premier temps, vous comblerez l'espace vide en dupliquant l'image d'origine comme ci-contre.

2. Dans un second temps, vous comblerez l'espace vide en dupliquant l'image d'origine mais avec les symétries indiquées sur l'image ci-contre.

ExempleAgrandissement

Dans cette partie, nous allons faire l'opération inverse de la partie précédente : zoomer sur l'image.

L'objectif à atteindre sera l'image ci-dessous dans laquelle la portion de l'image entre les pixels 0 et 127 (en x et y) sera agrandie sur la totalité de la nouvelle image newImage.

Si vous vous rappelez quelle opération mathématique nous a permis de réduire l'image, vous devinerez sans peine celle qui nous permettra de l'agrandir !

Recopiez, analysez et exécutez le code ci-dessous :

1
def setup():
2
    size(256,256)
3
    monImage = loadImage("monalisa_256.jpg")
4
    newImage = createImage(monImage.width, monImage.height, RGB)
5
    for y in range(128):
6
        for x in range(128):
7
            couleur = monImage.get(x,y)
8
            newImage.set(x*2,y*2,couleur)
9
    image(newImage,0,0)
10
11
def draw():
12
    pass

ComplémentQuelques explications

  • Puisque pour rétrécir la joconde dans l'activité précédente, nous avons divisé les coordonnées (x,y) par 2, pour l'agrandir, nous les avons multiplié par 2.

  • Puisque notre image fait une taille de 256 pixels, inutile de dépasser les valeurs de 128 pour x et y car en les multipliant par deux, ils devront rester plus petit que 256.

Mais il y a un problème : notre joconde est toute pâle.

Zoomons un peu sur l'image : voici ce que nous obtenons. En effet, l'effet d'agrandissement fait que nous n'écrivons qu'un pixel sur deux dans notre nouvelle image, ce qui laisse un espace vide entre chaque pixel. C'est tout à fait normal, en zoomant, notre image va perdre en définition - c'est inévitable.

Exercice Im9 : Améliorer le zoom

1. Pour améliorer un peu les choses, vous allez combler les pixels manquants par une recopie du pixel voisin. Cela n'améliorera pas la définition de l'image mais cela permettra d'éliminer l'effet de grille et d'assombrissement de l'image. Vous devrez obtenir quelque chose ressemblant à ceci :

2. Zoomons plus fort. Toujours selon le même principe de combler les espaces vides, vous allez à présent faire un zoom x4 sur la zone du visage (je vous laisse deviner l’opération mathématique à effectuer sur les coordonnées d'origine...). L'image à obtenir sera celle-ci

Le point supérieur gauche est le point de coordonnées (80,70)