ISN TP JAVA : représenter des images 2014
Transcription
ISN TP JAVA : représenter des images 2014
ISN TP JAVA : représenter des images 2014-2015 Objectifs : Appréhender le codage d’images bitmap Codage de transformations élémentaires (négatif, variations de luminosité et de contraste, ….) sur des images en noir et blanc, en niveaux de gris et en couleurs Logiciel utilisé : Proglet JavaScool CodagePixels. Consignes : On nommera chacun des programmes demandés selon la nomenclature suivante : TP_{MALHERBE}_II_b : programme de la question II b) pour l’élève MALHERBE . I On commence par « allumer » des pixels avec l’instruction SetPixel Voici un programme JavaScool qui utilise la proglet CodagePixels. void main() { reset(10,10); setPixel(-3,5,0) ; } a) Lancer la Proglet CodagePixels, coder ce petit programme, l’exécuter et décrire ce qu’il affiche. b) En s’aidant de la documentation de la Proglet : décrire ce que fait l’instruction reset(10,10) décrire ce que fait l’instruction setPixel(-3,5,0) ainsi que ses 3 paramètres. c) Modifier le programme pour afficher un Pixel de coordonnées (2 ;3) d) Tester le troisième paramètre de setPixel() avec des valeurs comprises entre 0 et 255 et décrire l’affichage produit Expérimenter comment afficher un pixel en couleurs. e) Modifier la résolution de l’image : reset(50,50). Qu’observe-t-on ? II On continue par afficher des lignes avec une boucle a) Proposer un programme qui affiche une ligne horizontale d’épaisseur 1 pixel et d’ordonnée fixée. b) Proposer un programme qui affiche une ligne verticale d’épaisseur 1 pixel et d’ordonnée fixée. c) Question bonus : Proposer un programme qui produit l’affichage suivant (en respectant les deux couleurs utilisées) 1 ISN TP JAVA : représenter des images 2014-2015 III On crée des carrés avec des bandes uniformes, un damier, un échiquier et le drapeau français ! a) Proposer deux programmes pour créer une image de ce type (bandes verticales ou horizontales alternées) Indice : utiliser deux boucles imbriquées (une pour parcourir les lignes et l’autre les colonnes de l’image) b) S’inspirer du programme précédent pour créer le damier d’un jeu de dames puis un échiquier. c) Question bonus : proposer un programme qui affiche le drapeau français dans une image de taille 3020. d) Question bonus : proposer un programme qui affiche le nuancier des niveaux de gris de la palette utilisée par la Proglet CodagePixels. Indication : il est plus judicieux d’utiliser une seule boucle parcourant les 256 niveaux de gris et de calculer les coordonnées du pixel correspondant à afficher. 2 ISN TP JAVA : représenter des images 2014-2015 IV Appliquer des transformations sur une image 1) Sur une image en niveaux de gris void main(){ String image = "http://javascool.gforge.inria.fr/documents/sketchbook/codagePixels/doisneaubuffon.jpg"; load(image); if(readBoolean("On traite l'image ?")) { for (int i=-getHeight();i<=getHeight();i++) for (int j=-getWidth();j<=getWidth();j++) { int pix = getPixel(i,j); setPixel(i,j,255 - pix); } } } a) Coder ce programme avec la proglet CodagePixels de JavaScool et décrire ce que fait ce programme. Préciser l’utilité des fonctions getHeight() et getWidth() dans les boucles. Préciser ce que fait l’instruction pix = getPixel(i ;j) ; Préciser ce que fait l’instruction setPixel(i,j,255 - pix); b) Augmenter ou baisser la luminosité d'une image revient à ajouter ou soustraire une valeur constante à la valeur de chaque pixel. Faire varier la luminosité de l’image en modifiant le programme précédent. Que se passe-t-il si on choisit setPixel(i,j,pix + 255); et pourquoi ? Que se passe-t-il si on choisit setPixel(i,j,pix - 255); et pourquoi ? c) Augmenter ou baisser le contraste d'une image revient à multiplier ou diviser par un gain constant la valeur de chaque pixel. essayez en modifiant la fonction f(). Faire varier le contraste de l’image en modifiant le programme précédent. Que se passe-t-il si on choisit setPixel(i,j,0.5*pix); et pourquoi ? Que se passe-t-il si on choisit setPixel(i,j,0*pix); et pourquoi ? Que se passe-t-il si on choisit setPixel(i,j, 100 * (pix - 128)); et pourquoi ? 3 ISN TP JAVA : représenter des images 2014-2015 2) Sur une image en couleurs On se propose d’écrire un programme JavaScool qui transforme une image en couleurs vers une image en niveaux de gris. A l’aide de l’instruction int rgb[] = getPixelColor(i,j), on déclare et récupére un tableau nommé rgb dont les 3 premiers indices contiennent les composantes RGB du pixel de coordonnées (i,j) de l’image en couleur. Principe de l’algorithme de transformation d’une image en couleurs vers une image en niveaux de gris : Pour chaque pixel, on fait la moyenne des 3 composantes R, G et B, et on remplace ce pixel avec cette moyenne pour chaque composante R, G et B. a) Ecrire un programme JavaScool qui réalise cette transformation et le tester avec une image couleur de votre choix prise sur Internet. b) A ton avis, est-il possible de réaliser facilement l’opération inverse : à partir d’une image en niveaux de gris, récupérer l’image en couleurs correspondante ? Argumente ta réponse. 4