You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Numpy高效查找紧邻黑色像素左侧的指定灰色像素?

高效实现目标像素定位(Numpy)

直接用Numpy的切片操作就能避开循环,核心是分别生成两个条件的布尔掩码,再取交集得到最终符合要求的像素位置:

  1. 生成目标灰度像素的掩码
    用你原本的代码先定位所有符合灰度范围的像素,得到和图像同尺寸的布尔掩码:

    # 匹配(80±10, 71±10, 71±10)的灰度范围
    mask_target = np.all(np.abs(img - (80, 71, 71)) < 10, axis=-1)
    
  2. 生成「右侧紧邻黑色像素」的掩码
    假设黑色像素定义为(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)
    
  3. 取掩码交集,提取最终坐标
    把两个掩码做逻辑与操作,再用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:01:19