Я предпочитаю opencv, потому что база фанатов больше, и ее проще использовать в сочетании с numpy. Я написал вам короткий пример того, как обращаться с красным каналом, потому что я предположил, что вы хотите отдельно усреднить все три слоя и применить среднее значение для каждого канала индивидуально:
from numpy import asarray
import cv2
import numpy as np
import matplotlib.pyplot as plt
path="/content/111.jpg"
# load image
img=cv2.imread(path,1)
# mean Pixel of Red layer
mean_R=np.sum(img[:,:,0])/(img.shape[0]*img.shape[1])
# Subtract calculated Mean_Red from all pixels
img_red_new=img[:,:,0]-mean_R
#eliminate all negative values
img_red_new=(img_red_new>=0)*img_red_new
# Validate Images and values
plt.imshow(img_red_new)
plt.figure()
plt.imshow(img[:,:,0])
print("Red_New:",np.max(img_red_new))
print("Red_old:",np.max(img[:,:,0]))
print("Mean:",mean_R)
# Safe as Image
cv2.imwrite("test.jpg",img_red_new)
Ваша ошибка в конце, потому что вы должны определить диапазон значений, в котором представлены ваши цвета. Между 0-1 или 0-255, это ваш выбор, но вы должны выбрать один. Так что просто нормализуйте изображение следующим образом:
max=np.max(image)
image=image/max --> values 0-1
Кроме того, вы можете преобразовать его обратно в целые числа без знака (0-255) с помощью:
image=image*255
image=image.astype(np.uint8)