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