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:
À 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:
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é.
Fichier : examples/edge.cpp #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]);
}
} Ce document a été traduit de LaTeX par HeVeA |