Représentation et traitement des images en OpenGL

Slides:



Advertisements
Présentations similaires
Comment utiliser PowerPoint
Advertisements

( Application Programming Interface)
Chaîne de Synthèse Réel Modélisation Rendu Image Fichier Scène
Premier programme en C :
Tous droits réservés. Reproduction intégrale ou partielle interdite sans autorisation écrite de la partdu titulaire des droits dauteur. Institut de Formation.
Portée des variables VBA & Excel
Les erreurs types à ne pas commettre OpenGL Carina Portella Jean-Philippe Reynier DESS TNI – IDI Année
Transition image classique image numérique
GEF 243B Programmation informatique appliquée
à partir notamment du cours Siggraph 97 et d’autres ….
Lexique des manœuvres de base pour utiliser à PowerPoint
FLSI602 Génie Informatique et Réseaux
L’encodage des images informatiques
La photo numérique S. Laurent – Actic Hautil – 2004 /2005.
Réalisation dun travail concret avec des matrices Afficher un objet 3D sur une surface Lui appliqué des transformations Le voir se transformer suivant.
Chapitre 2 Production électronique
Les requêtes La Requête est une méthode pour afficher les enregistrements qui répondent à des conditions spécifiques. La requête est donc un filtre.
Récursivité.
Algorithmes sur les images dans Excel
II. Chaînage, SDD séquentielles
1 Transformations affines But: fixer le positionnement et lorientation des objets de la scène.
Transformations de visualisation en OpenGL
Représentation numérique de l’information
Le codage des nombres en informatique
TRAITEMENT DE STRUCTURES
SUJETS SPÉCIAUX EN INFORMATIQUE I PIF Contenu du cours Transformations géométriques des objets –Transformations 2D –Transformations entre systèmes.
1.2 Atomes, éléments et tableau périodique
Gestion des événements liés à la fenêtre et aux périphériques dentrée.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
FICHIERS : Définition : Algorithme général:
CHAINE DE CARACTERES : Définition :
2 TP avec l ’aide d ’un modeleur 3D :
Modélisation géométrique à l’aide d’un maillage
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Représentation numérique de l’information
Courbes de Bézier.
1. 2 PLAN DE LA PRÉSENTATION - SECTION 1 : Code HTML - SECTION 2.1. : CSS (Méthode 1) - SECTION 2.2. : CSS (Méthode 2) - SECTION 3 : JavaScript - SECTION.
IFT 6800 Atelier en Technologies d’information
PIF-6003 Sujets spéciaux en informatique I
SIF-1033 Traitement d’image
Calcul des groupes d'homologie d’objets discrets
Application de texture en OpenGL
Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++
TRAITEMENT D’IMAGE SIF-1033.
Texture 2D en PGC++.
L ’acquisition d ’images
Découpage des objets selon le volume de vue
Techniques de points de contrôle en OpenGL : formes de Bézier
PROTOTYPE D’UN PROGRAMME ÉCRIT EN C++ BASÉ SUR OPENGL
Plan cours La notion de pointeur et d’adresse mémoire.
L’essentiel du langage C
Mise en forme en Mathématiques
Listes d’affichage.
Structures des données
Stocker plusieurs valeurs de même type dans une variable
Biologie – Biochimie - Chimie
Création et présentation d’un tableau avec Word 2007
Notions de pointeurs en C
Algorithmes sur les images dans Excel
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
GRAPHISME PAR ORDINATEUR
8PRO100 Éléments de programmation Les pointeurs de caractères.
Cours LCS N°4 Présenté par Mr: LALLALI
GRAPHISME PAR ORDINATEUR SIF Contenu du cours 10 Textures –Définir la texture –Superposition d’une texture sur une surface plane –Superposition.
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Introduction à la programmation graphique
Traitement d’images 420-D78-SW A15 Semaine 02.
L’image Quelques repères sur l’image Quelques repères sur l’image.
Transcription de la présentation:

Représentation et traitement des images en OpenGL

