Représentations d`image

Transcription

Représentations d`image
DESS GI / option CHM
Analyse et synthese d'images
TD1
Manipulations d'images
Dans ce TD, nous allons etudier les formats de chiers d'images PBM,
qui sont largement repandus en raison de leur simplicite. Nous eectuerons
quelques operations simples sur ces formats : lecture, ecriture, conversion et
achage.
1 Les formats "portable map"
Les formats de chiers d'images PBM, PGM et PPM, respectivement :
portable bitmap, portable grayscalemap et portable pixmap, orent une
solution simple a tout programmeur confronte au probleme de la manipulation de chiers d'images. Dans ces formats, une image est consideree comme
une matrice dont les valeurs representent l'illumination en chaque pixel de
l'image : noir ou blanc (PBM), un niveau de gris (PGM) ou trois niveaux
de couleurs RGB : rouge, vert, bleu (PPM).
Denition
Les chiers correspondants sont constitues des elements suivants :
1. Un "nombre magique" pour identier les type du chier : P1 ou P4
pour PBM, P2 ou P5 pour PGM et P3 ou p6.
2. Un caractere d'espacement (blanc, TABs, CRs, LFs).
3. La largeur de l'image (valeur decimale, codee en ASCII) suivie d'un
caractere d'espacement, la longueur de l'image (valeur decimale, ASCII)
suivie d'un caractere d'espacement.
4. Uniquement pour PGM et PPM : l'intensite maximum (valeur decimale comprise entre 0 et 255, codee en ASCII) suivie d'un caractere
d'espacement.
5. Largeur hauteur nombres. Ces nombres sont soit des valeurs decimales codees en ASCII et separees par des espacements dans le cas
des formats P1, P2, P3, soit directement les valeurs binaires sur 1 ou
[email protected], [email protected]
DESS GI / option CHM
Analyse et synthese d'images
2 octets dans le cas des formats P4, P5, P6. Dans ce dernier cas, il
n'y pas de caracteres d'espacement entre les valeurs.
Remarques :
Les lignes commencant par le caractere "#" sont ignorees.
Les lignes contiennent moins de 70 caracteres.
Exemples
P1
# feep.pbm
24 7
0 0 0 0 0 0
0 1 1 1 1 0
0 1 0 0 0 0
0 1 1 1 0 0
0 1 0 0 0 0
0 1 0 0 0 0
0 0 0 0 0 0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
1
0
1
0
1
0
0
1
0
1
0
1
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
1
0
1
0
1
0
0
1
0
1
0
1
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
1
0
1
0
0
0
0
1
0
1
0
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
0
Fichier PBM dune image 247 dont les valeurs sont codees en ASCII
P2
# feep.pgm
24 7
15
0 0 0 0
0 3 3 3
0 3 0 0
0 3 3 3
0 3 0 0
0 3 0 0
0 0 0 0
0
3
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7
7
7
7
7
0
0
7
0
7
0
7
0
0
7
0
7
0
7
0
0
7
0
0
0
7
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 0 0 0
11 11 11 11
11 0 0 0
11 11 11 0
11 0 0 0
11 11 11 11
0 0 0 0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 0 0 0
15 15 15 15
15 0 0 15
15 15 15 15
15 0 0 0
15 0 0 0
0 0 0 0
Fichier PGM d'une image 247. Les valeurs d'intensite codees en ASCII
sont au maximum de 15
P3
# feep.ppm
4 4
15
0 0 0
0 0 0
0 0 0
0 15 7
0 0 0
0 0 0
15 0 15
0 0 0
0 0 0
0 0 0
0 15 7
0 0 0
15
0
0
0 15
0 0
0 0
0 0 0
[email protected], [email protected]
0
0
0
0
0
0
0
DESS GI / option CHM
Analyse et synthese d'images
Fichier PPM d'une image 44. Les valeurs d'intensite codees en ASCII
sont au maximum de 15
2 Exercice 1
Recopiez le repertoire :
~eboyer/Enseignements/DESS_GI/ASI/TD1/
Ce repertoire contient les squelettes de programmes C de conversion entre
les formats presentes ainsi qu'un exemple de conversion : le programme
pxmtopxm (source en annexe).
1. Testez le programme sur le chier test.pbm. Quel type de conversion
ce programme eectue ?
2. De quelle maniere est stockee l'image dans le programme ?
3. A quoi servent les fonctions pm getc et pm getint du chier Util.c ?
4. Quel sont les types impliques pour manipuler les intensites ? dans le
cas de valeurs decimales codees en ASCII (P1, P2, P3) ? dans le cas
de valeurs binaires (P4, P5, P6) ?
5. Quelle couleur est associee a la valeur d'intensite maximum ?
3 Exercice 2
Il s'agit ici de completer le programme de conversion entre les formats PGM
(c'est a dire de P2 vers P5 ou de P5 vers P2) : pgmtopgm.c (source en
annexe).
Notes : on utilisera le Makele du r
epertoire pour la compilation (avec
gmake) ainsi que les utilitaires fournies dans Util.c pour completer ce programme. Pour visualiser les dierents chiers, on utilisera le programme
XV.
4 Exercice 3
Le format de chier d'images PGM permet de stocker des images en niveaux
de gris. Proposez un algorithme de conversion au format PBM, ecrivez le
programme c pgmtopbm correspondant.
[email protected], [email protected]
DESS GI / option CHM
Analyse et synthese d'images
5 Exercice 4
De la m^eme maniere, le format de chier d'images PPM permet de stocker
des images en niveaux de couleurs RGB. Proposez un algorithme de conversion au format PGM, c'est a dire stocker les trois niveaux de couleurs sur
un seul niveau. E crivez le programme c ppmtopgm correspondant.
6 Exercice 5
Au vu des manipulations precedentes, que pouvez-vous conclure sur les avantages et inconvenients de ces formats de chiers d'images ?
[email protected], [email protected]
DESS GI / option CHM
Analyse et synthese d'images
7 Annexes
Le fichier Util.h :
/*
* Entete des utilitaires de PBM+
*
* E.B. 12/98
*/
#ifndef _Util_h
#define _Util_h
typedef unsigned char bit;
typedef unsigned char gray;
char pm_getc(FILE* file);
bit pm_getbit(FILE* file);
unsigned char pm_getrawbyte(FILE* file);
int pm_getint( FILE* file);
void pm_erreur(char *);
#endif
Le chier Util.c :
/* Utilitaires de lecture pour les fichiers PBM, PGM, PPM
**
**
** E.B. 12/98
*/
#include <stdio.h>
#include "Util.h"
char pm_getc(FILE* file)
{
register int ich;
register char ch;
ich = getc( file );
if ( ich == EOF )
[email protected], [email protected]
DESS GI / option CHM
Analyse et synthese d'images
pm_erreur("EOF / read error" );
ch = (char) ich;
if ( ch == '#' )
{
do
{
ich = getc( file );
if ( ich == EOF )
pm_erreur("EOF / read error" );
ch = (char) ich;
}
while ( ch != '\n' && ch != '\r' );
}
return ch;
}
bit pm_getbit(FILE* file)
{
register char ch;
do
{
ch = pm_getc( file );
}
while ( ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' );
if ( ch != '0' && ch != '1' )
pm_erreur("junk in file where bits should be" );
return ( ch == '1' ) ? 1 : 0;
}
unsigned char pm_getrawbyte(FILE* file)
{
register int iby;
iby = getc( file );
if ( iby == EOF )
pm_erreur("EOF / read error" );
return (unsigned char) iby;
}
[email protected], [email protected]
DESS GI / option CHM
Analyse et synthese d'images
int pm_getint( FILE* file)
{
register char ch;
register int i;
do
{
ch = pm_getc( file );
}
while ( ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' );
if ( ch < '0' || ch > '9' )
pm_erreur( "junk in file where an integer should be" );
i = 0;
do
{
i = i * 10 + ch - '0';
ch = pm_getc( file );
}
while ( ch >= '0' && ch <= '9' );
return i;
}
void pm_erreur(char *texte)
{
fprintf(stderr, "\n%s \n\n", texte);
exit(1);
}
[email protected], [email protected]
DESS GI / option CHM
Analyse et synthese d'images
Le programme pxmtopxm.c :
#include <stdlib.h>
#include <stdio.h>
#include "Util.h"
void main(int argc, char* argv[])
{
FILE* ifp;
bit* bitmap;
register bit* bP;
int ich1, ich2, rows, cols ;
int i,j ;
/* Test des arguments */
if ( argc != 2 ){
printf("\nUsage : pbmtopgm file \n\n");
exit(0);
}
/* Ouverture */
ifp = fopen(argv[1],"r");
/* Lecture du Magic
ich1 = getc( ifp );
if ( ich1 == EOF )
pm_erreur( "EOF
ich2 = getc( ifp );
if ( ich2 == EOF )
pm_erreur( "EOF
if(ich2 != '1')
pm_erreur(" wrong
number */
/ read error reading magic number" );
/ read error reading magic number" );
ifp format ");
/* Lecture des dimensions */
cols = pm_getint( ifp );
rows = pm_getint( ifp );
/* Allocation memoire */
bitmap = (bit *) malloc(cols * rows * sizeof(bit));
/* Lecture */
for(i=0; i < rows; i++)
for(j=0; j < cols ; j++)
bitmap[i * cols + j] = pm_getbit(ifp);
[email protected], [email protected]
DESS GI / option CHM
/* Ecriture */
printf("P2\n");
printf("%d %d \n", cols, rows);
printf("1\n");
for(i=0; i < rows; i++)
for(j=0; j < cols ; j++)
printf("%u ",bitmap[i * cols + j] );
/* fermeture */
fclose(ifp);
}
[email protected], [email protected]
Analyse et synthese d'images

Documents pareils