Sauriez comment procéder afin de calculer le seuil d'une image en 256 niveaux de gris et enfin la binariser.
Je recherche un procédé qui fonctionne sous visual c++ .net
Merci
Sauriez comment procéder afin de calculer le seuil d'une image en 256 niveaux de gris et enfin la binariser.
Je recherche un procédé qui fonctionne sous visual c++ .net
Merci
Je relance mon post car c'est tres important desole
Il y a un forum pour les technos .NETSous visual c++ .net
http://www.developpez.net/forums/viewforum.php?f=49
Sinon je ne sais pas si c'est ce que tu veux. Mais il existe une fonction qui permet de déteminer le niveau de gris d'une couleur. Tu peux l'utiliser pour vérifier ts les pixels. Sinon je ne sais pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part public float GetBrightness();
Comme le suggère ZeBiloute , la question n'est pas claire.
En informatique il faut avoir 2 qualités :
RIGUEUR et METHODE
IL faut distinguer 2 étapes :
*le traitement des pixels en lui-même : cela reléve de la méthode mathématique ( traitement numérique ) et algorithmique (transformations de Fourier etc...)
Donc poser sa question dans le forum approprié![]()
* l'affichage en lui-même des données traitées donc spécifiques à l'OS ( Microsoft ) /environnement de dev. utilisé librairies graphiques (VC++ /GDI )
Donc pour cela la classe MFC ou les API win32 se chargent de l'affichage graphique ; pour cela consulter le MSDN .
SetDIBBits par ex. affiche un buffer de pixel étant donné une profondeur de pixels ( donc ici 256 niveaux de gris )
Sinon pour un projet pro , il ya des librairies /OCX /dll payant (Leadtools )
Binariser : passer d'une image en 256 niveaux de gris en une image noir et blanc uniquement a partir d'une valeur de seuil donées.
Voila si quelqu'un aurait un code capable de réaliser cela.
Merci
En supposant que tu ais une image de profondeur 8 bits.
2 cas ton image utilise une palette:Tu parcours la palette.Toutes les valeurs superieure au seuil tu remplace par 0xff et en dessous par 0.
Si l'image n'utilise pas la palette,tu fais la même chose mais directement sur le buffer RGB
Après pour recupérer,modifier la palette et le buffer il faut utiliser les fonctions fournies par l'api windows
Oki .
Le truc que tu cherches est se que l'on appel Dithering. Mais bon c'est assez complex comme truc. Il faut utiliser des matices de transformations. Il y a pleins de methodes et d'algo. Le basic est celui que t'as donné CHARON. Des plus complex gèrent la propagation d'erreur en fonction d'une matrice.
Par contre je ne connais pas d'API qui le fond. Regardes dans les librairies OpenGl, ou DirectDraw.
En fait je connais la procédure afin de binariser mais c'est le codage sous vc++ .net qui pose probleme ...
Quelqu'un aurait-il un exemple ?
C'est quoi EXACTEMENT le Pb : C'est que tu n'arrives pas à programmer ton algorithme de dithering ou alors tu n'y connais rien en programmation (Là ça va être très dur !!!).
Même si c'est long décris précisement ton Pb parceque là on est dans le flou total.
Bon dacor je commence :
-je dois acquérir une image d'une camera a travers une carte d'acquisition qui fournit quelques fonctions de base dans ces dll (pas trop dure)
-ensuite je dois binarisé cette image afin d'obtenir une image uniquement en noir et blanc(c'est la que ca bloque)
-ensuite a partir de cette photo je dois determiner le nombre d'encoche de la croix de malte representé sur la photo.(je nai pas encore attaquer cette partie mais tout ceci est une autre histoire)
Sauf que voila comme ZeBiloute la di je suis tres nul en programmation sous vc++ .net car ayant appris a coder sous Builder.
Maintenant si vous avez une idee toute proposition serait interressante.
sur le site de msdn j'ai trouvé ce lien:
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/filter/OVERVIEW/filter_ext_ovw_entry.asp
ca parle des DXsurface de directx un DirectDrawSurface plus élaboré.Tu peux appliquer des filtres sur les images(transform).Il y a entre autre le dithering.Je ne connais pas vraiment le .net,mais j'ai entendu dire qu'on peut faire du COM très facilement.En l'occurence c'est du COM donc tu devrais pouvoir l'utiliser.
Je peux te donner un pt coup de pouces, car je suis sur project similaire:
Je reçois des datas d'une sonde que je transforme en image.
Donc je te donne la procédure a suivre pour créer une image.
En prmier il faut detecter le mode d'affichage:
il suffit de manipuller ton buffer a ta guise et d'utiliser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 // init Picture buffer CDC dc; dc.CreateDC(_T("DISPLAY"), _T("\\.\DISPLAY1"), NULL, NULL); int m_iBitsPixel = dc.GetDeviceCaps(BITSPIXEL); HBITMAP hBitmap; if(m_iBitsPixel) { switch(m_iBitsPixel) { case 16: //2Bytes RGBQUAD Structure ; 1-B5-R5-G5 b -> 32 step by color hBitmap = (HBITMAP)::CreateBitmap _iSourceWidth,m_iSourceHeight,1,16,NULL); break; case 24:// codage BGR hBitmap = (HBITMAP)::CreateBitmap(m_iSourceWidth,m_iSourceHeight,1,24,NULL); break; case 32:// codage BGRA hBitmap = (HBITMAP)::CreateBitmap(m_iSourceWidth,m_iSourceHeight,1,32,NULL); break; } } //determiner la taille d'image et créer un buffer de travail //le meme process est utiliser pour récupérer une image CBitmap cBitmap; BITMAP bmpX; cBitmap.Attach(hBitmap); cBitmap.GetBitmap(&bmpX); int m_iStride = bmpX.bmWidthBytes; //nbr byte / ligne de pixel int m_iPicHeight = 400 ; BYTE* m_bImageBuffer= (BYTE*)GlobalAlloc(GPTR,m_iStride*m_iPicHeight);
StretchBlt ou BitBlt pour afficher l'image.
Je pense que cella te donnera un coup de main.
Bon courage
[/code]
Une erreur s'est glissée dans le code:
Voilà qui est corrigé .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 case 16: //2Bytes RGBQUAD Structure ; 1-B5-R5-G5 b -> 32 step by color hBitmap = (HBITMAP)::CreateBitmap(m__iSourceWidth,m_iSourceHeight,1,16,NULL); break;
n'oublie pas de détruire le buffer avec :
GlobalFree((HGLOBAL)m_bImageBuffer);
Partager