Manipulations d`images

Transcription

Manipulations d`images
DESS GI / option CHM
Analyse et synthèse d’images
TD1
Manipulations d’images
Dans ce TD, nous allons étudier les formats de fichiers d’images PBM,
qui sont largement répandus en raison de leur simplicité. Nous effectuerons
quelques opérations simples sur ces formats : lecture, écriture, conversion et
affichage.
1
Les formats ”portable map”
Les formats de fichiers d’images PBM, PGM et PPM, respectivement :
portable bitmap, portable grayscalemap et portable pixmap, offrent une
solution simple à tout programmeur confronté au problème de la manipulation de fichiers d’images. Dans ces formats, une image est considérée comme
une matrice dont les valeurs représentent 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).
Définition
Les fichiers correspondants sont constitués des éléments suivants :
1. Un ”nombre magique” pour identifier les type du fichier : P1 ou P4
pour PBM, P2 ou P5 pour PGM et P3 ou p6.
2. Un caractère d’espacement (blanc, TABs, CRs, LFs).
3. La largeur de l’image (valeur décimale, codée en ASCII) suivie d’un
caractère d’espacement, la longueur de l’image (valeur décimale, ASCII)
suivie d’un caractère d’espacement.
4. Uniquement pour PGM et PPM : l’intensité maximum (valeur décimale
comprise entre 0 et 255, codée en ASCII) suivie d’un caractère d’espacement.
5. Largeur × hauteur nombres. Ces nombres sont soit des valeurs décimales
codées en ASCII et séparées par des espacements dans le cas des formats P1, P2, P3, soit directement les valeurs binaires sur 1 ou 2 octets
dans le cas des formats P4, P5, P6. Dans ce dernier cas, il n’y pas de
caractères d’espacement entre les valeurs.
[email protected], [email protected], [email protected]
DESS GI / option CHM
Analyse et synthèse d’images
Remarques :
• Les lignes commençant par le caractère ”#” sont ignorées.
• Les lignes contiennent moins de 70 caractères.
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 24×7 dont les valeurs sont codées 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 24×7. Les valeurs d’intensité codées 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
Fichier PPM d’une image 4×4. Les valeurs d’intensité codées en ASCII
sont au maximum de 15
[email protected], [email protected], [email protected]
0
0
0
0
0
0
0
DESS GI / option CHM
2
Analyse et synthèse d’images
Exercice 1
Recopiez le répertoire :
~eboyer/Enseignements/DESS_GI/ASI/TD1/
Ce répertoire contient les squelettes de programmes C de conversion entre
les formats présentés ainsi qu’un exemple de conversion : le programme
pxmtopxm (source en annexe).
1. Testez le programme sur le fichier test.pbm. Quel type de conversion
ce programme effectue ?
2. De quelle manière est stockée l’image dans le programme ?
3. À quoi servent les fonctions pm getc et pm getint du fichier Util.c ?
4. Quel sont les types impliqués pour manipuler les intensités ? dans le
cas de valeurs décimales codées en ASCII (P1, P2, P3) ? dans le cas
de valeurs binaires (P4, P5, P6) ?
5. Quelle couleur est associée à la valeur d’intensité maximum ?
3
Exercice 2
Il s’agit ici de compléter le programme de conversion entre les formats PGM
(c’est à dire de P2 vers P5 ou de P5 vers P2) : pgmtopgm.c (source en
annexe).
Notes : on utilisera le Makefile du répertoire pour la compilation (avec
gmake) ainsi que les utilitaires fournies dans Util.c pour compléter ce programme. Pour visualiser les différents fichiers, on utilisera le programme
XV.
4
Exercice 3
Le format de fichier d’images PGM permet de stocker des images en niveaux
de gris. Proposez un algorithme de conversion au format PBM, écrivez le
programme c pgmtopbm correspondant.
5
Exercice 4
De la même manière, le format de fichier d’images PPM permet de stocker
des images en niveaux de couleurs RGB. Proposez un algorithme de conversion au format PGM, c’est à dire stocker les trois niveaux de couleurs sur
un seul niveau. Écrivez le programme c ppmtopgm correspondant.
[email protected], [email protected], [email protected]
DESS GI / option CHM
6
Analyse et synthèse d’images
Exercice 5
Au vu des manipulations précédentes, que pouvez-vous conclure sur les avantages et inconvénients de ces formats de fichiers d’images ?
[email protected], [email protected], [email protected]
DESS GI / option CHM
7
Analyse et synthèse d’images
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 fichier 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], [email protected]
DESS GI / option CHM
Analyse et synthèse 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], [email protected]
DESS GI / option CHM
Analyse et synthèse 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], [email protected]
DESS GI / option CHM
Analyse et synthèse 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], [email protected]
DESS GI / option CHM
Analyse et synthèse d’images
/* 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], [email protected]

Documents pareils