Построение среднего значения для n 2-D массивов

#python #numpy #opencv #matplotlib #computer-vision

#python #numpy #opencv #matplotlib #компьютерное зрение

Вопрос:

Я пытаюсь вычислить среднее значение гистограмм нескольких изображений из папки и визуализировать его. Вот подход, который я пытаюсь. Я бы вычислил гистограмму каждого изображения с помощью открытой функции cv, cv2.calcHist(), которая возвращает numpy.ndarray. Я бы перебирал каждое изображение в каталоге и добавлял результирующие массивы в пустой список, передавал список в numpy.mean() и отображал его, все со следующим кодом:

 import os
import matplotlib.pyplot as plt
import numpy as np
import cv2

img_list = os.listdir(r'image_directory')

dir_path = r'path'

list_arr = [] #array list
for file in img_list:
    img = os.path.join(dir_path, file)
    plot=plt.imread(img)
    hist=cv2.calcHist([plot],[0],None,[256],[0,256])
    list_arr.append(hist)
 

Вычисление среднего:

 mean_hist = np.mean([list_arr],axis=0)

mean_hist.shape
 

Вывод: (154,256,1)

Построение:

 plt.plot(mean_hist)
 

Я получаю эту ошибку:

Ошибка значения: x и y могут быть не больше 2-D, но иметь формы (154,) и (154, 256, 1)

154 — количество изображений в каталоге, 256 — максимальный диапазон значений интенсивности пикселей любого данного изображения.

Но когда я передаю массивы hist по отдельности в np.mean() вместо всего списка сразу, это работает.

Код:

 im1 = plt.imread(r'...Screenshot (166).jpg')
im2 = plt.imread(r'...Screenshot (167).jpg')
im3 = plt.imread(r'...Screenshot (168).jpg')
im4 = plt.imread(r'...Screenshot (169).jpg')

hist_1 = cv2.calcHist([im1],[0],None,[256],[0,256])
hist_2 = cv2.calcHist([im2],[0],None,[256],[0,256])
hist_3 = cv2.calcHist([im3],[0],None,[256],[0,256])
hist_4 = cv2.calcHist([im4],[0],None,[256],[0,256])

mean_hist = np.mean([hist_1,hist_2,hist_3,hist_4], axis=0)

mean_hist.shape
 

Вывод в этом случае: (256,1)

И он строит график без каких-либо проблем, когда я делаю:

 plt.plot(mean_hist)
 

Как сделать это в цикле for без получения указанной выше ошибки?

Ответ №1:

Вместо

 mean_hist = np.mean([list_arr],axis=0)
 

просто сделайте

 mean_hist = np.mean(list_arr, axis=0)
 

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

1. Вау, это было просто.