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

rks48beu  于 2022-11-15  发布在  其他
关注(0)|答案(8)|浏览(236)

我真的被这个问题难住了。我有一个图像在我的代码中是 *[BGR2GRAY] d * 的,现在我需要添加彩色圆圈之类的。当然,这在1通道矩阵中是做不到的,而且我似乎也不能把这个该死的东西变回3。
numpy.dstack()崩溃一切
opencv2中不存在GRAY2BGR
cv.merge(src1, src2, src3, dst)已经变成了cv2.merge(mv),其中mv =“矩阵的向量”,不管这意味着什么。
有什么想法吗?
Opencv2.4.3 refmanual

cs7cruho

cs7cruho1#

下面是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)
z3yyvxxp

z3yyvxxp2#

它是Python的等价物:imgray是一个包含单通道图像numpy数组。

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

f5emj3cl3#

下面我假设你没有正确形状的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

xxhby3vn

xxhby3vn4#

当我需要这个的时候,我使用了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))
2izufjch

2izufjch5#

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

k4emjkb16#

为什么每个人都使用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)
nwlqm0z1

nwlqm0z17#

RGB = np.stack([gray, gray, gray], axis = -1)
gcmastyq

gcmastyq8#

如果使用opencv-python,可以使用np.repeat函数。

img = np.array([[1, 2], [1, 2]])
img2 = np.repeat(img[:, :, np.newaxis], 3, axis=2)

相关问题