Solution - imagine

Transcription

Solution - imagine
Introduction à la Programmation
TP #6 - Corrigé
1
1.1
G1: monasse(at) imagine.enpc.fr
G2: nicolas.audebert(at) onera.fr
G3: alexandre.boulch(at) onera.fr
G4: antoine.recanati(at) inria.fr
G5: bourkia(at) imagine.enpc.fr
G6: fadhela.kerdjoudj(at) u-pem.fr
Images
Solution
Fichier image.h
#pragma once
s t r u c t Image {
byte ∗ g r e y ;
i n t w, h ;
};
Image AlloueImage ( i n t W, i n t H ) ;
v o i d D e t r u i t I m a g e ( Image I ) ;
v o i d A f f i c h e I m a g e ( Image I ) ;
Image ChargeImage ( c o n s t c h a r ∗ name ) ;
byte Get ( Image I , i n t i , i n t j ) ;
v o i d S e t ( Image I , i n t i , i n t j , byte g ) ;
Image N e g a t i f ( Image I ) ;
Image Flou ( Image I ) ;
Image R e l i e f ( Image I ) ;
Image Deforme ( Image I ) ;
Image C o n t r a s t e ( Image I ) ;
Image Contours ( Image I , d o u b l e s e u i l ) ;
Fichier image.cpp
#d e f i n e _USE_MATH_DEFINES
#i n c l u d e <cmath>
#i n c l u d e <c a s s e r t >
#i n c l u d e <Imagine / Gr a ph ic s . h>
u s i n g namespace Imagine ;
#i n c l u d e " image . h"
Image AlloueImage ( i n t W, i n t H) {
Image I ;
I . g r e y=new byte [W∗H ] ;
I . w=W;
I . h=H;
return I ;
}
1
v o i d D e t r u i t I m a g e ( Image I ) {
d e l e t e [ ] I . grey ;
}
v o i d A f f i c h e I m a g e ( Image I ) {
putGreyImage ( 0 , 0 , I . grey , I . w, I . h ) ;
}
Image ChargeImage ( c o n s t c h a r ∗ name ) {
byte ∗ buf ;
i n t w, h ;
loadGreyImage ( name , buf , w, h ) ;
Image I 2=AlloueImage (w, h ) ;
f o r ( i n t i =0; i <w∗ h ; i ++)
I 2 . g r e y [ i ]= buf [ i ] ;
d e l e t e [ ] buf ;
return I2 ;
}
byte Get ( Image I , i n t i , i n t j ) {
r e t u r n I . g r e y [ i+I . w∗ j ] ;
}
v o i d S e t ( Image I , i n t i , i n t j , byte g ) {
I . g r e y [ i+I . w∗ j ]=g ;
}
Image N e g a t i f ( Image I ) {
Image J ;
J=AlloueImage ( I . w, I . h ) ;
f o r ( i n t i =0; i <I . w ; i ++)
f o r ( i n t j =0; j <I . h ; j ++)
S e t ( J , i , j ,255 − Get ( I , i , j ) ) ;
return J ;
}
Image Flou ( Image I ) {
Image J ;
J=AlloueImage ( I . w, I . h ) ;
f o r ( i n t i =0; i <I . w ; i ++)
f o r ( i n t j =0; j <I . h ; j ++) {
i f ( i==0 | | i==I . w−1 | | j==0 | | j==I . h − 1) {
S e t ( J , i , j , Get ( I , i , j ) ) ;
continue ;
}
i n t s=i n t ( Get ( I , i − 1, j − 1))
+i n t ( Get ( I , i , j − 1))
+i n t ( Get ( I , i +1, j − 1))
+i n t ( Get ( I , i − 1, j ) )
+i n t ( Get ( I , i , j ) )
+i n t ( Get ( I , i +1, j ) )
+i n t ( Get ( I , i − 1, j +1))
+i n t ( Get ( I , i , j +1))
+i n t ( Get ( I , i +1, j + 1 ) ) ;
S e t ( J , i , j , byte ( s / 9 ) ) ;
}
return J ;
}
Image R e l i e f ( Image I ) {
2
}
Image J ;
J=AlloueImage ( I . w, I . h ) ;
f o r ( i n t i =0; i <I . w ; i ++)
f o r ( i n t j =0; j <I . h ; j ++) {
i f ( i==0 | | i==I . w−1 | | j==0 | | j==I . h − 1) {
Set ( J , i , j , 1 2 8 ) ;
continue ;
}
i n t d=( i n t ( Get ( I , i − 1, j −1)) − i n t ( Get ( I , i +1, j + 1 ) ) ) / 2 ;
S e t ( J , i , j , byte (128+d ) ) ;
}
return J ;
Image Deforme ( Image I ) {
Image J ;
J=AlloueImage ( I . w, I . h ) ;
f o r ( i n t i =0; i <I . w ; i ++)
f o r ( i n t j =0; j <I . h ; j ++) {
d o u b l e x=( d o u b l e ( i )− I . w/ 2 ) ∗ 2 / I . w ;
d o u b l e y=( d o u b l e ( j )− I . h / 2 ) ∗ 2 / I . h ;
i n t i 1=i n t ( I . w/2+ I . w/2 ∗ s i n ( x ∗M_PI/ 2 ) ) ;
i n t j 1=i n t ( I . h/2+ I . h/2 ∗ s i n ( y ∗M_PI/ 2 ) ) ;
a s s e r t ( i 1 >=0 && i <I . w && j1 >=0 && j1 <I . h ) ;
S e t ( J , i , j , Get ( I , i 1 , j 1 ) ) ;
}
return J ;
}
Image C o n t r a s t e ( Image I ) {
Image J ;
J=AlloueImage ( I . w, I . h ) ;
f o r ( i n t i =0; i <I . w ; i ++)
f o r ( i n t j =0; j <I . h ; j ++)
S e t ( J , i , j , byte (128+128 ∗ s i n ( ( d o u b l e ( Get ( I , i , j )) − 128)/128 ∗M_PI/ 2 ) ) ) ;
return J ;
}
Image Contours ( Image I , d o u b l e s e u i l ) {
Image J ;
J=AlloueImage ( I . w, I . h ) ;
f o r ( i n t i =0; i <I . w ; i ++)
f o r ( i n t j =0; j <I . h ; j ++) {
i f ( i==0 | | i==I . w−1 | | j==0 | | j==I . h − 1) {
Set ( J , i , j , 0 ) ;
continue ;
}
// Gradient
d o u b l e dx=( d o u b l e ( Get ( I , i +1, j )) − d o u b l e ( Get ( I , i − 1, j ) ) ) / 2 ;
d o u b l e dy=( d o u b l e ( Get ( I , i , j +1)) − d o u b l e ( Get ( I , i , j − 1 ) ) ) / 2 ;
d o u b l e n=s q r t ( dx ∗ dx+dy ∗ dy ) ;
i f ( n>s e u i l )
Set ( J , i , j , 2 5 5 ) ;
else
Set ( J , i , j , 0 ) ;
}
}
return J ;
Fichier Tp7.cpp
3
//
//
//
//
Imagine++
Project :
Author :
Date :
project
Tp7
keriven
2007/10/23
#d e f i n e _USE_MATH_DEFINES
#i n c l u d e <cmath>
#i n c l u d e <i o s t r e a m >
u s i n g namespace s t d ;
#i n c l u d e <Imagine / Gr a ph ic s . h>
u s i n g namespace Imagine ;
#i n c l u d e " image . h"
i n t main ( )
{
openWindow ( 5 1 2 , 5 1 2 ) ;
Image I 1 ;
i n t W1, H1 ;
c o u t << " En trez l e s d i m e n s i o n s : " ;
c i n >> W1 >> H1 ;
I 1=AlloueImage (W1, H1 ) ;
f o r ( i n t i =0; i <W1; i ++)
f o r ( i n t j =0; j <H1 ; j ++)
S e t ( I1 , i , j , byte (128+128 ∗ s i n ( 4 ∗ i ∗M_PI/W1) ∗ s i n ( 4 ∗ j ∗M_PI/H1 ) ) ) ;
AfficheImage ( I1 ) ;
click ();
DetruitImage ( I1 ) ;
Image I 2 ;
I 2=ChargeImage ( s r c P a t h ( "ppd . j p g " ) ) ;
AfficheImage ( I2 ) ;
click ();
Image I 3 ;
I 3=N e g a t i f ( I 2 ) ;
AfficheImage ( I3 ) ;
click ();
DetruitImage ( I3 ) ;
Image I 4 ;
I 4=Flou ( I 2 ) ;
AfficheImage ( I4 ) ;
click ();
DetruitImage ( I4 ) ;
Image I 5 ;
I 5=R e l i e f ( I 2 ) ;
AfficheImage ( I5 ) ;
click ();
DetruitImage ( I5 ) ;
Image I 6 ;
I 6=Deforme ( I 2 ) ;
AfficheImage ( I6 ) ;
click ();
DetruitImage ( I6 ) ;
Image I 7 ;
4
I 7=C o n t r a s t e ( I 2 ) ;
AfficheImage ( I7 ) ;
click ();
DetruitImage ( I7 ) ;
Image I 8 ;
I 8=Contours ( I2 , 1 5 ) ;
AfficheImage ( I8 ) ;
click ();
DetruitImage ( I8 ) ;
DetruitImage ( I2 ) ;
}
endGraphics ( ) ;
return 0;
5