gabrielhdt / gama Goto Github PK
View Code? Open in Web Editor NEWVectorisation d'images
License: GNU General Public License v3.0
Vectorisation d'images
License: GNU General Public License v3.0
Identifié les waypoints donnés par scanlines()
pour forcer la tangente droite d'un côté du point et ainsi assurer la ligne droite entre les deux points du scanlines.
Le problème vient du calcul des tangentes: si start.x == end.x
, alors un des points de contrôle risque d'être confondu avec le point de départ ou d'arrivée. Une solution est d'utiliser plus souvent les cubiques véritables.
Problème dans les contours séparés: si un pixel d'un contour a 3 voisins (e.g. le pixel juste avant un coin de carré), il ne sera pas compté dans le contour et se retrouvera (par différence ensembliste) dans l'autre, alors qu'il n'a rien à y faire.
Could be more efficient to return a list of stacks when separating contours, each stack being a block of neighbours. Would cost less in terms of computing when sorting.
La séparation des contours se fait nécessairement avant affinage, car ce dernier restreint le nombre de voisins par pixel à deux, incompatible avec des intersections de contours. Le problème réside dans l'intersection de contours (à vérifier) et dans la présence de ``couloirs'' i.e. une ligne d'un pixel bordée par deux contours différents, générant un quadrillage rempli sur la longueur de la ligne
Possibilité de séparer le calcul de la précision de pente_s
de pente_e
. Nécessite de connaître le point d'inflexion suivant, voire tous?
Dans le cas d'un contour arenamorphe (côtés de longueur au moins 2), pas d'extrema trouvés.
À partir d'une simili cardioïde définie dans contour_tests, list_curves me renvoie
[array([[ 10. , 20. ],
[ 22.99270073, 42.99270073],
[ 31. , 19. ]]),
array([[ 31. , 19. ],
[ 11.23595506, 19.97378277],
[ 11. , 21. ]])]
ce qui donne, après le passage dans la nouvelle fonction curves2curvemat:
[[ 10. 20. ]
[ 22.99270073 42.99270073]
[ 31. 19. ]
[ 11.23595506 19.97378277]
[ 11. 21. ]]
Le point de contrôle [23, 43] peut-être dû à un problème de repère (origine en haut à gauche). Les deux derniers points sont également faux, peut-être un problème de translation? On ne les voit pas sur la figure mais on obtient deux courbes de Bézier, qui se chevauchent ici.
Jusqu'où peut-on considérer l'intersection des tangentes? Actuellement, si l'intersection dépasse le rectangle formé par les deux pixels, on ne considère pas l'intersection des tangentes, cf validate_flyby()
dans control_points
. La fonction peut-être modifiée.
Compléter l'attribut colour des contours en fonction de la couleur de la zone dans l'image.
Si la séparation du contour démarre sur un agencement type:
Pixel(0, 0)
Pixel(1, 0)
Pixel(0, 1)
Pixel(2, 1)
sans voisins et faisant planter le programme lors du pop() ligne 170:inspix = neighbourhood.pop()
KeyError: 'pop from an empty set'
Si deux contours s'intersectent l'une des zones connexes n'aura pas le contour.
Utile ou non? Ne semble pas pertinent.
En lançant list_curves([cont])
, l'erreur suivante est obtenue
File "test.py", line 34, in test_tg
curves = cp.list_curves([cont])
File "/home/gabriel/workspace/vcs/GAMA/control_points.py", line 79, in list_curves
curves.append(curve)
UnboundLocalError: local variable 'curve' referenced before assignment
avec cont un carré défini par:
cont.xys += [ie.Pixel(10 + i, i) for i in range(10, 21)]
cont.xys += [ie.Pixel(30 - i, 20 + i) for i in range(1, 11)]
cont.xys += [ie.Pixel(20 - i, 30 - i) for i in range(1, 11)]
cont.xys += [ie.Pixel(10 + i, 20 - i) for i in range(1, 11)]
Le problème semble résider dans les conditions
if len(contour.xys) < 3:
et while start != c_end:
qui ne couvriraient pas tous les cas, laissant curve
non initialisée lors de l'appel curves.append(curve)
.
Détermination des contours par seuillages successifs, pourrait être plus précis.
Régler la profondeur maximale de récursion, voir
https://docs.python.org/3/library/sys.html#sys.setrecursionlimit.
Éviter la formation de triangles dans thinner(), sources de bugs.
Le find_inflexion() à corriger, trop de points de contrôle sur des lignes droites et l'utilisation de is_vert est mal implémentée
Lors de la séparation d'un contour, la présence d'un pixel ayant 2 voisins proches peut engendrer le saut d'un des voisins et laisser alors un contour (raw_minusloop
) avec seulement le pixel exclu. Sa suppression est envisageable (petite quantité de pixels). Peut être comparé avec les autres contours. À suivre.
Le programme detection_contour(...) boucle infiniment. En affichant la variable voisins_contourless
à chaque appel, on remarque que le programme tombe dans un état périodique:
...
[<Pixel at 0, 2>]
[<Pixel at 1, 1>, <Pixel at 1, 3>]
[<Pixel at 0, 0>, <Pixel at 0, 2>]
[<Pixel at 1, 1>, <Pixel at 0, 2>]
[<Pixel at 0, 2>]
[<Pixel at 1, 1>, <Pixel at 1, 3>]
...
En affichant l'attribut unread
à chaque appel, on obtient (au bout d'un nombre d'itérations) une alternance False True False True ...
jusqu'à dépassement de la max recursion depth. En fait, le <Pixel at 1, 1>
reste toujours à True
, les autres sont bien à False
.
Peut-être faut-il examiner la manière dont python stocke les variables lors d'appels récursifs (mise à jour de celles là dans les appels précédents ou non), ou utiliser une matrice de booléen remplaçant les attributs.
Lors de certaines séparations de contours, le parcours se passe mal, un pixel se retrouve isolé et le programme renvoie une KeyError
ou pop() from an empty list
.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.