Surface d'une zone à partir de sa couleur sur un bitmap [Résolu]

maxime0038 6 Messages postés lundi 3 janvier 2011Date d'inscription 15 juin 2011 Dernière intervention - 3 janv. 2011 à 18:50 - Dernière réponse : maxime0038 6 Messages postés lundi 3 janvier 2011Date d'inscription 15 juin 2011 Dernière intervention
- 5 janv. 2011 à 09:14
Bonjour à tous,

Est-il possible de déterminer la surface de zones dont la couleur est uniforme sur un bitmap ?
Je souhaiterais, par exemple, si mon image est un tableau de 25 cases de tailles différentes, déterminer la taille de la plus grande case, de la plus petite, la taille moyenne des cases...
Dans mon cas, les formes, en réalité, ne sont pas des rectangles mais peuvent ressembler à n'importe quoi.
Autre petite difficulté, je ne peux pas utiliser le nombre de pixel de la même couleur sur l'image étant donné que plusieurs formes distinctes peuvent avoir la même couleur.

Si vous avez des idées...

Merci beaucoup.
Afficher la suite 

7 réponses

Répondre au sujet
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 4 janv. 2011 à 00:27
+3
Utile
Salut,

Tel que le problème est exposé, je ne vois qu'un truc: c'est d'utiliser l'algo de Canvas.FloodFill. Mais ça ne va pas être très performant...

EN GROS :
1) Tu travailles sur une copie mémoire de ton Bitmap.
2) Tu le parcours pour lister les couleurs présentes.
3) Tu en déduis un tableau de couleurs qui n'y figurent pas (voir sa taille selon les besoins de ton application, mais supérieure au nombre de couleurs présentes, bien sûr).
4) Tu parcours de nouveau le bitmap, et à chaque nouvelle couleur trouvée qui fait partie des couleurs originales, tu fais un Canvas.FloodFill avec les couleurs du tableau (en l'incrémentant à chaque fois).
5) Tu parcours de nouveau le Bitmap en comptant les pixels de couleurs différentes. Tu auras autant de surfaces différentes que le nombre de couleurs employées (à adapter selon la couleur des 'frontières', s'il y en a...).

Voilà. Ca répond à peu près à ta question. Mais peut-être vaudrait-il mieux réfléchir à la façon de colorier les surfaces à l'origine plutôt que de ramper dans les tuyaux de cette usine à gaz...


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Caribensila
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 4 janv. 2011 à 00:53
0
Utile
Y'a ça aussi.


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Commenter la réponse de Caribensila
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 4 janv. 2011 à 10:22
0
Utile
Salut,

j' ai pas compris mais reagrde déjà mon compo TcySkinArea:

ici :
Composants Cindy pour Delphi

Télécharge la démo,

A+
Commenter la réponse de cs_MAURICIO
maxime0038 6 Messages postés lundi 3 janvier 2011Date d'inscription 15 juin 2011 Dernière intervention - 4 janv. 2011 à 11:24
0
Utile
Merci beaucoup, je pense pouvoir m'en sortir...

Toutefois, je vais tenter de préciser si jamais quelqu'un voit une méthode susceptible d'être plus efficace.
J'ai une zone blanche sur laquelle je dessine différentes lignes de façon à illustrer un filet. les lignes peuvent être dessiné dans n'importe quelle direction.
Ce que je souhaite c'est obtenir la taille de mes mailles ainsi formées. Il s'agit donc des zones blanches entre les différents traits....
Commenter la réponse de maxime0038
cs_MAURICIO 2233 Messages postés mardi 10 décembre 2002Date d'inscription 15 décembre 2014 Dernière intervention - 4 janv. 2011 à 11:36
0
Utile
Haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...


Composants Cindy pour Delphi
Commenter la réponse de cs_MAURICIO
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 5 janv. 2011 à 01:10
0
Utile
Bonsoir

Je ne sais pas si j'ai tout compris mais bon, en supposant que :
[list]Tes lignes sont uniquement des droites.
Tu travailles sur une surface rectangulaire dont tu connais les dimensions./listTu peux alors mémoriser les coordonnées (en pixels, ou en valeurs réelles ) de départ et d'arrivée de chacune des lignes.

Ton problème se résume alors ( façon de parler, car ce n'est pas si simple qu'il n'y parait) à calculer les intersections de ces droites et donc d'obtenir les sommets des polygones de ton maillage afin d'en calculer leur aire.

De nombreux algo existent pour calculer les intersections de droites; regarde par exemple du côté de l'algo de Bentley-Ottman (voici quelques liens qui te seront peut être utiles, dans la langue de shakespeare bien souvent: ici, ici ou ici) et de façon plus générale pour un aperçu de différentes méthodes ici.

Il te faudra ensuite déterminer les polygones, puis leur aire; mais cela est une autre histoire...

N.B. Google est ton ami

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Commenter la réponse de WhiteHippo
maxime0038 6 Messages postés lundi 3 janvier 2011Date d'inscription 15 juin 2011 Dernière intervention - 5 janv. 2011 à 09:14
0
Utile
Merci beaucoup. Ça fonctionne, j'ai utilisé FloodFill pour coloriser chacune des mailles d'une couleur différente puis ScanLine pour compter le nombre de pixels pour chacune des couleurs.
Commenter la réponse de maxime0038

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.