Python中查找特定红色像素坐标的优化实现方案求助
高效获取指定颜色区间像素坐标的Numpy优化方案
你的嵌套循环确实能实现需求,但面对大图像时效率会非常低——Numpy的核心优势就是向量化操作,可以完全替代Python层面的循环,大幅提升速度。
问题分析
你之前尝试的np.where没成功,是因为两个问题:
- 你写的
np.where((img > sought) & (img < gray), 0, img)是修改像素值,不是提取坐标; - 没有确保三个颜色通道同时满足区间条件,需要用
all(axis=2)来合并通道的判断结果。
优化后的代码
import numpy as np import cv2 # 先读入图像(示例) # img = cv2.imread("your_image_path.jpg") sought = np.array([10, 10, 140]) # BGR格式的颜色下限 gray = np.array([50, 50, 255]) # BGR格式的颜色上限 # 生成每个通道的区间掩码,再合并为全通道满足的掩码 channel_mask = (img > sought) & (img < gray) full_mask = channel_mask.all(axis=2) # axis=2表示沿颜色通道维度判断 # 获取满足条件的像素坐标:np.where返回(y坐标数组, x坐标数组) y_coords, x_coords = np.where(full_mask) # 输出坐标(和原代码格式一致) for x, y in zip(x_coords, y_coords): print(x) print(y) print("############################################")
关键说明
- 向量化操作:所有掩码计算都是在Numpy的底层C代码中执行,比Python循环快几十到上百倍;
- 通道顺序:cv2读入的图像是BGR格式,你的
sought和gray设置的是[蓝, 绿, 红],和这个格式匹配,不需要转换; - 掩码合并:
all(axis=2)确保只有当B、G、R三个通道都落在对应区间内时,该像素才被选中。
内容的提问来源于stack exchange,提问作者wet qr95
相关产品推荐
相关产品推荐

