如何用Numpy将两个点阵2D数组合并为3D点阵数组?
用Numpy高效实现数字图片的3D点阵组合
第一步:把单张数字图片转为布尔矩阵
先写一个工具函数,将单张图片转换成布尔矩阵(黑色像素标记为True),这种形式比直接存储坐标更适配后续Numpy操作:
import cv2 import numpy as np def load_digit_mask(img_path): # 按需求读取并旋转图片 image = cv2.rotate(cv2.imread(img_path), cv2.ROTATE_90_CLOCKWISE) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) threshold_level = 25 # 直接生成布尔矩阵:低于阈值的黑色像素为True return gray < threshold_level
第二步:批量加载所有数字的布尔矩阵
把0-9(以及你需要的特殊字符如R)的图片批量加载,存入字典方便后续调用:
# 假设图片命名为0.jpg、1.jpg...9.jpg、R.jpg,根据实际路径修改 digit_masks = {} # 加载0-9的数字掩码 for digit in range(10): digit_masks[str(digit)] = load_digit_mask(f"{digit}.jpg") # 加载特殊字符R的掩码 digit_masks["R"] = load_digit_mask("R.jpg")
第三步:组合两个数字为3D点阵块
借助Numpy的向量化操作,无需手动遍历维度,直接生成3D坐标数组:
def combine_two_digits(mask_left, mask_right, z_left=0, z_right=1): # 获取左边数字的黑色像素坐标(y, x) y_left, x_left = np.where(mask_left) # 生成对应z轴值 z_left_vals = np.full_like(y_left, z_left) # 组合成3D坐标(x, y, z),可根据需求调整坐标顺序 coords_left = np.column_stack([x_left, y_left, z_left_vals]) # 处理右边数字:x坐标偏移原图片宽度,实现并排效果 y_right, x_right = np.where(mask_right) x_right_shifted = x_right + mask_left.shape[1] # 偏移量为左边图片的列数(x轴范围) z_right_vals = np.full_like(y_right, z_right) coords_right = np.column_stack([x_right_shifted, y_right, z_right_vals]) # 合并左右两边的3D坐标 return np.vstack([coords_left, coords_right]) # 示例:组合数字8和字符R combined_coords = combine_two_digits(digit_masks["8"], digit_masks["R"]) # 将结果保存到文件 np.savetxt("8R_3d_coords.txt", combined_coords, fmt="%d")
核心优势
- 全程使用Numpy向量化操作,比手动遍历维度效率提升显著
- 布尔矩阵的形式让后续调整(如修改阈值、反转黑白)更灵活
- 坐标偏移、z轴赋值均为数组级操作,简洁且不易出错
内容的提问来源于stack exchange,提问作者psilo
相关产品推荐
相关产品推荐