Les images sont représentées à l’aide d’un tableau de « pixels » (noté « pixmap ») où chaque « pixel » désigne une couleur. Ces tableaux de « pixels » peuvent être emmagasinés en mémoire et même copiés d’un endroit à un autre en mémoire. Lorsqu’un tableau de « pixels » est stocké dans la mémoire d’entretien, chaque valeur numérique d’un « pixel » est convertie en un point d’une certaine couleur à l’écran. Rappelons qu’un « pixel » de b bits peut représenter 2b couleurs différentes. En pratique, un « pixel » est représenté de différentes façons : b Description 1 Désigné sous le nom de «bitmap», il se comporte comme un masque. 8 Un « pixel » représente 256 niveaux de gris: 0 (noir) à 255 (blanc) 8 Un « pixel » représente un indice dans un tableau de couleurs. On peut donc représenter en même temps 256 couleurs différentes. 24 Un « pixel » correspond à 3 octets représentant resp. les composantes rouge, vert et bleu d’une teinte. 32 Un « pixel » correspond à 4 octets représentant de nouveau les composantes rouge, vert et bleu d’une teinte, ainsi que le caractère opaque du « pixel » (0 : complètement transparent, 255 : opaque).

Bitmaps et polices de caractères Un bitmap est un tableau rectangulaire de 0 et de 1 servant de masque de dessin pour une région rectangulaire de la fenêtre : si la couleur active est le rouge et le bitmap contient un 1, le pixel correspondant est remplacé par un pixel rouge (ou combiné avec un pixel rouge, selon les opérations prévues). S’il contient un 0, le contenu du pixel n’est pas affecté. L’utilisation la plus courante des bitmaps consiste à dessiner des caractères à l’écran. Position active : void glRasterPos{2 3 4}{s i f d}(TYPE x, TYPE y, TYPE z, TYPE w); void glRasterPos{2 3 4}{s i f d}v(TYPE * coords); Permet de choisir le « pixel » en position (x, y, z, w) comme étant le « pixel » à la position courante. z prend implicitement la valeur 0 et w la valeur 1. Les coordonnées de position sont transformées en coordonnées d’écran exac- tement de la même manière que celles associées à une commande glVertex*(). Après transformation, si la position est à l’extérieur de la fenêtre, elle n’est pas valide. Ex. : glRasterPos2i(20, 20);

Une alternative à glRasterPos. () est glWindowPos Une alternative à glRasterPos*() est glWindowPos*() qui spécifie la position courante en coordonnées de fenêtre, sans transformer ses coordonnées par des matrices de modélisation-visualisation ou de projection, ni découpage. void glWindowPos{2 3}{s i f d}(TYPE x, TYPE y, TYPE z); void glWindowPos{2 3}{s i f d}v(TYPE * coords); z est implicitement positionné à 0.

