Как получить среднее значение одного канала RGB для нескольких изображений с помощью Numpy Python?

#python #python-3.x #numpy #operating-system #cv2

#питон #python-3.x #тупой #операционная система #cv2

Вопрос:

Я пытаюсь извлечь объекты из нескольких изображений, расположенных в определенной папке («изображение»). Я хочу вставить эти функции (оттенки серого, R, G, B, альфа, высота и ширина) в таблицу, используя пакет tabulate. Основная проблема заключается в переборе папки и извлечении средних значений отдельных красных, зеленых, синих каналов, а также для получения значения серого (если изображение присутствует в этом масштабе). После этого я хотел бы вставить всю информацию в таблицу. Я не могу выполнить ни одну из этих операций. Я пробовал этот код, но он дает мне много значений пикселей. Я хотел бы получить среднее значение, поэтому ТОЛЬКО ОДНО ЧИСЛО для каждого канала. Пожалуйста, кто-нибудь может помочь?

 ```
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]  ```
 

Я не знаю другого метода, может кто-нибудь предложить его? Я был бы вам очень признателен.
Спасибо

Комментарии:

1. Я не понимаю, как этот код выводит среднее значение пикселя. Не могли бы вы уточнить, где вам нужна наша помощь?

2. вы совершенно правы! Этот код не выводит среднее значение. Я просто сделал это, чтобы попытаться экстраполировать каналы, но не среднее значение. Моя цель — получить среднее значение R, G, B для каждого изображения в папке без записи вручную операции для каждого файла, но, надеюсь, повторить. После получения единственного среднего значения RGB для каждого изображения вставьте числа в таблицу с помощью «tabulate». Нужно ли мне все менять или я могу реализовать текущий код?

Ответ №1:

Если вам нужны средние значения каналов (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 │
╘════════════╧══════════╧══════════╧══════════╛
'''

 

Это моя структура каталогов:

структура директории

Код присутствует в каталоге movie scraper. Поэтому я использовал путь ‘./Test’. Точка «.» представляет текущий каталог.

Комментарии:

1. Большое вам спасибо! Я попробовал, как вы сказали … и это работает, я получаю значения для каждого канала. Теперь, как я могу понять, к какому изображению относится значение? Как я могу вставить относительное значение в таблицу с помощью «tabulate», ссылаясь на правильное изображение?

2. У каждого изображения будет имя, поэтому все, что вам нужно сделать, это вставить [img_name, avgR, avgG, avgB] в таблицу. Вы могли бы использовать pandas для создания таблицы (в pandas они называются dataframe). Используйте эту ссылку, чтобы узнать больше о pandas

3. Привет, поскольку я не могу связать каждое изображение с каждым каналом, не могли бы вы показать пример кода, чтобы лучше понять. Мне бы это понравилось! 🙂

4. В мой код были внесены изменения. Я выбрал словарь для хранения значений. Вы можете использовать фрейм данных pandas или массив numpy. Кроме того, вы можете дополнительно извлекать и сохранять функции аналогичным образом.

5. Вы бы использовали этот синтаксис gray = np.mean(img[:,:,:]), чтобы определить, присутствуют ли значения в оттенках серого