Лучше хранить данные в памяти как массив numpy
.Кроме того, считайте изображение, используя cv2.imread
, а не Image.open
, если в конечном итоге его необходимо преобразовать в np.array
.
Для построения графика можно использовать matplotlib
.
Вот как вышеупомянутый процесс может быть реализован с использованием OpenCV
, numpy
и matplotlib
.
import numpy as np
import cv2, sys
import matplotlib.pyplot as plt
#Read image
im_f = cv2.imread('data/image.jpg')
#Validate image
if im_f is None:
print('Image Not Found')
sys.exit();
#Cast to float type to hold the results
im_f = im_f.astype(np.float32)
#Compute the product of channels and flatten the result to get 1D array
product = (im_f[:,:,0] * im_f[:,:,1] * im_f[:,:,2]).flatten()
#Sort the flattened array and flip it to get elements in descending order
product = np.sort(product)[::-1]
#Compute the min, max and median of product
pmin, pmax , pmed = np.amin(product), np.amax(product), np.median(product)
print('Min = ' + str(pmin))
print('Max = ' + str(pmax))
print('Med = ' + str(pmed))
#Show the sorted array
plt.plot(product)
plt.show()
Протестировано с Python 3.5.2, OpenCV 4.0.1,numpy 1.15.4 и matplotlib 3.0.2 в Ubuntu 16.04.