Проблема преобразования изображения серой шкалы обратно в изображение RGB с пользовательской функцией преобразования в Python - PullRequest
1 голос
/ 19 июня 2019

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

Преобразование Opencv cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) не будет создавать исходное изображение, так как оно будет принимать значения всех 3 каналов одинаково, поэтому я применил преобразование

Я читаю изображение RGB как:

img=cv2.imread("image.png")

Затем я извлекаю значения RGB как:

r, g,b = img[:,:,0], img[:,:,1],img[:,:,2]

Затем я применил преобразование, чтобы получить серое изображение как:

gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

Как преобразовать серое изображение после обработки еще раз обратно в RGB с заданными значениями преобразования?

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Я думаю, что вы пытаетесь работать с каналами независимо, потому что у вас есть алгоритм, который ожидает изображение в оттенках серого. Вы можете решить эту проблему несколькими способами.

Итак, начнем с этого изображения:

enter image description here

Вы можете сделать это "на месте" , не разделяя изображение на составляющие его каналы, как это:

#!/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)

выход

enter image description here

Или вы можете разделить изображение на составляющие его каналы, поработать с ними по отдельности (и, возможно, параллельно), а затем объединить их в конце обратно в изображение 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)

enter image description here* * 1030

0 голосов
/ 19 июня 2019

Математически невозможно преобразовать изображение в градациях серого обратно в RGB.Но вы можете преобразовать RGB в HSV пробелы, используя cv2.cvtColor(image, cv2.COLOR_BGR2HSV), выполнить обработку на value в градациях серого и преобразовать результаты обратно в RGB.

0 голосов
/ 19 июня 2019

Когда вы добавляете красный, зеленый и синий каналы вместе в один серый канал, вы выбрасываете информацию, и нет никакого способа (математически), что вы могли бы сделать вывод, как снова разделить одно значение серого на несколько цветов.

В зависимости от того, какое преобразование вы применяете к изображению в формате оттенков серого, возможно, у вас будет возможность объединить исходное цветное изображение и преобразованное изображение в оттенках серого в другое изображение, соответствующее вашим требованиям.

...