基于numpy ndarray遍历粉色像素沿正交方向测算图像黑区宽度
解决方案
你原有的代码是遍历全图所有像素打印值,完全不需要这么做——你已经提前提取到了所有粉色像素的坐标,只需要针对这些坐标做定向步进遍历即可,核心逻辑是沿指定正交方向逐像素移动,首次检测到黑到白的过渡时记录步进长度,就是对应方向的黑色区域宽度。
前置参数定义
先根据你的实际场景配置固定参数,避免硬编码:
- 固定黑、白、粉色的RGB参考值,可根据图像实际色彩微调
- 配置正交行进方向的偏移量,默认给出上下左右4个正方向,可对照你图里的黄色标注线保留需要的方向
- 配置颜色容差,适配图像压缩带来的轻微色偏
完整实现代码
import numpy as np # ========== 以下参数按实际场景修改 ========== # 颜色参考值 BLACK_RGB = np.array([0, 0, 0], dtype=np.uint8) WHITE_RGB = np.array([255, 255, 255], dtype=np.uint8) # 行进方向:(行偏移, 列偏移),不需要的方向直接注释掉即可 MOVE_DIRECTIONS = [ (0, 1), # 向右 (0, -1), # 向左 (1, 0), # 向下 (-1, 0) # 向上 ] # 颜色匹配容差,纯色无压缩的图设为0即可 COLOR_ERR_TOL = 3 # 你已经提取到的粉色像素坐标数组,要求shape为[N, 2],每行存储(行号i, 列号j) pink_pixels_arr: np.ndarray = ... # 原始RGB图像数组 rgb_img: np.ndarray = ... # ========================================== img_h, img_w = rgb_img.shape[:2] black_width_res = [] def match_color(pixel: np.ndarray, target: np.ndarray) -> bool: """带容差的像素颜色匹配""" return np.all(np.abs(pixel.astype(np.int16) - target) <= COLOR_ERR_TOL) # 只遍历粉色像素点,不扫全图 for start_i, start_j in pink_pixels_arr: dir_width = {} # 每个方向单独步进 for di, dj in MOVE_DIRECTIONS: cur_i, cur_j = start_i, start_j step_count = 0 # 不超出图像边界时持续步进 while 0 <= cur_i < img_h and 0 <= cur_j < img_w: cur_p = rgb_img[cur_i, cur_j] # 检测到白色边界,记录距离终止当前方向遍历 if match_color(cur_p, WHITE_RGB): dir_width[f"dir({di},{dj})"] = step_count break cur_i += di cur_j += dj step_count += 1 black_width_res.append({ "pink_pixel_pos": (start_i, start_j), "black_width_each_dir": dir_width }) # 输出结果示例 for item in black_width_res: print(f"粉色像素坐标{item['pink_pixel_pos']},各方向黑色区域宽度:{item['black_width_each_dir']}")
使用说明
- 如果你的正交方向不是正上下左右(比如和参考方向呈90度的斜向),直接修改
MOVE_DIRECTIONS里的坐标偏移值即可 - 因为是沿直线正交行进,直接用步进计数作为距离即可,不需要额外计算欧氏距离,执行效率更高
- 如果图像存在少量噪点,可适当调大
COLOR_ERR_TOL数值,避免误判边界 - 该逻辑只遍历粉色像素和对应方向上的黑色路径像素,比你原有全图遍历的代码效率高几个数量级,大尺寸图像也能快速跑完
内容的提问来源于stack exchange,提问作者quest1001
相关产品推荐
相关产品推荐

