如何用Numpy高效查找紧邻黑色像素左侧的指定灰色像素?
高效实现目标像素定位(Numpy)
直接用Numpy的切片操作就能避开循环,核心是分别生成两个条件的布尔掩码,再取交集得到最终符合要求的像素位置:
生成目标灰度像素的掩码
用你原本的代码先定位所有符合灰度范围的像素,得到和图像同尺寸的布尔掩码:# 匹配(80±10, 71±10, 71±10)的灰度范围 mask_target = np.all(np.abs(img - (80, 71, 71)) < 10, axis=-1)生成「右侧紧邻黑色像素」的掩码
假设黑色像素定义为(0,0,0)(如果你的黑色是其他值,直接替换即可):- 先提取每一行中从第1列到最后一列的像素(也就是原图像每个像素的右侧邻接像素),判断这些像素是否为黑色
- 给这个结果左侧补一列
False(因为第一列的像素没有右侧邻接像素,必然不满足条件),得到和原图同形状的掩码:
mask_right_black = np.zeros_like(mask_target) # 给除最后一列外的所有像素,判断其右侧是否为黑色 mask_right_black[:, :-1] = np.all(img[:, 1:, :] == (0, 0, 0), axis=-1)取掩码交集,提取最终坐标
把两个掩码做逻辑与操作,再用np.where提取符合条件的像素坐标:final_mask = mask_target & mask_right_black y_coords, x_coords = np.where(final_mask)
完整代码示例
import numpy as np # 假设img是你的RGB图像,形状为(H, W, 3) img = np.random.randint(0, 256, size=(100, 100, 3), dtype=np.uint8) # 步骤1:生成目标灰度掩码 mask_target = np.all(np.abs(img - (80, 71, 71)) < 10, axis=-1) # 步骤2:生成右侧为黑色的掩码 mask_right_black = np.zeros_like(mask_target) mask_right_black[:, :-1] = np.all(img[:, 1:, :] == (0, 0, 0), axis=-1) # 步骤3:获取符合条件的像素坐标 final_mask = mask_target & mask_right_black y, x = np.where(final_mask) # 结果示例输出 print(f"找到符合条件的像素数量:{len(y)}") print(f"前5组坐标:{(y[:5], x[:5])}")
补充说明
- 如果是灰度图像(形状为(H,W)),只需去掉代码中的
axis=-1,同时把颜色值从三元组改成单值(比如把(80,71,71)换成均值74,黑色换成0) - 如果黑色不是严格的
(0,0,0),而是接近黑色的范围,可以把判断条件改成np.all(np.abs(img[:,1:,:] - (0,0,0)) < 5, axis=-1),调整阈值即可
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

