如何用opencv2将单通道图像转换为三通道?

35 投票
8 回答
69863 浏览
提问于 2025-04-17 15:20

我现在真的很困惑。我有一张图片,之前在代码里把它转换成了灰度图(也就是只用黑白色),现在我想在上面加一些彩色的圆圈之类的东西。当然,这在只有一个通道的图像上是做不到的,我似乎也无法把它再转换回三个通道的彩色图。

numpy.dstack() 这个方法让我整个程序崩溃了。

在opencv2里没有找到将灰度图转换回彩色图的方法。

cv.merge(src1, src2, src3, dst) 这个方法变成了 cv2.merge(mv),其中 mv 是“一个矩阵的向量”,这到底是什么意思我也搞不清楚。

有没有什么好主意?

Opencv2.4.3 参考手册

8 个回答

6

在这里,我假设你没有一个形状正确的三通道图像,所以上面答案中提到的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

27

这段话的意思是:这是Python中的一个等价写法;imgray是一个包含单通道图像的numpy数组。

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

这里有一种在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)

撰写回答