2025.12.27
对列表元素的 提取的 复习
python
import numpy as np
sorted_points = 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.]])
delta = sorted_points[1:] - sorted_points[:-1] # 相邻差值
# print(f'delta={delta}')
# print(f'sorted_points[1:]={sorted_points[1:]}')
"""
sorted_points[1:] 是 去掉第一个点之后剩下的所有点(从索引 1 到末尾)。
换句话说,它就是原数组的 "后 N-1 行"。
"""
# print(f'sorted_points[:-1]={sorted_points[:-1]}')
"""
与 sorted_points[:-1](去掉最后一行)配对,就能 逐行对齐 得到相邻两点,方便算向量差或距离。
"""
"""
delta=[[ -1. 0.]
[ -1. 0.]
[ -1. 0.]
[ -1. 0.]
[ -1. 0.]
[ -1. 0.]
[ 3. -112.]
[ -1. 0.]
[ -1. 0.]
[ -1. 0.]
[ -1. 0.]]
sorted_points[1:]=[[704. 538.]
[703. 538.]
[702. 538.]
[701. 538.]
[700. 538.]
[699. 538.]
[702. 426.]
[701. 426.]
[700. 426.]
[699. 426.]
[698. 426.]]
sorted_points[:-1]=[[705. 538.]
[704. 538.]
[703. 538.]
[702. 538.]
[701. 538.]
[700. 538.]
[699. 538.]
[702. 426.]
[701. 426.]
[700. 426.]
[699. 426.]]
"""
print(f'sorted_points[1]={sorted_points[1]}') #列表第2的元素 (序号:0,1,2,3,4.....
print(f'sorted_points[-1]={sorted_points[-1]}')
print(f'sorted_points[1:1]={sorted_points[1:1]}')
"""
sorted_points[1]=[704. 538.]
sorted_points[-1]=[698. 426.]
sorted_points[1:1]=[]
"""
print(f'sorted_points[0:0]={sorted_points[0:0]}')
print(f'sorted_points[1:0]={sorted_points[1:0]}')
print(f'sorted_points[1:4]={sorted_points[1:4]}')
"""
sorted_points[0:0]=[]
sorted_points[1:0]=[]
sorted_points[1:4]=[[704. 538.]
[703. 538.]
[702. 538.]]
"""
骨架点提取及排序
不完整弧形
python
skeleton_points=[[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.]]
排序后的骨架点数量: 234
原始中点: (751.00, 480.41)
细化中点: (751.00, 480.87)
从二值图像计算的中点坐标: (751.00, 480.87)
中点到起点的距离: 76.29 像素
中点到终点的距离: 73.35 像素
距离比例: 1.040
观察skeleton_points 对应像素坐标(x,y)即 (u,v)
y是逐渐增大, x存在先增大后减小。
不完整弧形图片:

针对完整弧形(圆形)
python
提取的骨架点数量: 312
skeleton_points=[[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.]]
排序后的骨架点数量: 312
原始中点: (1047.93, 388.09)
细化中点: (1046.57, 388.15)
(x,y)
y遵循从小到大的顺序;
x存在有大有小, 原因:因为是完整的圆,所以存在
先(998,428)再(1017,428),
完整弧形图片

注意:

将骨骼点按 列表序号,点i连接i+1,点i+1连接 点i+2
由于完整弧形的骨骼点排序与 非完整弧形排序不同,因此使用此方法绘制曲线时,存在将弧形内部填充的问题。而不是仅绘制轮廓线。
代码:
python
# 使用Zhang-Suen细化算法提取骨架
skeleton = cv2.ximgproc.thinning(binary_image)
# 找到所有骨架点坐标(白色像素)
skeleton_points = np.column_stack(np.where(skeleton > 0))
# 注意:np.where返回的是(y, x)坐标,需要转换为(x, y)
skeleton_points_xy = skeleton_points[:, [1, 0]].astype(np.float32)
作用:将二值图像中的目标物体(白色部分)细化为单像素宽的骨架
输入 :binary_image - 二值图像(通常是0和255,表示背景和目标)
输出 :skeleton - 骨架图像,单像素宽的线条表示原始物体的"中心线"
作用:找到骨架图像中所有非零像素(即骨架点)的位置坐标
输出格式 :skeleton_points 是一个二维数组,每行是一个点的坐标,格式为 [y, x]
3.
作用 :将坐标从 (y, x) 转换为 (x, y) 格式
输出格式 :skeleton_points_xy 是一个二维数组,每行是一个点的坐标,格式为 [x, y]