Предоставление цвета изображения в градациях серого - PullRequest
1 голос
/ 27 сентября 2019

edited image after assignment statement

Я хочу добавить цвет к черно-белому изображению, я предполагаю, что изменение значений пикселей должно работать.

for rows in rgb:
    for e in rows:
        for i in range(len(e)):
            max_val = e.max()
            min_val = e.min()
            if e[i] == max_val:
                e[i] * 2.5
            if e[i] == min_val:
                e[i] * 0.75
            else:
                e[i] * 1.5

код не возвращаетошибка, но это также не меняет значения.Я хочу, чтобы числа были умножены и переназначены на один и тот же массив

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Вот один из способов применить цвет градиента к изображению в градациях серого.

Load the grayscale image

Convert it to 3 equal channels

Create a 1 pixel red image

Create a 1 pixel blue image

Concatenate the two

Resize linearly to 256 pixels as a Lookup Table (LUT)

Apply the LUT


Ввод:

enter image description here

import cv2
import numpy as np

# load image as grayscale
img = cv2.imread('lena_gray.png', cv2.IMREAD_GRAYSCALE)

# convert to 3 equal channels
img = cv2.merge((img, img, img))

# create 1 pixel red image
red = np.zeros((1, 1, 3), np.uint8)
red[:] = (0,0,255)

# create 1 pixel blue image
blue = np.zeros((1, 1, 3), np.uint8)
blue[:] = (255,0,0)

# append the two images
lut = np.concatenate((red, blue), axis=0)

# resize lut to 256 values
lut = cv2.resize(lut, (1,256), interpolation=cv2.INTER_CUBIC)

# apply lut
result = cv2.LUT(img, lut)

# save result
cv2.imwrite('lena_red_blue_lut_mapped.png', result)

# display result
cv2.imshow('RESULT', result)
cv2.waitKey(0)
cv2.destroyAllWindows()


enter image description here

Объедините столько разноцветных пикселей, сколько вы хотите, чтобы сформировать радужную LUT, если это необходимо.

0 голосов
/ 28 сентября 2019

Вместо ручной итерации каждого пикселя с неэффективным временем исполнения O(n^3) мы можем воспользоваться функцией вещания от Numpy.


Сначала мы разделим шкалу серого.изображение на отдельные BGR каналы с использованием cv2.split().Это даст нам отдельные каналы B, G и R каждый с одинаковыми значениями.Затем мы умножаем каждый канал на скалярное значение, используя np.multiply().Наконец, мы объединяем каждый отдельный канал в цветное изображение, используя cv2.merge(), чтобы создать один многоканальный массив


До

image

>>> print(before.shape)
(331, 500, 3)

Вам может быть интересно, почему изображение имеет три канала, хотя оно, очевидно, в оттенках серого.Ну, это потому, что каждый канал имеет одинаковые значения в диапазоне от [0 ... 255]

После

image

>>> 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()
...