Bonjour,
Dans le cadre d'un projet d'application d'edition photo ( Je ne peut pas trop m'etendre sur le concept ), je dois implementer un mecanisme similaire à la "magic wand" de photoshop.
En gros, quand l'utilisateur clique sur un pixel, tous les points adjascents et de couleur similaire ( j'utilise pour cela une valeur de tolerance et la distance euclidienne de l'espace RGB ) doivent etre selectionnés.
Je precise que je travaille en C#, version .net 3.5 avec GDI+ (Pas de WPF ni DirectX).
L'algorithm en lui meme n'est pas un pobleme. Le sujet est largement couvert sur le net.
Mon probleme reside dans le fait qu'a peu pres tous les algos que j'ai pu trouver, retournaient un ensemble de points ( A part le Snake mais apparement, il est tres difficile de faire un algo generic pour tous type d'image). Or je dois ( disons plutot que je prefere ) avoir un graphicsPath ou au minimum un PolyLine :
A la fois pour des raisons de stockage ( Un carré 200*200 peut etre representé par 400 points voir meme 4 points apres simplification, au lieu des 40000 pixels qu'il contient ).
Mais aussi car les utlisateur de PhotoShop ont l'habitude de voir le contour de selection et que je préfére garder ca.
En gros j'aimerais avoir une polyline representant le contour en noir.
L'algo que j'ai choisis pour le moment est le FloodFill par ScanLines :http://fr.wikipedia.org/wiki/Flood_fill.
Au depart, cette algorithm sert principalement à colorier à la maniere de l'outil
"Remplissage" de Paint. je l'ai quelque peu modifié selon mes besoins.
J'ai bien étudié l'algo, et j'ai réussis à representer la region en lignes adjascentes plutot qu'en pixels.
J'ai pris l'image presente sur la page en anglais de wikipedia qui montre bien l'idée.
![]()
Comme on peut le voir, l'algorithm parcour des lignes, de proche en proche jusqu'a remplir tout l'espace. Les coordonnées des extrimités de ses lignes peuvent être facilement extraite lors de la colorisation, mais comme on peut le voir dans l'animation, elle ne sont pas ordonnées.
Je ne sais si cela peut aider, je penche dessue depuis 3 jours, je ne trouve pas de facon propre de le faire.
Une autre solution, serait de créer une region ( GDI+) à partir de ses lignes puis d'extraire le contour à partir de cette region.
Pour rappel : Les regions sont representées en interne comme un ensemble de rectangles adjascents.
En utilisant cette information, je pense pouvoir trouver le contour externe de la region. Ce n'est bien sur pas suffisant puisque la region peut contenir des trous.
Bref, si quelqu'un pouvait m'aider à trouver une solution. Merci.
Ps: J'aurais une autre question, L'implementation que j'utilise utilise un stack pour stocker les pixels à visiter. D'aprés la page wikipedia, l'utilisation d'une queue à la place, dans le cas des Flood Fill 4 convexes, supprimerait l'effet "je laisse des trous puis je rebouche ("leave gaps and then return to fill them later")". J'ai essayé avec le scanline et le resultat fut un temps de traitement sensiblement superieur. Je serais simplement curieux de connaitre l'explication theorique de ce comportement ? Cela laisserais supposer que d'autre structures pourrait peut etre optimisé l'algorithm?





Répondre avec citation







Partager