在 python 中使用用户定义的变换函数将灰度图像转换回 rgb 图像时出现问题

Problem in converting a gray scale image back to an rgb image with user defined transformation function in python

我正在处理一些 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?

当您将红色、绿色和蓝色通道一起添加到一个灰色通道中时,您正在丢弃信息,并且(从数学上)您无法推断如何将单个灰色值再次拆分为多种颜色.

根据您对灰度格式图像应用的变换,可能无法将原始彩色图像和变换后的灰度图像合成为满足您要求的另一幅图像。

从数学上讲不可能将灰度图像转换回 RGB。但是,您可以使用 cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 将 RGB 转换为 HSV 空间,将 value 处理为灰度,然后将结果转换回 RGB。

我认为您正在尝试独立地对通道进行操作,因为您有一些需要灰度图像的算法。您可以通过几种不同的方式解决这个问题。

所以,让我们从这张图片开始:

您可以这样做 "in-place" 而无需像这样将图像分成其组成通道:

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