Dessiner le bitmap : Une fois que vous avez défini la position appropriée, utilisez la commande glBitmap() pour dessiner les données. void glBitmap ( GLsizei largeur, // Largeur en pixels du bitmap. GLsizei hauteur, // Hauteur en pixels du bitmap. GLfloat xo, GLfloat yo, // Origine du bitmap. GLfloat xf, GLfloat yf, // Incréments à ajouter une fois // le bitmap dessiné. const GLubyte * bitmap); // les données sont stockées en caractères // non signés de 8 bits chacun. Dessine le bitmap spécifié par bitmap où l’origine est placée à la position active. Si la position n’est pas valide, rien n’est dessiné. Note : Si vous voulez avancer d’une position sans rien dessiner, appelez glBitmap() en attribuant la valeur NULL au paramètre bitmap et la valeur 0 à Largeur et Hauteur.

Exemple : Remplir l’écran avec la lettre F. #include <windows.h> #include <GL/glut.h> const GLint L = 880; const GLint H = 640; GLubyte Lettre_F[24] = { 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xff, 0xc0, 0xff, 0xc0 }; void Initialisation() glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, L, 0.0, H); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); }

void Affichage() { GLint k = 0; // Permet de contrôler les modes de stockage des pixels supportés // par OpenGL. glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // La couleur d’affichage du bitmap correspond à la couleur active lors de // l’appel de glRasterPos2i(). glRasterPos2i(0, 0); for (int j = 0; j < H / 16; j++) for (int i = 0; i < L / 11; i++) glBitmap(10, 12, 0.0, 0.0, 11.0, 0.0, Lettre_F); glBitmap(0, 0, 0.0, 0.0, - L, 16.0, NULL); }; glFlush(); }

void main(int argc, char** argv) { glutInit(&argc, argv); glutInitWindowSize(L, H); glutInitWindowPosition(0, 0); glutCreateWindow("Affichage de la lettre F"); Initialisation(); glutDisplayFunc(Affichage); glutMainLoop(); }

Images Une image est semblable à un bitmap, mais au lieu de contenir un bit par pixel dans une région de l’écran, l’image peut contenir une couleur complète (R, V, B , A) dans chaque pixel. Lire, écrire et copier des pixels glReadPixels( GLint x, GLint y, GLsizei Nb_de_lignes, GLsizei Nb_de_colonnes, GLenum format, GLenum type, GLvoid * pTableau_de_pixels); Permet de copier en mémoire dans un tableau dynamique pointé par « pTableau_de_pixels » une région rectangulaire de « pixels » en position (x, y) en coordonnées de fenêtre de la mémoire d’entretien dont la dimension est : Nb_de_lignes X Nb_de_colonnes. Chaque « pixel » représente une couleur selon le modèle défini par format. Le paramètre type indique le type de données de chaque élément. Ex. : GLubyte image[lignes][colonnes][3]; glReadPixels(0, 0, lignes, colonnes, GL_RGB, GL_UNSIGNED_BYTE, image);

Note : (somme pondérée des valeurs R, V et B) Il se peut par ex. qu’une image soit stockée dans un format, mais que la fenêtre requière un format différent.

glDrawPixels( GLsizei Nb_de_lignes, GLsizei Nb_de_colonnes, GLenum format, GLenum type, const GLvoid * pTableau_de_pixels); Permet de copier en mémoire d’entretien un tableau de « pixels » de dimension Nb_de_lignes X Nb_de_colonnes pointé par pTableau_de_pixels. Ce tableau de « pixels » occupe une région de même dimension dans la mémoire d’entretien où le coin inférieur gauche correspond au « pixel » à la position courante. glCopyPixels( GLint x, GLint y, GLsizei Nb_de_lignes, GLsizei Nb_de_colonnes, GLenum tampon); Permet de copier une région rectangulaire de la mémoire d’entretien de dimension Nb_de_lignes X Nb_de_colonnes dont le coin inférieur gauche est en position (x, y) dans une autre région de la mémoire d’entretien de même dimension dont le coin inférieur gauche correspond au « pixel » à la position courante. Le dernier paramètre renferme GL_COLOR, GL_STENCIL ou GL_DEPTH, spécifiant le tampon d’image utilisé.

Exemple : #include <windows.h> #include <GL/glut.h> const GLint L = 640; const GLint H = 640; const GLint Nb_lignes_echiquier = 64; const GLint Nb_colonnes_echiquier = 64; GLubyte tableau_echiquier[Nb_lignes_echiquier][Nb_colonnes_echiquier][3]; void Echiquier() { int i, j, c; for (i = 0; i < Nb_lignes_echiquier; i++) for (j = 0; j < Nb_colonnes_echiquier; j++) c = 255; if ((i / 8 + j / 8) % 2 == 0) c = 0; tableau_echiquier[i][j][0] = (GLubyte) c; tableau_echiquier[i][j][1] = (GLubyte) c; tableau_echiquier[i][j][2] = (GLubyte) c; }

void Initialisation() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, L, 0.0, H); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); Echiquier(); } void Affichage() glRasterPos2i(320, 320); glDrawPixels(Nb_lignes_echiquier, Nb_colonnes_echiquier, GL_RGB, GL_UNSIGNED_BYTE, tableau_echiquier); glFlush();

