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
相关产品推荐
相关产品推荐

