Transformations du photomaton et du boulanger

Documents pareils
IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

avec des nombres entiers

Initiation à la programmation en Python

Programmation C++ (débutant)/instructions for, while et do...while

Licence Sciences et Technologies Examen janvier 2010

Introduction à MATLAB R

Fonctions linéaires et affines. 1 Fonctions linéaires. 1.1 Vocabulaire. 1.2 Représentation graphique. 3eme

Projet Matlab : un logiciel de cryptage

Mathématiques et petites voitures

Fonctions de plusieurs variables

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Factorisation Factoriser en utilisant un facteur commun Fiche méthode


RÉALISATION DE GRAPHIQUES AVEC OPENOFFICE.ORG 2.3

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

Découverte de Python

MODULES 3D TAG CLOUD. Par GENIUS AOM

Statistique : Résumé de cours et méthodes

TP : Gestion d une image au format PGM

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

TP 1. Prise en main du langage Python

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Programme Compte bancaire (code)

DETERMINER LA LARGEUR DE PAGE D'UN SITE et LES RESOLUTIONS d'ecran

Algorithmique et programmation : les bases (VBA) Corrigé

Initiation à l algorithmique

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

V- Manipulations de nombres en binaire

Programmer en JAVA. par Tama

TD3: tableaux avancées, première classe et chaînes

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Python - introduction à la programmation et calcul scientifique

Groupe symétrique. Chapitre II. 1 Définitions et généralités

Opérations de base sur ImageJ

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours 7 : Utilisation de modules sous python

Exo7. Matrice d une application linéaire. Corrections d Arnaud Bodin.

Utilisation d objets : String et ArrayList

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Examen Médian - 1 heure 30

Exercices Types Algorithmique et simulation numérique Oral Mathématiques et Algorithmique Banque PT Propositions de réponses

1. Structure d'un programme FORTRAN 95

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

1 Recherche en table par balayage

Chapitre 2. Eléments pour comprendre un énoncé

La boucle for La boucle while L utilisation du if else. while (condition) { instruction(s) }

Suites numériques 3. 1 Convergence et limite d une suite

Algorithmique et Programmation, IMA

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Cours de Systèmes d Exploitation

Chapitre 2 Devine mon nombre!

Programmation en Java IUT GEII (MC-II1) 1

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

INF 321 : mémento de la syntaxe de Java

Introduction au langage C

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

DM 1 : Montre Autoquartz ETA

Représentation d un entier en base b

Claude Delannoy. 3 e édition C++

TP, première séquence d exercices.

Chapitre 3. Quelques fonctions usuelles. 1 Fonctions logarithme et exponentielle. 1.1 La fonction logarithme

SINE QUA NON. Découverte et Prise en main du logiciel Utilisation de bases

Créer son questionnaire en ligne avec Google Documents

Les structures de données. Rajae El Ouazzani

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Plan du cours. Historique du langage Nouveautés de Java 7

Optimisation, traitement d image et éclipse de Soleil

CH IV) Courant alternatif Oscilloscope.

Traitement bas-niveau

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

STAGE IREM 0- Premiers pas en Python

Présentation du langage et premières fonctions

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

Algorithme des fourmis appliqué à la détection et au suivi de contours dans une image

Traitement par lot redimensionner des images

Corrigé des exercices sur les références

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Soit la fonction affine qui, pour représentant le nombre de mois écoulés, renvoie la somme économisée.

Java Licence Professionnelle CISII,

Cours d algorithmique pour la classe de 2nde

Programmation avec des objets : Cours 7. Menu du jour

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Solutions du chapitre 4

ACTIVITÉ DE PROGRAMMATION

HTML. Notions générales

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Structure du format BMP, sa lecture, sa construction et son écriture

L ALGORITHMIQUE. Algorithme

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

as Architecture des Systèmes d Information

1 Savoirs fondamentaux

Erratum de MÉCANIQUE, 6ème édition. Introduction Page xxi (milieu de page) G = 6, m 3 kg 1 s 2

BACCALAUREAT GENERAL MATHÉMATIQUES

