如何计算10张同尺寸图片中指定像素点(150,220)的平均值?
计算多张图片指定像素点的BGR平均值
嘿,我来帮你搞定这个计算多张图片指定像素平均值的问题~首先咱们先理清楚核心逻辑:要算出(150,220)这个像素点的平均值,就是把每张图片在这个位置的三个通道数值分别累加,再除以图片总数就行。另外要注意哦,OpenCV读取的图片是BGR通道顺序(不是咱们常说的RGB),这点别搞混啦。
先说说你现有代码可以优化的地方:逐个定义img1到img10太繁琐了,要是以后图片数量变多,维护起来超麻烦,咱们用循环批量读取图片,既简洁又灵活。
下面是完整的实现代码,我会一步步给你解释:
import cv2 # 定义图片路径的前缀和总数量 img_prefix = r'E:/000' total_imgs = 10 # 指定要计算的像素坐标:(x, y),对应OpenCV的索引格式img[y, x] target_x = 150 target_y = 220 # 初始化三个通道的累加变量 sum_blue = 0 sum_green = 0 sum_red = 0 # 循环读取每张图片并累加像素值 for i in range(1, total_imgs + 1): # 生成图片路径:比如i=1时是E:/0001.jpg,i=10时是E:/0010.jpg img_path = f"{img_prefix}{i}.jpg" img = cv2.imread(img_path) # 检查图片是否成功读取,避免因图片损坏/路径错误导致程序崩溃 if img is None: print(f"警告:无法读取图片 {img_path}") continue # 提取目标像素的BGR值并累加 b, g, r = img[target_y, target_x] sum_blue += b sum_green += g sum_red += r # 计算平均值,可根据需求转成整数或保留小数 avg_blue = sum_blue / total_imgs avg_green = sum_green / total_imgs avg_red = sum_red / total_imgs # 输出结果 print(f"目标像素({target_x}, {target_y})的BGR平均值:[{avg_blue}, {avg_green}, {avg_red}]")
代码细节说明:
- 批量读取优化:通过循环自动生成图片路径,不用手动逐个定义变量,哪怕以后图片数量变成20张,只需要改
total_imgs的值就行 - 像素索引对应:OpenCV中图片的索引规则是
img[y, x],所以你指定的(150,220)对应img[220, 150],和你的示例完全匹配 - 异常防护:加入了图片读取失败的判断,避免某张图片出问题导致整段代码报错
- 结果灵活处理:如果需要整数形式的平均值,只需要把计算结果套上
int()就行,比如int(avg_blue)
拿你给的示例测试的话,假设每张图片的目标像素值依次是[1,2,3]、[2,3,4]……[10,11,12],运行代码后会得到:
目标像素(150, 220)的BGR平均值:[5.5, 6.5, 7.5]
完全符合你预期的计算结果~
内容的提问来源于stack exchange,提问作者user9147145
相关产品推荐
相关产品推荐

