29/03/16 1 Les tableaux 2D Les tableaux mul.dimensionnels Les tableaux 2D et qu

29/03/16 1 Les tableaux 2D Les tableaux mul.dimensionnels Les tableaux 2D et quelques traitements classiques Généralisa;on aux tableaux mul;dimensionnels Les tableaux 2D et quelques traitements classiques 29/03/16 Algo 2. L1 math-­‐info. PhL 2 Tableaux 2D et des images 29/03/16 Algo 2. L1 math-­‐info. PhL 3 Représenter une image Une image = quadrillage de pixels -­‐ pixel blanc ou noir : un bit 0 ou 1, respec;vement -­‐ niveaux de gris : un en;er niveaux/nuances : varia;on de l'en;er entre 0 et 255 (format PGM : foncé -­‐> clair) -­‐ couleurs : . RGB (rouge/vert/bleu) . G+B = cyan (bleu mers du sud) , R+B = magenta (violet), R+G = jaune . triplet d'en;ers RGB pour les nuances 29/03/16 Algo 2. L1 math-­‐info. PhL 4 29/03/16 2 Image = tableau 2D de pixels Avec un tableau 1D : 00000011100101000111000000 t : tableau[25] d'entiers = [0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,1,1,1,0,0,0,0,0,0] Avec un tableau 2D : N/B niveaux de gris 00000 0 0 0 0 0 01110 0 128 128 128 0 01010 0 128 0 128 0 01110 0 128 128 128 0 00000 0 0 0 0 0 t : tableau[5,5] d'entiers = [ [0,0,0,0,0] , [0,1,1,1,0], [0,1,0,1,0], [0,1,1,1,0] , [0,0,0,0,0] ] -­‐ 2 indices : ligne / colonne -­‐ t[1, 2] == 1 et t[4,4] == 0 -­‐ t[3, 10] : tableau rectangulaire de 3 lignes et 10 colonnes 29/03/16 Algo 2. L1 math-­‐info. PhL 5 L'ami du tableau 2D : la double-­‐boucle imbriquée Un premier exemple declare img : tableau[5,8] d'entiers // une image rectangulaire // de 5 lignes, 8 colonnes i : entier // indice de parcours des lignes j : entier // indice de parcours des colonnes debut pour i de 0 à 4 faire // pour chaque ligne : il y en a 5 pour j de 0 à 7 faire // pour chaque colonne : il y en a 8 img[i , j] = 128 // un pixel de gris finpour // j'ai fini toutes les colonnes donc une ligne finpour // j'ai fini toutes les lignes donc l'image .... fin //... comporte 40 pixels gris 29/03/16 Algo 2. L1 math-­‐info. PhL 6 Des algorithmes sur les tableaux 2D D'abord bien comprendre la double boucle imbriquée 29/03/16 Algo 2. L1 math-­‐info. PhL 7 Bien comprendre la double-­‐boucle imbriquée Etape 1 : indices indépendants declare t : tableau[2, 5] d'entiers = ... i , j : entier debut pour i de 0 à 1 faire pour j de 0 à 4 faire afficher( t[i , j]) finpour afficher (sdl) // saut de ligne finpour fin 29/03/16 Algo 2. L1 math-­‐info. PhL 8 1 -­‐3 5 -­‐7 9 -­‐2 4 -­‐6 8 -­‐10 t : tableau[2, 5] d'entiers = initialisé comme celui-ci à Parcours "en ligne d'abord" : indice i, puis indice j 1 -­‐3 5 -­‐7 9 -­‐2 4 -­‐6 8 -­‐10 declare t : tableau[2, 5] d'entiers = ... i , j : entier debut pour j de 0 à 4 faire pour i de 0 à 1 faire afficher( t[i , j]) finpour afficher (sdl) // saut de ligne finpour fin L'instruc;on d'affichage n'est pas modifiée !! Parcours "en colonne d'abord" : indice j, puis indice i 1 -­‐2 -­‐3 4 5 -­‐6 -­‐7 8 9 -­‐10 Seul le parcours ligne/colonne du tableau est permuté 29/03/16 3 Bien comprendre la double-­‐boucle imbriquée Etape 2 : indices liés declare t : tableau[4, 5] d'entiers = ... i , j : entier debut pour i de 0 à 3 faire pour j de i à 4 faire afficher( t[i , j]) finpour afficher (sdl) // saut de ligne finpour fin 29/03/16 Algo 2. L1 math-­‐info. PhL 9 1 -­‐3 5 -­‐7 9 -­‐2 4 -­‐6 8 -­‐10 t : tableau[4, 5] d'entiers = initialisé comme celui-ci à 1 -­‐3 5 -­‐7 9 4 -­‐6 8 -­‐10 15 17 19 18 20 La boucle intérieure dépend de la boucle extérieure Les valeurs prises par j dépendent de celles de i. Elles changent donc chaque fois que i change. 11 13 15 17 19 12 14 16 18 20 Les indices varient comme suit : i = 0 j= 0,1,2,3,4 i =1 j= 1,2,3,4 i =2 j= 2,3,4 i =3 j= 3,4 Des algorithmes sur les images Exemples en interac;on : tableaux 2D et images 29/03/16 Algo 2. L1 math-­‐info. PhL 10 Tout gris c'est parfois triste ... 29/03/16 Algo 2. L1 math-­‐info. PhL 11 Modifions l'algo de créa@on de l'image grise pour obtenir ça à declare img : tableau[5,8] d'entiers // une image rectangulaire // de 5 lignes, 8 colonnes i : entier // indice de parcours des lignes j : entier // indice de parcours des colonnes debut pour i de 0 à 4 faire // pour chaque ligne : il y en a 5 pour j de 0 à 7 faire // pour chaque colonne : il y en a 8 img[i , j] = 128 // un pixel de gris finpour // j'ai fini toutes les colonnes donc une ligne finpour // j'ai fini toutes les lignes donc l'image .... fin //... comporte 40 pixels gris L'algo ci-­‐contre donne : Tout gris c'est parfois triste ... 29/03/16 Algo 2. L1 math-­‐info. PhL 12 Modifions l'algo de créa;on de l'image grise pour obtenir ça à 255 192 128 64 0 1. Principe de l'algorithme de remplissage en 5 niveaux de gris : -­‐ remplir chaque ligne du même niveau de gris -­‐ 2 choix symétriques : Aben;on : les images sont souvent indicées "à l'inverse" des matrices . du haut vers le bas : ligne 0 à ligne 4 . du bas vers le haut : ligne 4 à ligne 0 2. Pe;te difficulté arithmé;que : comment partager la plage de gris 0..255 en 5 gris répar;s de façon équilibrée ? Essayons avec les 8 valeurs 0 1 2 3 4 5 6 7 . on prend les 2 extrêmes : 0, 7 (noir, blanc) 0 1 2 3 4 5 6 7 . il reste 5 valeurs répar;es de 1 à 6 et on veut 3 autres valeurs de sépara;on . choix équidistant impossible à choix arbitraire : par exemple 2, 4, 6 qui sont équidistants depuis 0 . ce qui donne 0 2 4 6 7, soit 0+2, 0+2+2, 0+2+2+2, ... soit : 0 + i x 2 avec i = 0,1,2,3 . et on rajoute 7 à la fin. Plus généralement, difficile de partager un nombre pair de valeurs en un nombre impair (>1) de tas ... valeurs des gris 29/03/16 4 Tout gris c'est parfois triste ... declare img : tableau[5,8] d'entiers // une image 5 lignes, 8 colonnes i : entier // indice de parcours des lignes j : entier // indice de parcours des colonnes inc : constante entier = 64 // incrément de gris : 64 ici debut pour i de 4 à 1 par pas de -1 faire // pour chaque ligne en partant du bas sauf la "dernière" pour j de 0 à 7 faire // ne dépend pas de j img[i, j] = (4 – i)* inc // numéro de ligne en partant du bas x incrément de gris finpour // j'ai fini toutes les colonnes donc une ligne finpour // j'ai fini de griser les 4 lignes en partant du bas pour j de 0 à 7 faire img[0, j] = 255 // je fini avec la première ligne (i=0) de blanc finpour fin 29/03/16 Algo 2. L1 math-­‐info. PhL 13 Un choix (parmi d'autres) : . on part d'en bas en ajoutant 64 à chaque fois . on traite à part la première ligne (celle d'en haut !) 0 1 2 3 4 5 6 7 1 2 3 4 25 5 19 2 12 8 64 0 Tout gris c'est parfois triste ... pour i de 4 à 1 par pas de -1 faire pour j de 0 à 7 faire img[i, j] = (4 – i)* inc finpour finpour 29/03/16 Algo 2. L1 math-­‐info. PhL 14 D'autres écritures du corps de boucle sont possibles : (inc=64) . (4 – i)*inc vaut successivement (4-­‐4)*64, (4-­‐3)*64, (4-­‐2)*64, (4-­‐1)*64 : ok . 256 – i*inc vaut successivement 256-­‐(4*64), 256-­‐(3*64), 256-­‐(2*64), 256-­‐(1*64): ok Autre sol. avec une addi;on sur inc . img[i,j] = img[i+1, j]+inc donne les mêmes itéra;ons après avoir ini;alisé img[4, j] = 0 D'autres boucles (et corps) sont bien sûr aussi possible : 0 1 2 3 4 5 6 7 1 2 3 4 25 5 19 2 12 8 64 0 pour i de 4 à 1 par pas de -1 : (4,3,2,1) pour j de 0 à 7 pour i de 1 à 4 faire // haut -> bas pour j de 0 à 7 faire img[i, j] = 256 – i* inc finpour finpour // initialisation ligne 4 // griser les lignes 3,2,1 pour j de 0 à 7 faire pour i de 3 à 1 par pas de -1 faire img[4, j] = 0 pour j de 0 à 7 faire uploads/Litterature/ les-tableaux-2d-les-tableaux-2d.pdf

  • 18
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager