J-0
00m
00j
00h
00min
00s

Version interactive avec LaTeX compilé

X ENS Informatique Commune PSI PT 2011

Notez ce sujet en cliquant sur l'étoile
0.0(0 votes)
Logo x-ens
2025_08_29_660f4477586686fd5ad2g

ÉCOLE POLYTECHNIQUE

filières PSI et PT

ÉPREUVE D'INFORMATIQUE

(Durée : 2 heures)
L'utilisation des calculatrices n'est pas autorisée pour cette épreuve.
Le langage de programmation choisi par le candidat doit être spécifié en tête de la copie.
On attachera une grande importance à la concision, à la clarté, et à la précision de la rédaction.

Images en gris

Les ordinateurs et de nombreux dispositifs électroniques (caméras numériques, écrans, etc.) représentent les images comme des ma-
Image A
trices de nombres entiers. Dans ce problème, on se limite aux images rectangulaires en teintes de gris.
En machine, une telle image est la donnée d'une hauteur , d'une largeur , et d'une matrice d'entiers de lignes et colonnes. L'image est divisée en éléments ou pixels définis par leurs numéros de ligne et de colonne . Chaque entier de la matrice définit le ton de gris associé au pixel de coordonnées ( ). Ce ton varie entre zéro, qui rend l'absence de lumière et donc le noir, et une valeur maximale dite profondeur qui rend le blanc. Les valeurs intermédiaires rendent diverses teintes de gris de plus en plus claires. On notera que le pixel de coordonnées est conventionellement situé en haut et à gauche de l'image.
Par exemple, pour cette image , une échelle de 16 teintes de gris allant du noir au blanc, on a et ne possède qu'une seule ligne qui contient les 16 entiers de 0 à 15 en ordre croissant.
Quel que soit le langage dans lequel ils composent, les candidats créeront une image par l'appel de primitive allouer( ). On accédera aux composants d'une image par les notations (hauteur), (largeur), i.P (profondeur) et (matrice). Dans l'énoncé, on accédera aux éléments de la matrice par la notation , sachant que les indices commencent à zéro - un indice de ligne est donc un entier compris entre 0 et au sens large, tandis qu'un indice de colonne est un entier compris entre 0 et au sens large. Enfin les candidats qui choisissent de composer dans un langage typé pourront supposer l'existence d'un type image des images.

Partie I. Opérations élémentaires

Fig. 1: Opérations élémentaires
Question 1 Écrire une fonction inverser( ) qui renvoie l'image inverse de . C'est-à-dire que le ton d'un pixel de la nouvelle image est , où est le ton du pixel correspondant de l'image d'origine. Par exemple, l'image B de la figure 1 résulte de l'application de inverser à l'image A de l'introduction.
Question 2 Écrire une fonction flipH qui renvoie la transformée de l'image par la symétrie d'axe vertical passant par le milieu de l'image. Par exemple, l'image C de la figure 1 résulte de l'application de flipH à l'image A de l'introduction.
Question 3 Écrire une fonction poserV qui prend en arguments deux images et de même largeur et profondeur, et qui renvoie la nouvelle image obtenue en posant sur . Par exemple, l'image D de la figure 1 résulte de l'application de poserV aux images B et C .
Question 4 Écrire une fonction poserH( ) qui prend en arguments deux images et de même hauteur et profondeur, et qui renvoie la nouvelle image obtenue en posant à droite de . Par exemple, l'image E de la figure 1 résulte de l'application de poserH aux images B et C .

Partie II. Transferts

