【问题标题】:How to convert a 1 channel image into a 3 channel with opencv2?如何使用 opencv2 将 1 通道图像转换为 3 通道?
【发布时间】:2013-01-25 00:32:01
【问题描述】:

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

numpy.dstack() 让一切崩溃

opencv2 中不存在 GRAY2BGR

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

有什么想法吗?

Opencv2.4.3 refmanual

【问题讨论】:

    标签: python arrays opencv


    【解决方案1】:

    当我需要这个时,我正在使用 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))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案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)
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 如果您能解释一下您建议的代码是如何工作的,那就太好了。谢谢。
          • @sanastasiadis It merges 将单通道图像转换为一个三通道图像。
          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2012-04-15
            • 2018-10-19
            • 2020-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多