salut,
je fais une implémentation des outils morphologiques de traitement d'images, et je voudrais que quelqu'un m'aide avec le code de la dilatation.
merci pour vos aides.
-----
salut,
je fais une implémentation des outils morphologiques de traitement d'images, et je voudrais que quelqu'un m'aide avec le code de la dilatation.
merci pour vos aides.
En noir&blanc ou rgb ?
salut,
en rgb.
Je ne peux pas t'aider alors, désolé...
salut,
je fais un programme de reconnaissances de formes(chiffres) et j'aimerai convertir une image rgb(ppm) en noir et blanc threshold et avoir une representation de cette image sous forme de matrices.Peux-tu m'aider?
Merci d'avance.
dali_sfax : J'ai trouvé une doc pour la dilatation en rgb
Voir : http://francoislouislaillier.develop...uto1/#LIII-B-2
Après implémentation de l'algo, cela semble donner le même résultat qu'avec le filtre de dilatation de Gimp (voir fichiers attachés), donc ca doit être le bon à prioris.
Une routine vite fait en C (ne gère pas les bords) :
Code:for(i = 1; i < (image->height - 1); i++) { for(j = 1; j < (image->width - 1); j++) { red_max = 0; green_max = 0; blue_max = 0; for(a = -1; a <= 1; a++) { for(b = -1; b <= 1; b++) { if((a == 0) && (b == 0)) { continue; } tga_get_pixel(image, j + b, i + a, &red, &green, &blue); if((red + green + blue) > (red_max + green_max + blue_max)) { red_max = red; green_max = green; blue_max = blue; } } } tga_set_pixel(result, j, i, red_max, green_max, blue_max); } }
Si tous ca te dépannes, tant mieux
agent933 : C'est quoi que tu appels "noir et blanc threshold" ? Un simple seuillage ?
Du code, du code, qui n'en veut, pour les jeunes qui n'en veulent.Code:int RGBToNg(int _nW,int _nH,unsigned char *_aucImgRgb,unsigned char **_paucImg) { int i,nSize=_nW*_nH; if (*_paucImg==NULL) (*_paucImg)=new unsigned char[nSize]; if ((*_paucImg)==NULL) return 1; int i3=0; int nSum; for (i=0;i<nSize;i++) { nSum =_aucImgRgb[i3]; i3++; nSum+=_aucImgRgb[i3]+_aucImgRgb[i3]; i3++; nSum+=_aucImgRgb[i3]; i3++; (*_paucImg)[i]=nSum/4; } return 0; } int getint(FILE *fp) { int c, i;//, garbage; // note: if it sees a '#' character, all characters from there to end of // line are appended to the comment string // skip forward to start of next number c = getc(fp); while (true) { // eat comments if (c=='#') while (((c=getc(fp))!='\n') && (c!=EOF)) {}; if (c==EOF) return 0; if (c>='0' && c<='9') break; // see if we are getting garbage (non-whitespace) //if (c!=' ' && c!='\t' && c!='\r' && c!='\n' && c!=',') garbage=1; c = getc(fp); } // we're at the start of a number, continue until we hit a non-number i = 0; while (true) { i = (i*10) + (c - '0'); c = getc(fp); if (c==EOF) return i; if (c<'0' || c>'9') break; } return i; } int ReadFileColor(char *fname,unsigned char ** data, int *width, int *height) { FILE *fp; // Ouvrir le fichier if (!(fp = fopen(fname, "rb"))) return 1; // Vérifier son format char c = (char)getc(fp); char c1 = (char)getc(fp); if (c!='P' || c1!='6') return 1; // Lire les dimensions de l'image *width = getint(fp); *height = getint(fp); long size = 3*(*width)*(*height); /*int GrayLevelNb =*/getint(fp); // inutilisé mais fait avancer le fichier au début des données // On crée l'espace pour accueillir les données en mémoire (*data) = new unsigned char[size]; // On y met effectivement le contenu du fichier, après le header long numgot = fread(*data, 1, size, fp); if (numgot != size) return 2; // On peut abandonner l'accés disque fclose(fp); return 0; }
Par threshold je parle d'image noir et blanc.En fait je veux binariser l'image.
Merci
Merci argusazure,
je vais de ce pas essayer.
Tu peux m'expliquer la fonction RGBtong, parametres et variables utilisees.
Sa fonction convertie en niveau de gris. Elle ajoute les trois composantes RGB (deux fois le G d'ailleur, je ne comprend pas pourquoi) et divise par 4 donc pour en faire un niveau de gris.Tu peux m'expliquer la fonction RGBtong, parametres et variables utilisees.
Si tu veux faire un seuillage binaire il faut alors que tu fasse quelque chose comme :
Code:#define THRESHOLD 100 // Definie le seuil if((red + green + blue) >= THRESHOLD) { image_bin[x][y] = 1; } else { image_bin[x][y] = 0; }
Si ton pixels est inférieur à ton seuil de luminosité c'est du noir, si il est supérieur alors c'est du blanc.
La sensibilité de l'oeil humain aux intensités lumineuses relatives aux trois couleurs primaire est inégale. On peut ajouter R+G+B mais le résultat est meilleur si on fait R+2*G+B et une division par 4 est moins couteuse qu'une division par 3.
On peut aussi fait (30*R+59*G+11*B)/100 si on veut un meilleur résultat.
(RGBToNg = RedGreenBlue To NiveauDeGris)
Salut a tous,
désolé AGENT933, je ne peux pas vous aider.
Salut à tous,
Est ce quelqu'un a une idée sur les élements structurants configurables en taille et en forme?
Merci.
Bonjour à tous,
J'aimerais préciser que les oprérateurs que vous avez implémenté ne correspondent pas à des dilatations et des érosions au sens de la morphologie mathématique. Les dilatations vectoriel sous entendent que l'espace vectoriel sous jacent soit totalement ordoné, ce qui n'est pas le cas pour l'espace des couleurs RGB.
En ce qui concerne les éléments structurant configurables, vous cherchez une implémentation ou bien des références ? si ce sont des références, je vous conseille de regarder vers ce qu'on appelle les amibes morphologiques.
Salut à tous,
je veux bien une documentation des élements structurants. Mais j'ai pas trouvé un lien vers les "amibes morphologiques". Est ce que vous pouvez me procurer un lien qui peux m'aider.
Cordialement.
Salut merci a tous pour votre aide j'ai finalement reussi a avoir ce que je voulais.
Au cas ou ca pourrai servir a d'autre, j'ai utilise une structure au lieu de tableau :
Merci encore a tousCode:void rgbtobw(IMAGE *imrgb) { int i; for (i=0;i<(640*480*3);i+=3){ if (((imrgb->data[i]+imrgb->data[i+1]+imrgb->data[i+2])/4) >= 50){ imrgb->data[i]=255; imrgb->data[i+1]=255; imrgb->data[i+2]=255; } else{ imrgb->data[i]=0; imrgb->data[i+1]=0; imrgb->data[i+2]=0; } } }
Dernière modification par yoda1234 ; 10/07/2008 à 06h31.
Salut la plupart de mes amis ont divise par 3 pour avoir le niveau de gris.
Tu voulais dire quoi par une division par 4 est moins couteuse qu'une division par 3.
Merci d'avance
Bonjour,
au sujet des amibes morphologiques :
il y a deux ou trois articles couvrant le sujet des éléments structurants dynamique:
NOISE REDUCTION IN 3D IMAGES USING MORPHOLOGICAL AMOEBAS
Image filtering using morphological amoebas-
L'idée est d'utiliser des éléments structrants qui s'adaptent en chaque point de l'image, en fonction du gradient, ou d'autre critères.
merci argusazure
salut,
je veux savoir si quelqun peut m'aider à programmer un algo de conversion rgb2hsv en dsp; j'ai pas compris comment faire la division en asembleur.
Merci.