Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用用户定义的转换函数将灰度图像转换回rgb图像时出现问题_Python_Python 3.x_Opencv_Image Processing_Rgb - Fatal编程技术网

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

在python中使用用户定义的转换函数将灰度图像转换回rgb图像时出现问题,python,python-3.x,opencv,image-processing,rgb,Python,Python 3.x,Opencv,Image Processing,Rgb,我正在使用一些RGB图像,对于一些功能,我必须使用一些转换值将RGB图像转换为灰度,然后在操作之后,我想借助转换值再次将输出图像转换为RGB格式。如何实现同样的目标 Opencv conversioncv2.cvtColor(image,cv2.COLOR\u GRAY2RGB)不会生成原始图像,因为它会获取所有3个通道的值相同,这就是我应用转换的原因 我将RGB图像解读为: img=cv2.imread("image.png") gray = 0.2989 * r + 0.5870 * g

我正在使用一些RGB图像,对于一些功能,我必须使用一些转换值将RGB图像转换为灰度,然后在操作之后,我想借助转换值再次将输出图像转换为RGB格式。如何实现同样的目标

Opencv conversion
cv2.cvtColor(image,cv2.COLOR\u GRAY2RGB)
不会生成原始图像,因为它会获取所有3个通道的值相同,这就是我应用转换的原因

我将RGB图像解读为:

img=cv2.imread("image.png")
gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
然后我提取RGB值,如下所示:

r, g,b = img[:,:,0], img[:,:,1],img[:,:,2]
然后我应用变换得到灰度图像,如下所示:

img=cv2.imread("image.png")
gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

如何将处理后的灰度图像再次转换回具有给定转换值的RGB?

当您将红色、绿色和蓝色通道一起添加到一个灰色通道时,您正在丢弃信息,并且没有办法(数学上)您可以推断如何将单个灰度值再次分割为多个颜色


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

从数学上讲,将灰度图像转换回RGB是不可能的。但是,您可以使用
cv2.cvtColor(image,cv2.COLOR\u BGR2HSV)
将RGB转换为空格,将
值作为灰度进行处理,然后将结果转换回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
?而且,
opencv
默认使用
BGR
,而不是
RGB
。我必须应用一些处理灰度图像的opencv函数,因此在操作之后,我想将图像转换回RGB。然后
cv2。cvt颜色(image,cv2.COLOR\u GRAY2RGB)
就是您要找的。灰色确实是具有相同值的
BGR
。您需要
cv2.split()
,处理为灰色,然后
cv2.merge()
@QuangHoang我尝试了相同的方法,但不起作用,所有通道的值都相同。请详细说明,这不是很清楚。支持的一些代码段肯定会help@Excelsior你所要求的理论上是不可能的,所以我不能提供代码示例。根据您对灰度图像所做的转换(但您必须在问题中包含所有这些细节),可能会提出一种算法,将原始信息中的颜色信息合并回。答案中有一个链接。你可以在那里找到一些代码。很好地解释了如何分离BGR通道