繁体   English   中英

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

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

我正在处理一些RGB图像,对于某些功能,我不得不使用一些转换值将RGB图像转换为Grayscale,然后在进行操作后,我想借助转换值再次将输出图像转换为RGB格式。 如何达到相同?

cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)转换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值?

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

因此,让我们从这张图片开始:

在此处输入图片说明

您可以“就地”执行此操作而无需将图像分成其组成通道,如下所示:

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

在此处输入图片说明

当您将红色,绿色和蓝色通道添加到一个灰色通道中时,您就会丢掉信息,并且(从数学上)您不可能推断出如何将单个灰度值再次拆分为多种颜色。

取决于您要对灰度格式的图像应用哪种转换,也许可以将您的原始彩色图像和转换后的灰度图像合成为另一个满足您要求的图像。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM