簡體   English   中英

如何在 OpenCV (Python) 中將灰度圖像轉換為 RGB?

[英]How does one convert a grayscale image to RGB in OpenCV (Python)?

我正在學習使用 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()

我正在將我的評論推廣到一個答案:

簡單的方法是:

您可以繪制原始“框架”本身,而不是使用灰色圖像。

艱難的方式(您試圖實施的方法):

backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)是正確的語法。

或者,可以使用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()

嘗試這個:

import cv2
import cv

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

我發現,在使用 opencv 時,一些常量是在 cv2 模塊中定義的,而其他常量是在 cv 模塊中定義的。

一個你將你的圖像轉換為灰度,你無法恢復。 你已經從三個通道變成了一個通道,當你嘗試返回時,所有三個數字都將是相同的。 所以簡短的回答是不,你不能回去。 您的 backtorgb 函數拋出該錯誤的原因是它需要采用以下格式:

CvtColor(input, output, CV_GRAY2BGR)

OpenCV 使用 BGR 而不是 RGB,因此如果您修復順序,它應該可以工作,盡管您的圖像仍然是灰色的。

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

可能有一種情況,您認為您的圖像是灰度圖像,但實際上它是二值圖像。 在這種情況下,您有一個由 0 和 1 組成的數組,其中 1 是白色,0 是黑色(例如)。

在 RGB 空間中,像素值介於 0 和 255 之間。因此需要轉換后的圖像乘以 255 如果不是,您將收到一個幾乎空白的圖像,因為當像素值在 <0, 255> 之間變化時,值為 0 的像素與值為 1 的像素幾乎相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM