2014-10-31 8 views
12

Ich habe nach ähnlichen Fragen gesucht, aber nichts hilfreich gefunden, da die meisten Lösungen ältere Versionen von OpenCV verwenden.Wie konvertiert man ein Python-Numpy-Array mit Opencv 2.4 in ein RGB-Bild?

Ich habe ein 3D-Nummernfeld, und ich möchte es als ein BGR-Bild mit OpenCV (CV2) anzeigen und/oder speichern.

Als kurzes Beispiel: Angenommen, ich hatte: speichern und anzeigen

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 

Was würde ich tun b als Farbbild ähnlich ist:

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

Dies funktioniert nicht , vermutlich weil der Datentyp von b nicht korrekt ist, aber nach gründlicher Suche kann ich nicht herausfinden, wie ich ihn in den richtigen ändern kann. Wenn Sie irgendwelche Zeiger anbieten können, würde es sehr geschätzt werden!

+0

Danke für den Kommentar @beaker! Das Problem in dieser Frage ist jedoch, dass das Poster ein Argument in "imshow()" vergessen hat. Mein Problem ist, dass 'imshow' /' imwrite' das Array numpy nicht wie oben erzeugt. – jmanring220

+0

Möchten Sie es als 'BGR' oder' RGB' speichern? Der Titel und die Frage haben beide. – jmunsch

+0

@ jmanring220 Ja, aber die Antworten zeigen immer noch, wie man ein numpiges Array in eine Matte umwandelt. – beaker

Antwort

3

Die Bilder c, d, e und f in der folgenden Show Farbraumkonvertierung passieren sie auch numpy Arrays <type 'numpy.ndarray'> sein:

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) 

Sehen Sie hier für weitere Informationen: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

oder Sie könnten :

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

Sie brauchen nicht 0 von numpy Array Mat weil OpenCV zu konvertierenModul kann numpy Array akzeptieren. Das einzige, was Sie beachten müssen, ist, dass {0,1} auf {0,255} abgebildet wird und jeder Wert größer als 1 in numpy Array gleich 255 ist. Sie sollten also in Ihrem Code durch 255 dividieren, wie unten gezeigt.

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

Sie suchen scipy.misc.toimage:

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

Dies scheint nicht in scipy 0.18.0 –

+0

@AlexKreimer zu existieren: http://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.misc.toimage.html –

Verwandte Themen