Certaines transformations des images sont simplement l'application d'une fonction aux tons, dont on rappelle qu'ils sont des entiers compris entre 0 et (profondeur de l'image) au sens large. Une telle fonction de transfert peut s'appliquer vers des images dont la profondeur n'est pas nécessairement , mais une nouvelle profondeur. Une fonction de transfert est représentée par la donnée de la profondeur cible et d'un tableau d'entiers de taille , dont les cases contiennent des entiers entre 0 et au sens large.
Question 5 Écrire une fonction transferer qui prend en arguments une image , ainsi qu'une fonction de transfert donnée par un entier et un tableau d'entiers . La fonction transferer renvoie une nouvelle image, de même taille que , de nouvelle profondeur et dont chaque pixel ( ) a pour ton .
Question 6 Écrire une nouvelle fonction inverser (Question 1) qui utilise la fonction transferer de la question précédente.
Fig. 2: Transferts
L'histogramme d'une image de profondeur est un tableau d'entiers de taille tel que compte le nombre de pixels de l'image dont le ton est .
Question 7 Écrire une fonction histogramme qui prend en arguments une image et un tableau d'entiers correctement dimensionné, et qui affecte les cases de pour en faire l'histogramme de . On notera que le contenu initial des cases de est inconnu.
Soit une image de hauteur , de largeur et de profondeur . Soit son histogramme et soit le ton de gris le plus sombre se trouvant dans l'image . On égalise les tons en transformant chaque ton en défini ainsi :
On note que n'est pas défini pour tel que , ce qui n'a pas d'importance, ces tons étant absents de l'image. On note surtout que la valeur de ci-dessus n'est généralement pas un entier. Les candidats seront attentifs à cette difficulté, qu'ils résoudront dans le langage choisi. Ils pourront utiliser la primitive arrondir( ) qui prend un nombre flottant ou un rationnel en argument et renvoie l'entier le plus proche de .
Question 8 Écrire la fonction egaliser(i) qui prend une image en argument et qui renvoie une nouvelle image qui est dont les tons de gris sont égalisés. Par exemple, l'image F de la figure 2 résulte de l'application de egaliser à l'image A.
Question 9 Que renvoie la fonction egaliser appliquée à une image uniformément blanche?
On cherche maintenant à réduire la profondeur d'une image de vers , avec . Une technique consiste à remplacer un ton par , tel que est le plus proche possible de .
Question 10 Écrire une fonction reduire( ) qui renvoie une nouvelle image qui est dont la profondeur est réduite à . Par exemple, les images et I de la figure 2 résultent des réductions à 1,4 et 16 de la profondeur de l'image A,

Partie III. Tramage

Fig. 3: Tramage
Lorsqu'il s'agit d'imprimer nos images, on se retrouve confronté à une difficulté : l'encre est noire, le papier est blanc. Il faut donc transformer les images en tons de gris en images en noir et blanc au sens strict. L'appel reduire est un moyen de procéder, toutefois le résultat n'est pas très satisfaisant - voir l'image G de la figure 2. Cette partie examine la technique du tramage qui produit des images en noir et blanc (c'est-à-dire de profondeur 1) plus plaisantes, telles les images et N de la figure 3.
On peut voir l'image G comme produite par seuillage, les tons de gris plus grands qu'un certain seuil deviennent blancs, tandis que les autres deviennent noirs. Une idée pour améliorer le rendu des images consiste à faire varier le seuil selon les pixels. Cela revient à représenter les seuils par une matrice, en fait par une image que l'on appelle une trame. Une trame est le plus souvent constituée par la répétition d'une petite image, dite motif, répétition selon les axes de coordonnées qui finit par paver toute l'image Par la suite, le seuillage selon une trame sera simplement désigné comme le seuillage selon le motif dont dérive cette trame.
Par exemple, l'image J de la figure 3 est une échelle de gris verticale de profondeur 3 ( , et la matrice est un vecteur colonne contenant les entiers de 0 à 3 du haut vers le bas). Sa répétition produit l'image K. On notera que l'image J est présentée agrandie par rapport à l'image K . Le motif J est adéquat pour seuiller les images de profondeur 4, par exemple l'image H de la figure 2, ce qui donne l'image L de la figure 3.
Question 11 Écrire une fonction tramer qui prend deux images et en arguments, et qui renvoie l'image de profondeur 1 obtenue en seuillant l'image selon le motif . Le seuillage est défini précisément ainsi : étant donnés un ton de l'image et un ton de la trame, on obtient un pixel blanc si et seulement si , et un pixel noir sinon.
Question 12 Écrire une fonction tramerTelevision qui prend en argument une image de profondeur , et qui renvoie l'image de profondeur 1 obtenue en seuillant l'image selon l'échelle de gris verticale de profondeur .
En imprimerie on utilise rarement des trames constituées de lignes horizontales comme la trame . On préfère les trames constituées de lignes inclinées de points, ou trames diagonales. On obtient une trame diagonale de profondeur 15 par répétition du motif représenté ci-dessous, à droite :
Le motif de droite dérive de l'image représentée à gauche. On supposera par la suite qu'une variable globale deuxQuarts contient l'image de gauche.
Question 13 Écrire une fonction tramerJournal(i) qui prend en argument une image de profondeur 16, et qui renvoie l'image de profondeur 1 obtenue en seuillant l'image selon la trame diagonale de profondeur 15. Par exemple, l'image M de la figure 3 résulte de l'application de tramerJournal à l'image I de la figure 2.
Question 14 Indiquer un procédé simple qui permet d'obtenir l'image N de la figure 3 à partir de l'image I de la figure 2 et à l'aide de la trame diagonale de profondeur 15. On notera que l'image N est bien une image de profondeur 1, et qu'elle est représentée réduite (d'un facteur 2) par rapport à l'image M. Coder ensuite votre procédé comme une fonction qui prend une image de profondeur arbitraire en argument.
X ENS Informatique Commune PSI PT 2011 - Version Web LaTeX | WikiPrépa | WikiPrépa