在二进制图像处理后,如何在OpenCV(Python)中将灰度图像转换为RGB以可视化轮廓?
image-processing
opencv
python
12
0

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

在程序的早期,我使用gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)从RGB转换为灰度,但要回去,我感到困惑,函数backtorgb = cv2.cvtColor(gray,cv2.CV_GRAY2RGB)给出了AttributeError:“模块”对象没有属性“ 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()
参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

尝试这个:

import cv2
import cv

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

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

收藏
评论

或者,通过将同一层与新图像的蓝色,绿色和红色层合并在一起,可以使用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])

我们创建一个尺寸为(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)并与形状三个信道的灰度图像(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])

完整代码

import cv2
import numpy as np

# Create random color image
image = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8)

# Convert to grayscale (1 channel)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Merge channels to create color image (3 channels)
gray_three = cv2.merge([gray,gray,gray])

# Fill a contour on both the single channel and three channel image
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])

cv2.imshow('image', image)
cv2.imshow('gray', gray)
cv2.imshow('gray_three', gray_three)
cv2.waitKey()
收藏
评论

一种将图像转换为灰度的图像,无法恢复。您已经从三个通道转到一个通道,当您尝试返回时,所有三个数字都将相同。因此,简短的答案是不,您不能返回。您的backtorgb函数抛出该错误的原因是因为它必须采用以下格式:

CvtColor(input, output, CV_GRAY2BGR)

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

收藏
评论

我将我的评论提升为答案:

简单的方法是:

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

困难的方法(您尝试实现的方法):

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号