多维轮廓列表筛选符合边界点数量条件的轮廓后,结果维度不符合预期的问题求助
问题排查与解决方案
问题根源
你的代码之所以丢失了原有的5个分组结构,核心原因是把所有符合条件的轮廓直接扁平化添加到了同一个列表中,没有按contours_list的原始分组维度进行嵌套收集。具体来说:
- 你用两层循环遍历DataFrame的行和列,每找到一个符合条件的轮廓就直接
append到selected_contours_list,最终所有符合条件的轮廓都处于同一层级,自然丢失了原有的5个分组结构。 - 用DataFrame存储这种不规则长度的轮廓列表其实没必要,反而会引入大量空值/无效元素,增加遍历的冗余操作。
解决方案:按原分组维度筛选
我们不需要借助DataFrame,直接遍历contours_list的每个分组(即原5个子列表),对每个分组单独筛选符合条件的轮廓,再将筛选后的分组作为子列表添加到结果中,就能保留你期望的(5, output)结构。
优化后的代码如下:
selected_contours_list = [] # 遍历原contours_list的每个分组(共5个) for contour_group in contours_list: # 对当前分组内的轮廓筛选,只保留边界点数量>=12的 filtered_group = [contour for contour in contour_group if len(contour) >= 12] # 将筛选后的分组添加到结果列表中 selected_contours_list.append(filtered_group)
代码解释
- 外层循环遍历
contours_list的每个分组(对应原结构的5个索引),确保我们不会丢失分组维度。 - 内层用列表推导式对当前分组的所有轮廓进行筛选,只保留
len(contour)>=12的轮廓。 - 把每个分组筛选后的结果作为一个子列表添加到
selected_contours_list,最终结果的结构就是[分组0筛选结果, 分组1筛选结果, ..., 分组4筛选结果],完全符合你期望的(5, output)结构。
验证结果结构
执行完上述代码后,你可以通过以下方式验证结构:
# 查看每个分组的符合条件轮廓数量 for idx, group in enumerate(selected_contours_list): print(f"分组{idx}的符合条件轮廓数量: {len(group)}") # 查看整体结构形状(每个元素是一个分组列表) print(f"整体结构形状: {np.shape(selected_contours_list)}")
这样就能得到和你预期一致的分组结构,每个分组内只保留符合条件的轮廓。
内容的提问来源于stack exchange,提问作者Far
相关产品推荐
相关产品推荐

