【问题标题】:How to convert a python numpy array to an RGB image with Opencv 2.4?如何使用 Opencv 2.4 将 python numpy 数组转换为 RGB 图像?
【发布时间】:2014-12-28 04:36:03
【问题描述】:

我搜索了类似的问题,但没有发现任何有用的信息,因为大多数解决方案都使用旧版本的 OpenCV。

我有一个 3D numpy 数组,我想使用 OpenCV (cv2) 将其显示和/或保存为 BGR 图像。

作为一个简短的例子,假设我有:

import numpy, cv2
b = numpy.zeros([5,5,3])

b[:,:,0] = numpy.ones([5,5])*64
b[:,:,1] = numpy.ones([5,5])*128
b[:,:,2] = numpy.ones([5,5])*192

我想做的是将 b 保存并显示为类似于以下内容的彩色图像:

cv2.imwrite('color_img.jpg', b)
cv2.imshow('Color image', b)
cv2.waitKey(0)
cv2.destroyAllWindows()

这不起作用,大概是因为 b 的数据类型不正确,但是经过大量搜索后,我无法弄清楚如何将其更改为正确的。如果您能提供任何指点,将不胜感激!

【问题讨论】:

  • 感谢@beaker 的评论!但是,该问题的问题是发布者忘记了imshow() 中的论点。我的问题是 imshow/ imwrite 不会采用上面创建的 numpy 数组。
  • 您要将其保存为BGR 还是RGB?标题和问题都有。
  • @jmanring220 是的,但答案仍然显示如何将 numpy 数组转换为垫子。

标签: python opencv numpy


【解决方案1】:

您不需要将NumPy 数组转换为Mat,因为OpenCV cv2 模块可以接受NumPyarray。 您唯一需要注意的是 {0,1} 映射到 {0,255} 并且NumPy 数组中任何大于 1 的值都等于 255。因此您应该在代码中除以 255,如下所示.

img = numpy.zeros([5,5,3])

img[:,:,0] = numpy.ones([5,5])*64/255.0
img[:,:,1] = numpy.ones([5,5])*128/255.0
img[:,:,2] = numpy.ones([5,5])*192/255.0

cv2.imwrite('color_img.jpg', img)
cv2.imshow("image", img)
cv2.waitKey()

【讨论】:

  • 你能解释一下为什么我们要乘以 64、128 和 192
  • 哦,我明白了,我认为这只是应该在 rgb 位置的值。
  • 如果有人可能需要反转颜色通道:cv2.imshow("color_img.jpg", input[..., ::-1] * 255)
【解决方案2】:

您正在寻找scipy.misc.toimage:

import scipy.misc
rgb = scipy.misc.toimage(np_array)

它似乎也在scipy 1.0,但有一个弃用警告。相反,您可以使用pillowPIL.Image.fromarray

【讨论】:

  • 这在 scipy 0.18.0 中似乎不存在
  • 问题是询问使用 OPEN-CV 的方法。
  • 是的。我的回答仍然对 9 个人有用。
  • 这实际上是我一直在寻找的,我有一个来自 opencv 的 numpy 数组,我想在 pysimpleui 中显示它,它需要正确的图像。
【解决方案3】:

下面的图像 c、d、e 和 f 显示了色彩空间转换,它们也恰好是 numpy 数组<type 'numpy.ndarray'>

import numpy, cv2
def show_pic(p):
        ''' use esc to see the results'''
        print(type(p))
        cv2.imshow('Color image', p)
        while True:
            k = cv2.waitKey(0) & 0xFF
            if k == 27: break 
        return
        cv2.destroyAllWindows()

b = numpy.zeros([200,200,3])

b[:,:,0] = numpy.ones([200,200])*255
b[:,:,1] = numpy.ones([200,200])*255
b[:,:,2] = numpy.ones([200,200])*0
cv2.imwrite('color_img.jpg', b)


c = cv2.imread('color_img.jpg', 1)
c = cv2.cvtColor(c, cv2.COLOR_BGR2RGB)

d = cv2.imread('color_img.jpg', 1)
d = cv2.cvtColor(c, cv2.COLOR_RGB2BGR)

e = cv2.imread('color_img.jpg', -1)
e = cv2.cvtColor(c, cv2.COLOR_BGR2RGB)

f = cv2.imread('color_img.jpg', -1)
f = cv2.cvtColor(c, cv2.COLOR_RGB2BGR)


pictures = [d, c, f, e]

for p in pictures:
        show_pic(p)
# show the matrix
print(c)
print(c.shape)

查看这里了解更多信息:http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

或者你可以:

img = numpy.zeros([200,200,3])

img[:,:,0] = numpy.ones([200,200])*255
img[:,:,1] = numpy.ones([200,200])*255
img[:,:,2] = numpy.ones([200,200])*0

r,g,b = cv2.split(img)
img_bgr = cv2.merge([b,g,r])

【讨论】:

    【解决方案4】:

    如果其他人只是想将黑色图像显示为背景,例如这里对于 500x500 像素:

    import cv2
    import numpy as np
    
    black_screen  = np.zeros([500,500,3])
    cv2.imshow("Simple_black", black_screen)
    cv2.waitKey(0)
    

    【讨论】:

      【解决方案5】:

      这是因为 cv2 使用了来自 numpy 的 "uint8" 类型。因此,您应该在创建数组时定义类型。

      类似于以下内容:

      import numpy
      import cv2
      
      b = numpy.zeros([5,5,3], dtype=numpy.uint8)
      b[:,:,0] = numpy.ones([5,5])*64
      b[:,:,1] = numpy.ones([5,5])*128
      b[:,:,2] = numpy.ones([5,5])*192
      

      【讨论】:

        【解决方案6】:

        您的图片尺寸不足以用肉眼看到。所以请尽量使用至少 50x50

        import cv2 as cv
        import numpy as np
        
        black_screen = np.zeros([50,50,3])
        
        black_screen[:, :, 2] = np.ones([50,50])*64/255.0
        cv.imshow("Simple_black", black_screen)
        cv.waitKey(0)
        cv.displayAllWindows()
        

        【讨论】:

          猜你喜欢
          • 2018-09-28
          • 2011-12-07
          • 2012-11-17
          • 2018-08-22
          • 2018-09-05
          • 1970-01-01
          • 2016-03-17
          • 1970-01-01
          相关资源
          最近更新 更多