Вместо ручной итерации каждого пикселя с неэффективным временем исполнения O(n^3)
мы можем воспользоваться функцией вещания от Numpy.
Сначала мы разделим шкалу серого.изображение на отдельные BGR
каналы с использованием cv2.split()
.Это даст нам отдельные каналы B
, G
и R
каждый с одинаковыми значениями.Затем мы умножаем каждый канал на скалярное значение, используя np.multiply()
.Наконец, мы объединяем каждый отдельный канал в цветное изображение, используя cv2.merge()
, чтобы создать один многоканальный массив
До
>>> print(before.shape)
(331, 500, 3)
Вам может быть интересно, почему изображение имеет три канала, хотя оно, очевидно, в оттенках серого.Ну, это потому, что каждый канал имеет одинаковые значения в диапазоне от [0 ... 255]
После
>>> print(after.shape)
(331, 500, 3)
Опять же, то же количествоканалов, но мы изменили каждый отдельный канал
TLDR: Чтобы добавить цвет к черно-белому изображению, мы должны извлечь каждый отдельный канал BGR
, изменить каждый канал, а затем восстановитьизображение
import cv2
import numpy as np
before = cv2.imread('2.png')
b, g, r = cv2.split(before)
np.multiply(b, 1.5, out=b, casting="unsafe")
np.multiply(g, .75, out=g, casting="unsafe")
np.multiply(r, 1.25, out=r, casting="unsafe")
after = cv2.merge([b, g, r])
cv2.imshow('before', before)
cv2.imshow('after', after)
cv2.waitKey()