如何使用opencv2将1通道图像转换为3通道?

时间:2013-02-09 08:10:19

标签: python arrays opencv

我真的很难过这个。我的代码中有一张[BGR2GRAY]'的图像,现在我需要添加彩色圆圈等等。当然这不可能在1通道矩阵中完成,而且我似乎无法将该死的东西变回3.

numpy.dstack()崩溃了所有内容

opencv2中不存在GRAY2BGR

cv.merge(src1,src2,src3,dst)已经变成了cv2.merge(mv),其中mv =“矩阵向量”,无论这意味着什么。

有什么想法吗?

Opencv2.4.3 refmanual

4 个答案:

答案 0 :(得分:8)

以下是在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)

答案 1 :(得分:1)

我不能说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);

答案 2 :(得分:1)

与python等效:     imgray是一个包含1通道图像的numpy数组。

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

答案 3 :(得分:0)

以下,我假设您没有适当形状的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