Colab运行A*算法手写文档行分割代码触发IndexError报错求助
A*手写文档行分割IndexError报错解决方案
错误根因
报错IndexError: index 0 is out of bounds for axis 0 with size 0的本质是切片得到的数组为空,没有有效元素可访问,有两个常见触发场景:
- 遍历
hpp_clusters时拿到的cluster_of_interest起止高度非法:cluster_of_interest[0] >= cluster_of_interest[-1],导致切出来的nmap高度为0 road_blocks的起止宽度非法:road_blocks[0] >= nmap.shape[1]或road_blocks[1]+10 <= 0,导致切出来的窗口宽度为0
修复方法
在操作切片前增加非空校验,跳过非法的无效切片即可,修改后的代码如下:
def group_the_road_blocks(road_blocks): #group the road blocks road_blocks_cluster_groups = [] road_blocks_cluster = [] size = len(road_blocks) for index, value in enumerate(road_blocks): road_blocks_cluster.append(value) if index < size-1 and (road_blocks[index+1] - road_blocks[index]) > 1: road_blocks_cluster_groups.append([road_blocks_cluster[0], road_blocks_cluster[len(road_blocks_cluster)-1]]) road_blocks_cluster = [] if index == size-1 and len(road_blocks_cluster) > 0: road_blocks_cluster_groups.append([road_blocks_cluster[0], road_blocks_cluster[len(road_blocks_cluster)-1]]) road_blocks_cluster = [] return road_blocks_cluster_groups binary_image = get_binary(img) for cluster_of_interest in hpp_clusters: # 先校验高度切片是否合法 h_start, h_end = cluster_of_interest[0], cluster_of_interest[-1] if h_start >= h_end: continue nmap = binary_image[h_start:h_end,:] # 校验nmap是否非空 if nmap.shape[0] == 0 or nmap.shape[1] ==0: continue road_blocks = get_road_block_regions(nmap) road_blocks_cluster_groups = group_the_road_blocks(road_blocks) #create the doorways for index, road_blocks in enumerate(road_blocks_cluster_groups): w_start, w_end = road_blocks[0], road_blocks[1]+10 # 校验宽度切片是否合法 if w_start >= w_end or w_start >= nmap.shape[1]: continue window_image = nmap[:, w_start: w_end] if window_image.shape[0] ==0 or window_image.shape[1]==0: continue binary_image[h_start:h_end,:][:, w_start: w_end][int(window_image.shape[0]/2),:] *= 0
额外优化点
- 如果频繁出现非法切片,可以检查上游
hpp_clusters生成逻辑,是否对水平投影的结果做了过滤,排除了高度小于1的无效行区间 - 可以给
road_blocks加范围限制,避免超过图像宽度的数值出现
内容的提问来源于stack exchange,提问作者marwa
相关产品推荐
相关产品推荐

