ISN Nice TP JAVA : représenter des images 2012

Transcription

ISN Nice TP JAVA : représenter des images 2012
ISN Nice
TP JAVA : représenter des images
2012-2013
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 Nice
TP JAVA : représenter des images
2012-2013
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 3020.
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 Nice
TP JAVA : représenter des images
2012-2013
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 Nice
TP JAVA : représenter des images
2012-2013
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