如何按蛇形路径排序二值图像中提取的1值坐标列表?
蛇形路径排序二值图像坐标列表的实现方案
咱们先明确蛇形路径的常见定义:一般是从上到下遍历行,奇数行(从0开始计数)保持从左到右的顺序,偶数行反转成从右到左,形成“左→右→左→右...”的交替路径。结合你给出的代码片段,我来一步步实现这个逻辑:
核心实现思路
- 按行分组坐标:先把所有值为1的坐标(图像中
y对应行号,x对应列号)按行归类,同一行的坐标放在一起(原列表已经是从左到右,所以同一行的x是递增的)。 - 交替反转行内顺序:遍历每一行,对偶数索引的行(比如第1、3行)反转顺序,奇数索引的行保持原顺序,最终拼接成蛇形排列的列表。
完整代码示例
from __future__ import division import numpy as np import cv2 from skimage.morphology import skeletonize, skeletonize_3d, medial_axis # 读取二值图像并预处理 diff = cv2.imread('img.png', 0) diff = diff.astype('uint8') # 获取值为1的坐标列表:注意np.where返回(y, x),转成(x, y)符合直观的左右顺序 y_coords, x_coords = np.where(diff == 1) original_coords = list(zip(x_coords, y_coords)) # ------------------- 蛇形排序核心逻辑 ------------------- # 1. 按行(y值)分组,确保行从上到下排序 unique_ys = sorted(set(y_coords)) row_groups = [] for y in unique_ys: # 提取当前行的所有坐标,原顺序是从左到右 row_coords = [coord for coord in original_coords if coord[1] == y] row_groups.append(row_coords) # 2. 交替反转行内顺序,生成蛇形列表 snake_coords = [] for idx, row in enumerate(row_groups): if idx % 2 == 0: # 偶数索引行(第0、2、4...行)保持左→右 snake_coords.extend(row) else: # 奇数索引行(第1、3、5...行)反转成右→左 snake_coords.extend(row[::-1]) # ------------------------------------------------------- # 验证结果 print("原坐标前5个:", original_coords[:5]) print("蛇形排序后前5个:", snake_coords[:5])
关键细节说明
- 坐标格式注意:
np.where返回的是(行索引, 列索引),也就是(y, x),所以要转成(x, y)才符合“从左到右”的直观顺序。 - 自定义蛇形方向:如果你的需求是第一行就从右到左,只需要把判断条件改成
idx % 2 == 1即可。 - 大数据量优化:如果图像很大、坐标数量极多,用numpy的向量化操作替代列表推导会更高效:
# numpy优化版分组与排序 sorted_indices = np.argsort(y_coords) sorted_x = x_coords[sorted_indices] sorted_y = y_coords[sorted_indices] # 找到每行的分割点 split_points = np.where(np.diff(sorted_y))[0] + 1 row_x_groups = np.split(sorted_x, split_points) row_y_groups = np.split(sorted_y, split_points) # 生成蛇形坐标 snake_coords = [] for idx, (x_group, y_group) in enumerate(zip(row_x_groups, row_y_groups)): coords = list(zip(x_group[::-1], y_group[::-1])) if idx % 2 else list(zip(x_group, y_group)) snake_coords.extend(coords)
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

