如何利用空间滤波与矩阵运算识别迷宫图像的交点与端点
迷宫图像交点(红点)与端点(蓝点)识别方案(空间滤波+矩阵运算)

一、图像预处理:二值化转换
先将迷宫图像转换为二值矩阵:把黑色路径像素设为1,白色背景设为0,得到尺寸为H×W的矩阵M。可以用OpenCV的工具快速实现:
import cv2 import numpy as np img = cv2.imread("maze.png", 0) _, binary_img = cv2.threshold(img, 127, 1, cv2.THRESH_BINARY_INV) M = np.array(binary_img)
二、邻域连通数计算(空间滤波核心)
交点和端点的本质区别是邻域内连通的路径数量,我们用3×3滑动窗口(空间滤波)批量统计每个路径点的连通数:
- 设计全1卷积核
K = np.ones((3,3)),对二值矩阵M做卷积运算,得到每个点的3×3邻域像素和矩阵S - 连通数矩阵
C = S - M:减去当前点自身的1,得到邻域内其他路径点的数量
这一步的卷积运算等价于手动滑动窗口统计,但效率更高,适合批量处理大尺寸图像。
三、交点与端点的判定规则
遍历连通数矩阵C,结合原二值矩阵M(确保是路径点):
- 端点(蓝点):当
C[i][j] == 1且M[i][j] == 1时,该点是端点(仅1个方向连通) - 交点(红点):当
C[i][j] >= 3且M[i][j] == 1时,该点是交点(3个或4个方向连通)
四、结果可视化
将识别出的点标记到原图像上:
# 读取彩色原图用于标记 color_img = cv2.imread("maze.png") # 遍历矩阵标记点 for i in range(M.shape[0]): for j in range(M.shape[1]): if M[i][j] == 1: if C[i][j] == 1: # 标记蓝点(端点) cv2.circle(color_img, (j, i), 3, (255, 0, 0), -1) elif C[i][j] >= 3: # 标记红点(交点) cv2.circle(color_img, (j, i), 3, (0, 0, 255), -1) cv2.imwrite("marked_maze.png", color_img)
内容的提问来源于stack exchange,提问作者Yixuan Liu
相关产品推荐
相关产品推荐