Exercice 1 Trouver l équation du plan tangent pour chaque surface ci-dessous, au point (x 0,y 0,z 0 ) donné :

Bac Blanc Terminale ES - Février 2011 Épreuve de Mathématiques (durée 3 heures)

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Cours IV Mise en orbite

Programmation linéaire

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Transcription:

Corrigé informatique commune Transformations du photomaton et du boulanger Question 1. symétrie d axe vertical On utilise les relations x = x et y = q 1 x pour définir la fonction : def symétrie(img): img2[x, q 1 y] = img[x, y] Question 2. rotation d un quart de tour On utilise les relations x = y et y = p 1 x pour définir la fonction : def rotation(img): img2[y, p 1 x] = img[x, y] 1. Transformation du photomaton Question 3. La transformation du photomaton utilise les formules : (x/2,y/2) (x,y (x/2, y/2 + q/2) ) = ( x/2 + p/2, y/2) ( x/2 + p/2, y/2 + q/2) si x et y sont pairs si x est pair et y impair si x est impair et y pair si x et y sont impairs Pour simplifier la fonction principale on commence par définir la fonction : def photomat(k, d): if k % 2 == 0: return k // 2 else: return k // 2 + d // 2 ce qui conduit à la définition suivante : def photomaton(img): img2[photomat(x, p), photomat(y, q)] = img[x, y] http://info-llg.fr/ page 1

Question 4. Le script suivant permet de visualiser l ensemble des transformations avant retour à l image initiale : img = picasso while True: img = photomaton(img) plt.imshow(img) plt.show() if (img == picasso).all(): break Cette image, de taille 256 256, a une période égale à 8. Question 5. Pour calculer la période d une image quelconque on utilise la fonction : def periode_photomaton(img): n, t = 1, 2 while (t 1) % (p 1)!= 0 or (t 1) % (q 1)!= 0: n += 1 t *= 2 return n Ainsi, la période d une image de taille 400 360 (la taille de l image matisse.png) est égale à 3 222. Question 6. Pour chaque pixel on doit appliquer n fois la fonction photomat sur chacune de ses coordonnées. Or il se trouve que l abscisse d un pixel a une période qui ne dépend que de sa valeur, et il en est de même pour son ordonnée. En d autres termes, tous les points situés sur une ligne verticale reviennent sur cette ligne au bout du même nombre d itérations, et il en est de même pour les lignes horizontales. Il suffit donc de faire le calcul une bonne fois pour toute pour chacun des indices de ligne et pour chacun des indices de colonne pour pouvoir ensuite déterminer rapidement où situer un pixel après n itérations. def photomaton2(img, n): ligne = [] u = x for _ in range(n): u = photomat(u, p) ligne.append(u) colonne = [] v = y for _ in range(n): v = photomat(v, q) colonne.append(v) img2[ligne[x], colonne[y]] = img[x, y] Ceci permet d obtenir instantanément la 180 e itération de l image matisse.png (voir figure 1). Cette image est de taille 400 360. Le plus petit entier n pour lequel 399 divise 2 n 1 est n = 18, tandis que le plus petit entier n pour lequel 359 divise 2 n 1 est n = 179. Puisque 180 0 mod (18), tous les pixels ont retrouvé leurs lignes de départ initiales ; puisque 180 1 mod (179), les colonnes n ont subies qu une transformation par rapport à leurs positions initiales. 2. Transformation du boulanger Question 7. Lors de l «aplatissement» de l image, le pixel de coordonnées (x,y) se retrouve au point de coordonnées : (x/2,2y) si x est pair (x 1,y 1 ) = dans l image intermédiaire de dimensions p/2 2q. ( x/2, 2y + 1) si x est impair page 2

