如何将Python Numpy数组转换为Opencv 2.4的RGB图像?

80 投票
7 回答
386616 浏览
提问于 2025-04-30 22:33

我搜索过类似的问题,但没有找到什么有用的答案,因为大多数解决方案都是基于旧版本的OpenCV。

我有一个三维的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的数据类型不对,但我搜索了很久,还是搞不清楚怎么把它改成正确的类型。如果你能给点建议,我会非常感激!

暂无标签

7 个回答

7

如果有人只是想显示一张黑色的图片作为背景,比如说大小为500x500像素,可以参考下面的代码:

import cv2
import numpy as np

black_screen  = np.zeros([500,500,3])
cv2.imshow("Simple_black", black_screen)
cv2.waitKey(0)
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
12

下面的图片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])
26

你在找的是 scipy.misc.toimage

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

这个功能在 scipy 1.0 里也有,但会有一个不推荐使用的警告。相反,你可以使用 pillowPIL.Image.fromarray

58

你不需要把 NumPy 数组转换成 Mat,因为 OpenCV 的 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()

撰写回答