添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
酷酷的排球  ·  module' object has no ...·  昨天    · 
坚韧的稀饭  ·  How to fix ...·  昨天    · 
傻傻的课本  ·  Python 教程 — Python ...·  23 小时前    · 
英姿勃勃的火柴  ·  PEP 0 – Index of ...·  23 小时前    · 
开朗的茄子  ·  Spark - RCC User Guide·  14 小时前    · 
热情的签字笔  ·  广州白云站_百度百科·  2 周前    · 

如何用Numpy Python获得多张图片的RGB单通道的平均值?

2 人关注

我试图提取位于一个特定文件夹('image')中的多个图像的特征。 我想把这些特征(灰度、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]

我不知道还有什么方法,谁能建议一下?我将非常感激。

2 个评论
Bas
我不明白这段代码是如何输出平均像素值的。你能更具体地说明你希望我们帮助的地方吗?
你说得很对!这段代码并没有输出平均值。我这样做只是为了尝试推断通道,而不是平均值。我的目标是获得文件夹中每张图片的R、G、B的平均值,而不需要为每个文件手动写操作,但是,希望能迭代一遍。在获得每张图片的RGB的单一平均值后,用 "tabulate "将这些数字插入一个表格。我是否需要改变一切,或者我可以执行目前的代码?
python
numpy
opencv
image-processing
Lorenzo Bussotti
Lorenzo Bussotti
发布于 2020-12-28
2 个回答
XXDIL
XXDIL
发布于 2022-09-18
已采纳
0 人赞同

如果你想要通道(R, G, B)的平均值,最后想用tabulate把它存储在一个表中,你可以这样做。

我将使用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 │
╘════════════╧══════════╧══════════╧══════════╛

This is my Directory Structure:

The code is present in the 电影刮刀目录。因此,我使用了'./测试'的路径。点'.'代表当前目录。

非常感谢您!我按您说的试了一下。我按你说的去做了......而且成功了,我得到了每个通道的值。 现在,我怎样才能理解这个值指的是哪个图像? 我怎样才能用 "制表 "把相对值插入到表格中,指的是正确的图像?
每张图片都会有一个名字,所以你要做的就是在表中插入[img_name, avgR, avgG, avgB]。你可以使用大熊猫来制作表格(在大熊猫中它们被称为dataframe)。使用这个链接来阅读更多关于 大熊猫
你好,由于我在将每张图片与每个通道联系起来方面效率低下,你能不能展示一个代码例子,以便更好地理解。我很乐意。:)
对我的代码进行了编辑。我选择了一个字典来存储这些值。你可以使用pandas dataframe或numpy数组。另外,你也可以用类似的方式进一步提取和存储特征。
你会不会用这样的语法 gray = np.mean(img[:,:,:]) 来定义是否有灰度值存在
A. Bollans
A. Bollans
发布于 2022-09-18
0 人赞同

根据 https://sighack.com/post/averaging-rgb-colors-the-right-way 对RGB颜色值进行平均的正确方法是将它们的平方相加,而不是只取平均值。下面是用python编写的示例代码。可能会被优化,但对我来说是可行的。

def get_avg_rgb(img_file: str):
    import cv2
    img = cv2.imread(img_file)
    r_values = img[:, :, 2].flatten()
    g_values = img[:, :, 1].flatten()
    b_values = img[:, :, 0].flatten()
    Rsum = 0
    for r in r_values:
        Rsum += (float(r) * float(r))
    Gsum = 0
    for g in g_values:
        Gsum += (float(g) * float(g))
    Bsum = 0
    for b in b_values:
        Bsum += (float(b) * float(b))
    avgR = math.sqrt((float(Rsum) / len(r_values)))
    avgG = math.sqrt((float(Gsum) / len(g_values)))
    avgB = math.sqrt((float(Bsum) / len(b_values)))