不使用imbinarize实现二值矩阵连通分量标记的代码调试问题
二值矩阵连通分量标记代码问题修复
原代码错误项
- 索引越界:直接访问
i-1、i+1、j-1、j+1未做边界判断,边缘像素访问会直接触发报错 - BFS逻辑错误:队列存储的是像素值而非像素坐标,处理队列元素时未弹出队首,错误给整行
M[0]赋值,也未同步修改邻接像素的标签 - 变量错误:最终返回的
labels未定义,实际标记结果存储在矩阵M中 - 缩进逻辑错误:while循环未放在
if M[i][j] == 1的分支内,会导致无意义的空队列判断,还会错误累加标签值 - 死循环风险:未判断邻接像素状态就直接塞入队列,会导致队列无限膨胀陷入死循环
修复后完整实现
import numpy as np from matplotlib import pyplot as plt def connected_components(image): # 复制输入二值图避免修改原数据,默认0为背景、1为前景 M = image.copy().astype(np.int32) row, column = M.shape # 初始标签从2开始,避免和前景初始值1、背景0冲突 L = 2 # 4邻接坐标偏移,如需8邻接可自行补充对角偏移量 offsets = [(-1, 0), (1, 0), (0, -1), (0, 1)] for i in range(row): for j in range(column): # 定位未标记的前景像素 if M[i][j] == 1: M[i][j] = L # BFS队列存储像素坐标 q = [(i, j)] while q: # 弹出队首坐标处理 x, y = q.pop(0) # 遍历所有邻接像素 for dx, dy in offsets: nx = x + dx ny = y + dy # 同时满足边界合法、为未标记前景两个条件才处理 if 0 <= nx < row and 0 <= ny < column and M[nx][ny] == 1: M[nx][ny] = L q.append((nx, ny)) # 单连通分量处理完成,标签自增 L += 1 # 可选配置:将标签统一减1,让前景标签从1开始,背景保持0 # M[M > 0] = M[M > 0] - 1 labels = M return labels
测试用例
# 输入测试二值图 test_img = np.array([ [1, 0, 0, 1], [1, 1, 0, 1], [0, 0, 1, 0], [0, 0, 1, 1] ], dtype=np.uint8) labeled_result = connected_components(test_img) print(labeled_result)
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

