[英]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 = “矩陣向量”,無論這意味着什么。
有任何想法嗎?
這是在 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.