2014-10-31 278 views
12

我已经搜索了类似的问题,但没有找到任何有用的信息,因为大多数解决方案都使用旧版本的OpenCV。如何使用Opencv 2.4将python numpy数组转换为RGB图像?

我有一个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的数据类型不正确,但经过大量搜索后,我无法弄清楚如何将其更改为正确的。如果您可以提供任何指针,将不胜感激!

+0

感谢您的评论@beaker!然而,这个问题的问题在于海报在'imshow()'中忘记了一个参数。我的问题是'imshow' /'imwrite'不会像上面创建的numpy数组那样。 – jmanring220 2014-10-31 20:08:48

+0

你想把它保存为'BGR'还是'RGB'?标题和问题都有。 – jmunsch 2014-10-31 20:27:52

+0

@ jmanring220是的,但答案仍然显示如何将numpy数组转换为mat。 – beaker 2014-10-31 21:02:15

回答

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]) 
5

你并不需要从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(); 
1

您正在寻找scipy.misc.toimage

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

这似乎并不存在于scipy 0.18.0 – 2016-08-16 08:22:07

+0

@AlexKreimer:http://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.misc.toimage.html – 2016-08-16 08:51:32