Transformations d’images Opérations de transfert des pixels. OpenGL peut effectuer plusieurs opérations sur les images pendant que celles-ci sont transférées de la mémoire vers la mémoire d’entretien et vice versa. Voir glPixelTransfer*() et glPixelMap*(). Agrandir, réduire ou réfléchir une image. Normalement, chaque pixel d’une image est écrit dans un pixel à l’écran. Vous pouvez cependant agrandir, réduire ou réfléchir une image en utilisant glPixelZoom(). void glPixelZoom(GLfloat sx, GLfloat sy); Permet de fixer les facteurs d’échelle dans les directions x et y où un « pixmap » sera affiché (glDrawPixels() et glCopyPixels()). Ces facteurs valent 1 par défaut. Des facteurs négatifs réfléchissent l’image autour de la position active. Les « pixmaps » ne sont pas modifiés comme tels; ce sont les images produites qui sont réduites ou agrandies.

Exemple : void Initialisation() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, L, 0.0, H); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); Echiquier(); }

Exemple : void Affichage() { glRasterPos2i(320, 320); glDrawPixels(Nb_lignes_echiquier, Nb_colonnes_echiquier, GL_RGB, GL_UNSIGNED_BYTE, tableau_echiquier); glRasterPos2i(480, 480); glPixelZoom(2.0, 2.0); glCopyPixels(320, 320, Nb_lignes_echiquier, Nb_colonnes_echiquier, GL_COLOR); glRasterPos2i(160, 160); glPixelZoom(-2.0, -2.0); glFlush(); }

Appliquer une rotation de 90°, 180° ou 270° à une image : opération élémentaire. Appliquer une transformation quelconque T à une image. Le problème est beaucoup plus difficile. L’approche la plus simple est la suivante : pour chaque « pixel » p de l’image transformée, la couleur appropriée est celle du « pixel » en position T-1(p) de l’image originale. L’image transformée peut donner lieu à des imprécisions importantes. Comparaisons entre « pixmaps » Il s’agit d’analyser les différences entre 2 « pixmaps ». Remplissage de régions dans un « pixmap » Nous pouvons dans certains cas identifier dans un « pixmap » des objets élémentaires tels que des polygones, des cercles ou encore, une région de « pixels » avec les mêmes caractéristiques. Nous voulons aussi être capable de colorer de telles régions. Opérations logiques sur les « pixmaps » Les tableaux de « pixels » sont combinés entre eux « pixels » par pixels » comme précédemment mais, cette fois, des opérations logiques sont effectuées bit par bit. On peut utiliser les opérateurs logiques de C++ ou des fonctions d’OpenGL.

Combinaison de « pixmaps » entre eux Il s’agit d’effectuer une opération sur 2 tableaux de « pixels », « pixel » par « pixel », comme suit : C[i][j]  A[i][j]  B[i][j] pour tout i, j où  désigne l’opération à effectuer. Exemples : 1. Moyenne de 2 images C[i][j]  ½ (A[i][j] + B[i][j]) pour tout i, j 2. Différence de 2 images C[i][j]  A[i][j] - B[i][j] pour tout i, j. 3. Généralisation de la moyenne de 2 images C[i][j]  (1 – f) A[i][j] + f B[i][j] pour tout i, j. f = 0.0 f = 0.25 f = 0.5 f = 0.75 f = 1.0

Combinaison d’une image source S avec une image destination D selon le niveau de transparence de S, où la résultante sera dans D. Pour tout k = 0, 1, 2 // k désigne resp. les composantes rouge, vert et bleu. D[i][j][k]  ij S[i][j][k] + (1 - ij) D[i][j][k] pour tout i, j où ij = S[i][j][3] / 255 = niveau de transparence / 255. Exemple : Les « pixels » du dragon de S ont un facteur de transparence de 255 (opaque), les « pixels » du masque de S ont un facteur de transparence de 128 (semi-transparent), tandis que les autres « pixels » de S sont complètement transparents (facteur de transparence de 0). S D

En OpenGL, la fonction glBlendFunc permet de jouer ce rôle. De plus, on peut fixer le facteur de transparence d’un sommet à l’aide de la fonction glColor4f(r, v, b, alpha) où alpha  [0, 1] (1 est la valeur par défaut).