![](/img/trans.png)
[英]How to encode Grayscale, SobelX and SobelY in one RGB image using OpenCV?
[英]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.