Я думаю, что вы пытаетесь работать с каналами независимо, потому что у вас есть алгоритм, который ожидает изображение в оттенках серого. Вы можете решить эту проблему несколькими способами.
Итак, начнем с этого изображения:
Вы можете сделать это "на месте" , не разделяя изображение на составляющие его каналы, как это:
#!/usr/bin/env python3
import cv2
# Load image
img=cv2.imread("start.png",cv2.IMREAD_COLOR)
# In-place, zero the Blue, double the Green and halve the Red channels
img[:,:,0] = 0
img[:,:,1] *= 2
img[:,:,2] //= 2
# Save
cv2.imwrite('result1.png', img)
выход
Или вы можете разделить изображение на составляющие его каналы, поработать с ними по отдельности (и, возможно, параллельно), а затем объединить их в конце обратно в изображение BGR:
# Load image and split into component channels
img=cv2.imread("start.png",cv2.IMREAD_COLOR)
B, G, R = cv2.split(img)
# Operate on channels independently and out of place
B[...] = 0
G[...] *= 2
R[...] //= 2
# Blur the Red too for extra fun
R = cv2.GaussianBlur(R,(25,25),0)
# Recombine channels and save
result = cv2.merge((B,G,R))
cv2.imwrite('result2.png', result)
* * 1030