如何在OpenCV(Python)中将灰度图像转换为RGB,以便在处理二进制图像后可视化轮廓?

时间:2014-02-06 07:08:42

标签: python opencv image-processing

我正在学习使用OpenCV进行实时应用程序的图像处理。我对图像进行了一些阈值处理,并希望将轮廓标记为绿色,但它们不会显示为绿色,因为我的图像是黑白的。

在程序的早期,我使用了gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)从RGB转换为灰度,但要回去我很困惑,函数backtorgb = cv2.cvtColor(gray,cv2.CV_GRAY2RGB) )给出了AttributeError:'module'对象没有属性'CV_GRAY2RGB'。

下面的代码似乎没有以绿色绘制轮廓 - 这是因为它是灰度图像吗?如果是这样,我可以将灰度图像转换回RGB以使绿色轮廓可视化吗?

import numpy as np
import cv2
import time

cap = cv2.VideoCapture(0)
while(cap.isOpened()):

    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    ret, gb = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)

    gb = cv2.bitwise_not(gb)

    contour,hier = cv2.findContours(gb,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)

    for cnt in contour:
        cv2.drawContours(gb,[cnt],0,255,-1)
    gray = cv2.bitwise_not(gb)

    cv2.drawContours(gray,contour,-1,(0,255,0),3)

    cv2.imshow('test', gray)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

5 个答案:

答案 0 :(得分:74)

我正在推荐我的评论答案:

简单的方法是:

  

您可以在原始的“框架”中绘制,而不是使用灰色图像。

艰难的方法(你试图实施的方法):

backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)是正确的语法。

答案 1 :(得分:8)

试试这个:

import cv2
import cv

color_img = cv2.cvtColor(gray_img, cv.CV_GRAY2RGB)

我发现,在使用opencv时,某些常量是在cv2模块中定义的,而其他常量是在cv模块中定义的。

答案 2 :(得分:5)

您将图像转换为灰度图像就无法恢复。你已经从三个频道变为一个,当你试图回去时,所有三个数字将是相同的。所以简短的回答是不,你不能回去。你的backtorgb函数抛出该错误的原因是因为它需要采用以下格式:

CvtColor(input, output, CV_GRAY2BGR)

OpenCV使用BGR而不是RGB,所以如果您修改了它的顺序,它应该可以工作,尽管您的图像仍然是灰色的。

答案 3 :(得分:2)

或者,<style>可以通过将同一层与新图像的蓝色,绿色和红色层合并在一起,从而将单通道二进制蒙版层转换为三通道彩色图像。我们传入三个颜色通道层的列表-在这种情况下都是相同的-函数将返回具有这些颜色通道的单个图像。有效地将形状为cv2.merge()的灰度图像转换为(height, width, 1)

解决您的问题

  

我对图像进行了一些阈值处理,并希望将轮廓标记为绿色,但是由于我的图像是黑白图像,所以它们没有显示为绿色。

这是因为您试图在单个通道图像上显示三个通道。要解决此问题,您只需合并三个单独的频道

(height, width, 3)

示例

我们创建尺寸为image = cv2.imread('image.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray_three = cv2.merge([gray,gray,gray]) 的彩色图像

enter image description here

(200,200,3)

接下来,我们将其转换为灰度并使用带有三个灰度通道的image = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8) 创建另一个图像

cv2.merge()

我们现在在形状为gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray_three = cv2.merge([gray,gray,gray]) 的单通道灰度图像(左)和形状为(200,200,1)的三通道灰度图像(右)上绘制填充轮廓。左图展示了您正在尝试在单个通道图像上显示三个通道时遇到的问题。将灰度图像合并为三个通道后,我们现在可以在图像上应用颜色

enter image description here enter image description here

(200,200,3)

完整代码

contour = np.array([[10,10], [190, 10], [190, 80], [10, 80]])
cv2.fillPoly(gray, [contour], [36,255,12])
cv2.fillPoly(gray_three, [contour], [36,255,12])

答案 4 :(得分:0)

rgb_image = cv2.cvtColor(binary_image, cv2.COLOR_GRAY2RGB) * 255

有时您认为您的图像是灰度图像,但实际上它是二值图像。在这种情况下,您有一个由 0 和 1 组成的数组,其中 1 是白色,0 是黑色(例如)。

在 RGB 空间中,像素值介于 0 和 255 之间。因此需要将转换后的图像乘以 255。如果不是,您将收到一个几乎空白的图像,因为当像素值在 <0, 255>

之间变化时,值为 0 的像素与值为 1 的像素几乎相同