2014-10-31 58 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

相關問題