如何使用Opencv 2.4将python numpy数组转换为RGB图像?

jma*_*220 33 python opencv numpy

我搜索过类似的问题,但由于大多数解决方案都使用旧版本的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
Run Code Online (Sandbox Code Playgroud)

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

cv2.imwrite('color_img.jpg', b)
cv2.imshow('Color image', b)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

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

bik*_*z05 15

您不需要从numpy数组转换为MatOpenCV cv2模块可以接受numpy数组.您唯一需要注意的是{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();
Run Code Online (Sandbox Code Playgroud)

  • 哦,我明白了,我认为这些值应该位于 RGB 位置。 (2认同)

Mar*_*oma 14

您正在寻找scipy.misc.toimage:

import scipy.misc
rgb = scipy.misc.toimage(np_array)
Run Code Online (Sandbox Code Playgroud)

  • 似乎在scipy 0.18.0中不存在 (4认同)
  • 问题是询问使用 OPEN-CV 的方法。 (4认同)
  • 是的。我的回答对 9 个人仍然有用。 (2认同)

小智 9

这是因为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
Run Code Online (Sandbox Code Playgroud)


jmu*_*sch 5

下面的图像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)
Run Code Online (Sandbox Code Playgroud)

请参阅此处以获取更多信息: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])
Run Code Online (Sandbox Code Playgroud)


Ale*_*yGy 5

如果其他人只想显示黑色图像作为背景,例如 500x500 像素:

import cv2
import numpy as np

black_screen  = np.zeros([500,500,3])
cv2.imshow("Simple_black", black_screen)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)