Figure 1 La 180 e itération de l image matisse.png. Il faut ensuite «replier» l image, ce qui conduit aux formules : (x,y (x ) = 1,y 1 ) si y 1 < q (p 1 x 1,2q 1 y 1 ) si y 1 > q La fonction qui calcule les nouvelles coordonnées d un pixel après transformation se définit donc par : def boulange(x, y, p, q): x1, y1 = x // 2, 2 * y + x % 2 if y1 < q: return x1, y1 else: return p 1 x1, 2 * q 1 y1 On en déduit la fonction : def boulanger(img): img2[boulange(x, y, p, q)] = img[x, y] Question 8. On visualise l ensemble des transformations de l image picasso.png à l aide du script : img = picasso while True: img = boulanger(img) plt.imshow(img) plt.show() if (img == picasso).all(): break Il faut maintenant 17 itérations avant de retrouver l image initiale. Et pour les plus rapides Question 9. On obtient la période d un pixel en utilisant la fonction : http://info-llg.fr/ page 3

def periode_pixel(x, y, p, q): n = 1 x1, y1 = boulange(x, y, p, q) while (x1, y1)!= (x, y): n += 1 return n Question 10. Une fois la période calculée pour un pixel, on reporte sa valeur à tous les pixels de son orbite, et on ne fait le calcul que pour les pixels dont on ne connait pas encore la période : def tableau_des_periodes(img): r = np.zeros((p, q), dtype=int) if r[x, y] == 0: s = periode_pixel(x, y, p, q) x1, y1 = x, y for _ in range(s): r[x1, y1] = s return r Question 11. Pour obtenir la période d une image on commence par extraire toutes les valeurs distinctes du tableau des périodes puis on calcule le ppcm de ces valeurs. def ppcm(a, b): return a * (b // gcd(a, b)) def periode_boulanger(img): r = tableau_des_periodes(img) lst = [] if r[x, y] not in lst: lst.append(int(r[x, y])) m = 1 for n in lst: m = ppcm(m, n) return m On observera une petite subtilité dans le code ci-dessus : lorsqu on crée un tableau numpy contenant des entiers, ces derniers sont codés sur 64 bits ( ils appartiennent au type int64) et ne peuvent donc dépasser 2 63 1 ; c est le cas du tableau des périodes. Or pour de nombreuses images le ppcm des valeurs contenues dans le tableau des périodes dépasse cette borne. Je profite donc de leur recopie dans la liste lst pour les convertir au format int (qui lui n est pas borné) de manière à ce que le calcul de ppcm soit correct. Avec cette fonction on obtient la période de l image matisse.png : >>> periode_boulanger(matisse) 896568225229163143800 À raison de 10 images par seconde il faudrait plus de 28 milliards de siècles pour afficher toutes ses transformations avant de retrouver l image initiale. Question 12. Pour chaque pixel (x, y) non encore traité on calcule sa position finale en itérant la fonction boulange un nombre de fois égal à n mod r(x,y). On traite ensuite les pixels (x 1,y 1 ) de son orbite en poursuivant l itération de la fonction boulange et en remplaçant r[x 1,y 1 ] par zéro de manière à détecter les pixels qui ont été traités. page 4

def boulanger2(img, n): r = tableau_des_periodes(img) if r[x, y]!= 0: u, v = x, y for _ in range(n % r[x, y]): u, v = boulange(u, v, p, q) x1, y1 = x, y for _ in range(r[x, y]): img2[u, v] = img[x1, y1] u, v = boulange(u, v, p, q) r[x1, y1] = 0 Pour répondre à la dernière question nous avons besoin d une fonction qui calcule le pourcentage de pixels identiques que partagent deux images : def pixels_communs(img1, img2): p, q = img1.shape[0], img1.shape[1] s = 0 if (img1[x, y] == img2[x, y]).all(): s += 1 print('pourcentage de pixels communs : {} %'.format(np.floor(s / p / q * 100))) Figure 2 Les itérations de l image matisse.png pour n = 67 911 et n = 1 496 775 000 382 576 200. On obtient : >>> pixels_communs(matisse, boulanger2(matisse, 67911)) pourcentage de pixels communs : 47.0 % >>> pixels_communs(matisse, boulanger2(matisse, 1496775000382576200)) pourcentage de pixels communs : 89.0 % http://info-llg.fr/ page 5