Exemples de manipulation d´images Bitmap
Comme on l’a vu, une image Bitmap en RGB24 peut être vue comme un échantillonnage Ui,j d’une fonction f(x,y) sur une grille:

En supposant que f est dérivable, on peut définir le gradient de f comme une matrice 2×3:

La norme du gradient de f s’écrirait alors comme le vecteur:

En supposant que l’échantillonnage de la dérivée de f est la dérivée de son échantillonnage (ce qu’on ne justifiera pas ici), il est alors facile de calculer les dérivées partielles de l’échantillonnage:

  • pour la dérivée par rapport à x au pixel (i,j) il suffira de calculer la différence Ui+1, jUi, j ;
  • pour la dérivée par rapport à y au pixel (i,j) il suffira de calculer la différence Ui, j+1Ui, j .

À partir de là, on dispose par exemple d’un système très simple de détection des contours (brusques variations) de l’image en seuillant la norme du gradient à partir d’une valeur arbitraire.

Le programme suivant prend trois arguments:

  • le nom d’un fichier Bitmap d’entrée;
  • le nom d’un fichier Bitmap de sortie;
  • une valeur optionnelle (flottante, valant 24 par défaut) de seuil.

Il enregistre le seuillage de la norme du gradient du fichier d’entrée dans le fichier de sortie, avec le seuil spécifié. Comme on peut le constater, la qualité de la détection des bords est très sensible au bruit, et au choix du seuil. On verra dans le cours des méthodes donnant des résultats de meilleure qualité.

Imageseuil
originale2550100
Exemples de seuillages, avec différentes valeurs.
Programme : examples/edge
Source :examples/edge.zip
Exécutable Win32 :examples/edge.exe
#include "bitmap.h" #include "math.h" int main(int argc,char * argv[]){ if (argc<=2 || argc>=5){ printf("Usage: edge fileIn fileOut [treshold]\n"); }else{ Bitmap<int> bIn,bOut; float f=24; Bitmap<int>::RGB dx,dy; int i,j; if (argc==4) f=atof(argv[3]); bIn.loadFile(argv[1]); bOut.setWidth(bIn.getWidth()); bOut.setHeight(bIn.getHeight()); for (i=0;i<bIn.getWidth();i++){ for (j=0;j<bIn.getHeight();j++){ dx.R=bIn(i+1,j).R-bIn(i,j).R; dx.G=bIn(i+1,j).G-bIn(i,j).G; dx.B=bIn(i+1,j).B-bIn(i,j).B; dy.R=bIn(i,j+1).R-bIn(i,j).R; dy.G=bIn(i,j+1).G-bIn(i,j).G; dy.B=bIn(i,j+1).B-bIn(i,j).B; bOut(i,j).R=sqrt(dx.R*dx.R+dy.R*dy.R)>f?255:0; bOut(i,j).G=sqrt(dx.G*dx.G+dy.G*dy.G)>f?255:0; bOut(i,j).B=sqrt(dx.B*dx.B+dy.B*dy.B)>f?255:0; } } bOut.saveFile(argv[2]); } }
Dernière modification le 18/3/2010
Ce document a été traduit de LaTeX par HeVeA