簡體   English   中英

如何使用 opencv2 將 1 通道圖像轉換為 3 通道?

[英]How to convert a 1 channel image into a 3 channel with opencv2?

我真的被這個難住了。 我的代碼中有一個[BGR2GRAY]的圖像,現在我需要在其中添加彩色圓圈等。 當然這不能在 1 通道矩陣中完成,而且我似乎無法將這該死的東西變回 3。

numpy.dstack()一切崩潰

opencv2 中不存在 GRAY2BGR

cv.merge(src1, src2, src3, dst)已變成cv2.merge(mv)其中 mv = “矩陣向量”,無論這意味着什么。

有任何想法嗎?

Opencv2.4.3參考手冊

這是在 Python 中執行此操作的一種方法:

img = cv2.imread("D:\\img.jpg")
gray = cv2.cvtColor(img, cv.CV_BGR2GRAY)

img2 = np.zeros_like(img)
img2[:,:,0] = gray
img2[:,:,1] = gray
img2[:,:,2] = gray

cv2.circle(img2, (10,10), 5, (255,255,0))
cv2.imshow("colour again", img2)
cv2.waitKey()

這是 OpenCV3 的完整代碼:

import cv2
import numpy as np
img = cv2.imread('10524.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2 = np.zeros_like(img)
img2[:,:,0] = gray
img2[:,:,1] = gray
img2[:,:,2] = gray
cv2.imwrite('10524.jpg', img2)

它是 Python 的等價物:imgray 是一個包含 1 通道圖像的 numpy 數組。

img2 = cv2.merge((imgray,imgray,imgray))

當我需要這個時,我正在使用 tensorflow。 這是我的解決方案:

image = tf.expand_dims(image, -1)
x1 = image.shape[0]
x2 = image.shape[1]
image = tf.reshape(tf.broadcast_to(image, (x1, x2, 3)),  (x1, x2, 3))

我不能說 python 但我可以告訴你 C++ 接口......

gray_image //you have it already
Mat im_coloured = Mat::zeros(gray_image.rows,gray_image.cols,CV_8UC3);

vector<Mat> planes;

for(int i=0;i<3;i++)
    planes.push_back(gray_image);

merge(planes,im_coloured);

下面我假設您沒有正確形狀的 3 通道圖像,因此 zeros_like 函數(在上面的答案中使用)將沒有用。

img2 = np.zeros( ( np.array(img).shape[0], np.array(img).shape[1], 3 ) )
img2[:,:,0] = img # same value in each channel
img2[:,:,1] = img
img2[:,:,2] = img

如果 img 是 numpy 數組,那么它可以從np.array(img).shape縮短為img.shape

為什么每個人都使用cv2.merge和低級數組操作? 為什么不簡單地use cv2.cvtColor

img = np.zeros((640, 480), np.uint8)  # create grayscale image
print(img.shape)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)  # grayscale --> BGR
print(img.shape)

輸出:

(640, 480)
(640, 480, 3)

暫無
暫無

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

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