【问题标题】:How to get the average value of RGB single channel of multiple images with Numpy Python?如何用 Numpy Python 获取多张图像的 RGB 单通道的平均值?
【发布时间】:2021-04-04 15:36:36
【问题描述】:

我正在尝试提取位于特定文件夹(“图像”)中的多个图像的特征。 我想使用 tabulate 包将此功能(灰度、R、G、B、alpha、高度和宽度)插入到表格中。 主要问题是遍历文件夹并提取单个红色、绿色、蓝色通道的平均值,并获得灰度值(如果图像存在于该比例中)。之后,我想将所有信息插入表中。我无法执行任何此操作。 我试过这个代码,但它给了我很多像素值。 我想得到平均值,所以每个频道只需要一个数字。 请问,有人可以帮忙吗?

```
import os
import numpy as np
import cv2
for img in os.listdir(image_path):        
    img = cv2.imread(os.path.join(image_path, img))     
    r,g,b = cv2.split(img)
    rgb_img = cv2.merge((r,g,b))
    x,y,z = np.shape(img)
    red = np.zeros((x,y,z),dtype=int)
    green = np.zeros((x,y,z),dtype=int)
    blue = np.zeros((x,y,z),dtype=int)
    for i in range(0,x):
        for j in range(0,y):
            red[i][j][0] = rgb_img[i][j][0]
            green[i][j][1]= rgb_img[i][j][1]
            blue[i][j][2] = rgb_img[i][j][2]  ```

我不知道任何其他方法,有人可以推荐一个吗?我真的很感激。 谢谢

【问题讨论】:

  • 我看不出这段代码如何输出平均像素值。您能否更具体地说明您希望我们在哪些方面提供帮助?
  • 你是完美的对!此代码不输出平均值。我这样做是为了尝试推断通道而不是平均值。我的目标是获得文件夹中每个图像的 R、G、B 的平均值,而不需要手动编写每个文件的操作,但希望能够迭代。在获得每个图像的 RGB 的单一平均值后,将数字插入到带有“制表”的表格中。我需要更改所有内容还是可以实现当前代码?

标签: python python-3.x numpy operating-system cv2


【解决方案1】:

如果您想要通道(R、G、B)的平均值,并最终想使用表格将其存储在表格中,您可以执行以下操作:

我将使用 OpenCV(加载图像)和 numpy(为什么不这样做)

import cv2
import numpy as np
import os
from tabulate import tabulate

images = os.listdir('./Test')
num_images = len(images)

data = [] # using an array is more convenient for tabulate.

for i in range(num_images):
    img = cv2.imread('./Test/' + images[i])
        
    avgR = np.mean(img[:,:,2])
    avgG = np.mean(img[:,:,1])
    avgB = np.mean(img[:,:,0])
    
    data.append([images[i], avgR, avgG, avgB])
    
print(tabulate(data, headers=['img_name','R', 'G', 'B'], tablefmt='fancy_grid'))

'''
╒════════════╤══════════╤══════════╤══════════╕
│ img_name   │        R │        G │        B │
╞════════════╪══════════╪══════════╪══════════╡
│ test1.jpg  │  49.3213 │ 112.408  │ 145.949  │
├────────────┼──────────┼──────────┼──────────┤
│ test2.jpeg │  93.0038 │  94.4466 │  95.0824 │
├────────────┼──────────┼──────────┼──────────┤
│ test3.jpg  │ 100.181  │  71.6575 │  66.4233 │
╘════════════╧══════════╧══════════╧══════════╛
'''


这是我的目录结构:

代码存在于 movie scraper 目录中。因此我使用了路径'./Test'。点“。”表示当前目录。

【讨论】:

  • 非常感谢!我按照你说的尝试了......它有效,我得到了每个频道的值。现在,我如何理解该值所指的图像?如何使用“制表”将相对值插入到表格中,参考正确的图像?
  • 每个图像都会有一个名称,因此您只需将 [img_name, avgR, avgG, avgB] 插入表中。您可以使用熊猫来制作表格(在熊猫中它们被称为数据框)。使用此链接阅读更多关于pandas
  • 嗨,由于我在将每个图像与每个通道相关联方面效率低下,您能否展示一个代码示例以更好地理解。我会喜欢的! :)
  • 对我的代码进行了编辑。我选择了一个字典来存储这些值。您可以使用 pandas 数据框或 numpy 数组。您还可以以类似的方式进一步提取和存储特征。
  • 你会使用这个语法 gray = np.mean(img[:,:,:]) 来定义灰度值是否存在
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 2019-09-26
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 2014-11-29
相关资源
最近更新 更多