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

Python读取图像指定列表位置像素灰度值并置黑问题求助

两个问题的具体原因

1. 循环变量不符合预期的原因

你对for...in...遍历数组的逻辑理解有误:当你遍历new_list_np这个形状为(n,2)的numpy数组时,每次拿到的i/j就是每一行的坐标值(比如第一次拿到的就是[11 5]),不是你以为的0、1、2...的索引值。
你后续写的new_list_np[i, 0]属于逻辑错误:相当于用坐标值作为行索引去取new_list_np的元素,只要坐标值不超过new_list_np的行数就不会报错,但拿到的完全不是你要的数值。

2. 灰度值为元组的原因

cv2.imread默认以三通道彩色模式读取图片,哪怕输入是单通道灰度图,也会自动转成BGR三通道格式,每个像素的取值是(灰度值,灰度值,灰度值)的三元组,所以你拿到的不是单一数值。读灰度图需要显式指定读取模式参数。

修正后的可运行代码
import cv2
import numpy as np

# 显式指定以灰度模式读取图片
img = cv2.imread("你的图片路径", cv2.IMREAD_GRAYSCALE)
# 不要用list当变量名,会覆盖Python内置关键字
pos_list = [(11, 5), (3, 16), (0, 25), (2, 40)]

list_w_greyvalue = []

# 直接遍历坐标列表即可,不需要转numpy数组
for x, y in pos_list:
    # 读取灰度值,此时拿到的就是0-255的单一整数
    list_w_greyvalue.append(img[y, x])
    # 直接设为黑色
    img[y, x] = 0

注:OpenCV的图片坐标顺序是[行,列],对应坐标系的[y,x],如果你的坐标列表是(x,y)格式需要注意顺序是否匹配

额外优化提示

如果你操作的坐标数量很多,用numpy的索引方式可以避免循环,运行效率更高:

pos_arr = np.array(pos_list)
# 批量读取灰度值
list_w_greyvalue = img[pos_arr[:,1], pos_arr[:,0]].tolist()
# 批量设为黑色
img[pos_arr[:,1], pos_arr[:,0]] = 0

内容的提问来源于stack exchange,提问作者StefanJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:54:03