2025.12.27
Exemple de traitement des coordonnées squelettiques
import numpy as np
points_squelette = np.array([[705., 538.],
[704., 538.],
[703., 538.],
[702., 538.],
[701., 538.],
[700., 538.],
[699., 538.],
[702., 426.],
[701., 426.],
[700., 426.],
[699., 426.],
[698., 426.]])
ecarts = np.diff(points_squelette, axis=0) # Calcul des différences entre points consécutifs
# print(f'ecarts={ecarts}')
# print(f'points_squelette[1:]={points_squelette[1:]}')
"""
points_squelette[1:] contient tous les points sauf le premier (indices 1 à la fin)
"""
# print(f'points_squelette[:-1]={points_squelette[:-1]}')
"""
Les paires de points alignés permettent le calcul de vecteurs ou distances
"""
print(f'points_squelette[1]={points_squelette[1]}') # Deuxième élément de la liste
print(f'points_squelette[-1]={points_squelette[-1]}') # Dernier élément
print(f'points_squelette[1:1]={points_squelette[1:1]}') # Segment vide
"""
points_squelette[1]=[704. 538.]
points_squelette[-1]=[698. 426.]
points_squelette[1:1]=[]
"""
print(f'points_squelette[0:0]={points_squelette[0:0]}')
print(f'points_squelette[1:0]={points_squelette[1:0]}')
print(f'points_squelette[1:4]={points_squelette[1:4]}')
"""
points_squelette[0:0]=[]
points_squelette[1:0]=[]
points_squelette[1:4]=[[704. 538.]
[703. 538.]
[702. 538.]]
"""
Extraction et tri des points squelettiques
Arc partiel
points_squelette=[[698. 426.]
[699. 426.]
[700. 426.]
[701. 426.]
[702. 426.]
[703. 426.]
[704. 426.]
[690. 427.]
[691. 427.]
[692. 427.]
[693. 427.]
[694. 427.]
[695. 427.]
[696. 427.]
[697. 427.]
[698. 427.]
[704. 427.]
[705. 427.]
[688. 428.]
[689. 428.]
[706. 428.]
[707. 428.]
[677. 429.]
[678. 429.]
[679. 429.]
[680. 429.]
[681. 429.]
[682. 429.]
[683. 429.]
[684. 429.]
[685. 429.]
[686. 429.]
[687. 429.]
[707. 429.]
[708. 429.]
[708. 430.]
[709. 430.]
[709. 431.]
[710. 431.]
[710. 432.]
[711. 432.]
[711. 433.]
[712. 433.]
[712. 434.]
[713. 434.]
[714. 434.]
[714. 435.]
[715. 435.]
[716. 436.]
[717. 436.]
[718. 436.]
[719. 436.]
[720. 436.]
[721. 436.]
[722. 436.]
[723. 436.]
[724. 436.]
[725. 437.]
[726. 437.]
[727. 437.]
[728. 438.]
[729. 438.]
[730. 438.]
[731. 439.]
[732. 440.]
[733. 440.]
[733. 441.]
[734. 441.]
[735. 441.]
[735. 442.]
[736. 442.]
[736. 443.]
[737. 443.]
[737. 444.]
[738. 444.]
[738. 445.]
[739. 445.]
[739. 446.]
[739. 447.]
[740. 447.]
[740. 448.]
[740. 449.]
[741. 449.]
[741. 450.]
[742. 450.]
[742. 451.]
[743. 451.]
[743. 452.]
[744. 452.]
[744. 453.]
[745. 453.]
[746. 453.]
[746. 454.]
[747. 455.]
[747. 456.]
[747. 457.]
[747. 458.]
[747. 459.]
[748. 459.]
[748. 460.]
[748. 461.]
[748. 462.]
[748. 463.]
[749. 464.]
[749. 465.]
[750. 466.]
[750. 467.]
[750. 468.]
[750. 469.]
[750. 470.]
[750. 471.]
[750. 472.]
[750. 473.]
[751. 473.]
[751. 474.]
[751. 475.]
[751. 476.]
[751. 477.]
[751. 478.]
[751. 479.]
[751. 480.]
[751. 481.]
[751. 482.]
[751. 483.]
[751. 484.]
[751. 485.]
[751. 486.]
[751. 487.]
[751. 488.]
[751. 489.]
[751. 490.]
[751. 491.]
[751. 492.]
[751. 493.]
[751. 494.]
[751. 495.]
[751. 496.]
[751. 497.]
[751. 498.]
[750. 499.]
[750. 500.]
[750. 501.]
[750. 502.]
[750. 503.]
[749. 504.]
[750. 504.]
[748. 505.]
[749. 505.]
[747. 506.]
[747. 507.]
[746. 508.]
[745. 509.]
[744. 510.]
[745. 510.]
[743. 511.]
[744. 511.]
[742. 512.]
[743. 512.]
[742. 513.]
[741. 514.]
[742. 514.]
[740. 515.]
[741. 515.]
[740. 516.]
[739. 517.]
[738. 518.]
[737. 519.]
[738. 519.]
[736. 520.]
[737. 520.]
[736. 521.]
[735. 522.]
[736. 522.]
[734. 523.]
[735. 523.]
[733. 524.]
[734. 524.]
[732. 525.]
[733. 525.]
[730. 526.]
[731. 526.]
[732. 526.]
[729. 527.]
[730. 527.]
[728. 528.]
[729. 528.]
[727. 529.]
[725. 530.]
[726. 530.]
[723. 531.]
[724. 531.]
[725. 531.]
[721. 532.]
[722. 532.]
[716. 533.]
[717. 533.]
[718. 533.]
[719. 533.]
[720. 533.]
[714. 534.]
[715. 534.]
[710. 535.]
[711. 535.]
[712. 535.]
[713. 535.]
[714. 535.]
[707. 536.]
[708. 536.]
[709. 536.]
[682. 537.]
[683. 537.]
[684. 537.]
[685. 537.]
[686. 537.]
[687. 537.]
[688. 537.]
[706. 537.]
[689. 538.]
[690. 538.]
[691. 538.]
[692. 538.]
[693. 538.]
[694. 538.]
[695. 538.]
[696. 538.]
[697. 538.]
[698. 538.]
[699. 538.]
[700. 538.]
[701. 538.]
[702. 538.]
[703. 538.]
[704. 538.]
[705. 538.]]
Nombre de points squelettiques : 234
Coordonnées du centre : (751.00, 480.87)
Distance du centre au début : 76.29 pixels
Distance du centre à la fin : 73.35 pixels
Rapport de distances : 1.040
Analyse des coordonnées (x,y) ou (u,v)
La composante y augmente progressivement tandis que x présente d'abord une augmentation puis une diminution.
Arc complet (cercle)
Nombre de points squelettiques extraits : 312
points_squelette=[[1008. 348.]
[1009. 348.]
[1010. 348.]
[1011. 348.]
[1012. 348.]
[1013. 348.]
[1014. 348.]
[1015. 348.]
[1016. 348.]
[1017. 348.]
[1018. 348.]
[1019. 348.]
[1020. 348.]
[1021. 348.]
[1022. 348.]
[1023. 348.]
[1024. 348.]
[1025. 348.]
[1026. 348.]
[ 992. 349.]
[ 993. 349.]
[ 994. 349.]
[ 995. 349.]
[ 996. 349.]
[ 997. 349.]
[ 998. 349.]
[ 999. 349.]
[1000. 349.]
[1001. 349.]
[1002. 349.]
[1003. 349.]
[1004. 349.]
[1005. 349.]
[1006. 349.]
[1007. 349.]
[1027. 349.]
[1028. 349.]
[ 988. 350.]
[ 989. 350.]
[ 990. 350.]
[ 991. 350.]
[ 992. 350.]
[1028. 350.]
[1029. 350.]
[1030. 350.]
[ 986. 351.]
[ 987. 351.]
[1030. 351.]
[1031. 351.]
[ 983. 352.]
[ 984. 352.]
[ 985. 352.]
[1032. 352.]
[1033. 352.]
[ 982. 353.]
[ 983. 353.]
[1034. 353.]
[1035. 353.]
[ 981. 354.]
[ 982. 354.]
[1036. 354.]
[1037. 354.]
[ 980. 355.]
[ 981. 355.]
[1037. 355.]
[1038. 355.]
[ 978. 356.]
[ 979. 356.]
[1038. 356.]
[1039. 356.]
[ 977. 357.]
[ 978. 357.]
[1039. 357.]
[1040. 357.]
[ 976. 358.]
[ 977. 358.]
[1040. 358.]
[1041. 358.]
[ 975. 359.]
[ 976. 359.]
[1041. 359.]
[1042. 359.]
[ 974. 360.]
[ 975. 360.]
[1042. 360.]
[ 973. 361.]
[ 974. 361.]
[1043. 361.]
[ 973. 362.]
[1044. 362.]
[ 972. 363.]
[1044. 363.]
[1045. 363.]
[ 971. 364.]
[ 972. 364.]
[1045. 364.]
[1046. 364.]
[ 971. 365.]
[1046. 365.]
[1047. 365.]
[ 970. 366.]
[1047. 366.]
[ 969. 367.]
[ 970. 367.]
[1048. 367.]
[ 969. 368.]
[1048. 368.]
[1049. 368.]
[ 968. 369.]
[ 969. 369.]
[1049. 369.]
[1050. 369.]
[ 967. 370.]
[ 968. 370.]
[1050. 370.]
[ 967. 371.]
[1050. 371.]
[1051. 371.]
[ 966. 372.]
[1051. 372.]
[1052. 372.]
[ 965. 373.]
[1052. 373.]
[1053. 373.]
[ 964. 374.]
[ 965. 374.]
[1053. 374.]
[ 964. 375.]
[1054. 375.]
[ 963. 376.]
[1054. 376.]
[ 963. 377.]
[1054. 377.]
[ 963. 378.]
[1054. 378.]
[ 963. 379.]
[1055. 379.]
[ 963. 380.]
[1055. 380.]
[ 963. 381.]
[1055. 381.]
[ 963. 382.]
[1055. 382.]
[ 963. 383.]
[1056. 383.]
[ 963. 384.]
[1056. 384.]
[ 963. 385.]
[1056. 385.]
[ 963. 386.]
[1056. 386.]
[ 963. 387.]
[1056. 387.]
[ 963. 388.]
[1056. 388.]
[ 963. 389.]
[1056. 389.]
[ 964. 390.]
[1056. 390.]
[ 964. 391.]
[1056. 391.]
[ 964. 392.]
[1055. 392.]
[ 964. 393.]
[1055. 393.]
[ 964. 394.]
[1055. 394.]
[ 964. 395.]
[1055. 395.]
[ 964. 396.]
[1054. 396.]
[1055. 396.]
[ 964. 397.]
[1054. 397.]
[ 964. 398.]
[1053. 398.]
[1054. 398.]
[ 964. 399.]
[1052. 399.]
[1053. 399.]
[ 964. 400.]
[1052. 400.]
[ 964. 401.]
[1051. 401.]
[ 964. 402.]
[1051. 402.]
[ 964. 403.]
[ 965. 403.]
[1051. 403.]
[ 965. 404.]
[1050. 404.]
[1051. 404.]
[ 966. 405.]
[1049. 405.]
[1050. 405.]
[ 966. 406.]
[1049. 406.]
[ 966. 407.]
[1048. 407.]
[1049. 407.]
[ 967. 408.]
[1048. 408.]
[ 968. 409.]
[1047. 409.]
[1048. 409.]
[ 968. 410.]
[ 969. 410.]
[1047. 410.]
[ 969. 411.]
[1046. 411.]
[ 970. 412.]
[1045. 412.]
[1046. 412.]
[ 971. 413.]
[1045. 413.]
[ 971. 414.]
[ 972. 414.]
[1044. 414.]
[1045. 414.]
[ 972. 415.]
[ 973. 415.]
[1043. 415.]
[1044. 415.]
[ 973. 416.]
[ 974. 416.]
[1042. 416.]
[1043. 416.]
[ 974. 417.]
[ 975. 417.]
[1041. 417.]
[1042. 417.]
[ 975. 418.]
[ 976. 418.]
[1040. 418.]
[1041. 418.]
[ 976. 419.]
[ 977. 419.]
[1038. 419.]
[1039. 419.]
[1040. 419.]
[ 977. 420.]
[ 978. 420.]
[1037. 420.]
[ 978. 421.]
[ 979. 421.]
[1035. 421.]
[1036. 421.]
[ 979. 422.]
[ 980. 422.]
[1034. 422.]
[1035. 422.]
[ 980. 423.]
[ 981. 423.]
[1033. 423.]
[1034. 423.]
[ 982. 424.]
[ 983. 424.]
[ 984. 424.]
[ 985. 424.]
[ 986. 424.]
[ 987. 424.]
[ 988. 424.]
[ 989. 424.]
[ 990. 424.]
[1032. 424.]
[1033. 424.]
[ 991. 425.]
[ 992. 425.]
[1031. 425.]
[1032. 425.]
[ 993. 426.]
[ 994. 426.]
[1030. 426.]
[1031. 426.]
[ 995. 427.]
[ 996. 427.]
[ 997. 427.]
[1029. 427.]
[1030. 427.]
[ 998. 428.]
[ 999. 428.]
[1026. 428.]
[1027. 428.]
[1028. 428.]
[1000. 429.]
[1001. 429.]
[1002. 429.]
[1003. 429.]
[1004. 429.]
[1023. 429.]
[1024. 429.]
[1025. 429.]
[1004. 430.]
[1005. 430.]
[1006. 430.]
[1007. 430.]
[1020. 430.]
[1021. 430.]
[1022. 430.]
[1023. 430.]
[1008. 431.]
[1009. 431.]
[1010. 431.]
[1011. 431.]
[1015. 431.]
[1016. 431.]
[1017. 431.]
[1018. 431.]
[1019. 431.]
[1012. 432.]
[1013. 432.]
[1014. 432.]]
Nombre de points squelettiques triés : 312
Coordonnées du centre original : (1047.93, 388.09)
Coordonnées du centre affiné : (1046.57, 388.15)
(x,y)
La composante y suit un ordre croissant;
la composante x présente des variations (998,428) puis (1017,428) car c'est un cercle complet
Image d'arc complet
Pour les arcs convexes vers la gauche et concaves vers la droite :
Premier arc : convexe vers la droite, concave vers la gauche
points_squelette_xy=[[475. 398.]
[476. 398.]
[477. 398.]
...
[475. 526.]
[476. 526.]
[477. 526.]]
Nombre de points squelettiques extraits : 1152
Nombre de points squelettiques triés : 1152
L'analyse montre que le tri suit x croissant puis y croissant, avec y comme priorité.
Considérations : Pour les formes concaves orientées vers la droite ou la gauche, le tri des points squelettiques produit des comportements différents, créant des redondances dans les calculs de distances. Cela peut affecter la détermination du centre de la courbe.
Questions :
(1) Comment définir une stratégie de tri pour les points squelettiques,
(2) Comment effectuer les calculs basés sur ces points
Pour les cas où x décroît puis croît tandis que y croît constamment, faut-il détecter la concavité ?
Quatre méthodes de tri seraient nécessaires pour les quatre directions de concavité (haut/bas, gauche/droite), ainsi que pour les diagonales (nord-ouest, sud-ouest, nord-est, sud-est). Comment choisir la méthode appropriée ?
Code :
# Extraction du squelette avec l'algorithme de Zhang-Suen
squelette = cv2.ximgproc.thinning(image_binaire)
# Récupération des coordonnées des points squelettiques
points_squelette = np.column_stack(np.where(squelette > 0))
# Conversion des coordonnées de (y, x) vers (x, y)
points_squelette_xy = points_squelette[:, [1, 0]].astype(np.float32)
1.
Fonction : Réduction d'un objet binaire à une ligne squelette de largeur unitaire
Entrée : image_binaire - image en niveaux de gris (valeurs 0 et 255) Sortie : squelette - image squelette avec des lignes d'une pixel de largeur représentant l'axe central
2.
Fonction : Extraction des coordonnées des pixels non nuls dans l'image squelete
Format de sortie : points_squelette est un tableau 2D contenant les coordonnées [y, x] de chaque point
3.
Fonction : Conversion des coordonnées de (y, x) vers (x, y)
Format de sortie : points_squelette_xy est un tableau 2D contenant les coordonnées [x, y] de chaque point