骨架点排序计算

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]

相关推荐
AC赳赳老秦2 小时前
行业数据 benchmark 对比:DeepSeek上传数据生成竞品差距分析报告
开发语言·网络·人工智能·python·matplotlib·涛思数据·deepseek
小鸡吃米…2 小时前
带Python的人工智能——深度学习
人工智能·python·深度学习
胡伯来了2 小时前
07 - 数据收集 - 网页采集工具Scrapy
python·scrapy·数据采集
御水流红叶2 小时前
第七届金盾杯(第一次比赛)wp
开发语言·python
小徐Chao努力2 小时前
【Langchain4j-Java AI开发】04-AI 服务核心模式
java·人工智能·python
白日做梦Q2 小时前
预训练模型微调(Finetune)实战:策略、技巧及常见误区规避
人工智能·python·神经网络·机器学习·计算机视觉
历程里程碑2 小时前
双指针巧解LeetCode接雨水难题
java·开发语言·数据结构·c++·python·flask·排序算法
玄同7652 小时前
Python 流程控制:LLM 批量推理与 API 限流处理
服务器·人工智能·python·深度学习·自然语言处理·数据挖掘·知识图谱
乾元2 小时前
生成对抗样本在网络安全中的工程化解读——AI 误报、误判与对抗的真实边界
运维·网络·人工智能·python·安全·web安全