web-dev-qa-db-de.com

Wie konvertiert man mit Opencv 2.4 ein python numpy-Array in ein RGB-Bild?

Ich habe nach ähnlichen Fragen gesucht, aber keine hilfreichen gefunden, da die meisten Lösungen ältere Versionen von OpenCV verwenden.

Ich habe ein 3D-Numpy-Array und möchte es mit OpenCV (cv2) als BGR-Bild anzeigen und/oder speichern.

Nehmen wir als kurzes Beispiel an, ich hätte:

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 ich tun möchte, ist, b als Farbbild zu speichern und anzuzeigen, ähnlich wie:

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 Hinweise anbieten können, wäre es sehr dankbar!

26
jmanring220

Sie müssen kein numpy Array in Mat konvertieren, da OpenCV cv2 Modul kann numpyarray akzeptieren. Das einzige, worauf Sie achten müssen, ist, dass {0,1} auf {0,255} abgebildet ist und jeder Wert größer als 1 in numpy gleich 255 ist. Sie sollten also in Ihrem Code durch 255 dividieren, Wie nachfolgend dargestellt.

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();
14
bikz05

Du suchst nach scipy.misc.toimage :

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

Es scheint auch in scipy 1. zu sein, hat aber eine Ablehnungswarnung. Stattdessen können Sie pillow und PIL.Image.fromarray

9
Martin Thoma

Die Bilder c, d, e und f im Folgenden zeigen, dass es sich bei der Farbraumkonvertierung zufällig auch um numpy Arrays handelt <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)

Weitere Informationen finden Sie hier: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

ODER du könntest:

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])
4
jmunsch

Wenn jemand anderes einfach ein schwarzes Bild als Hintergrund anzeigen möchte, z. für 500x500 px:

import cv2
import numpy as np

black_screen  = np.zeros([500,500,3])
cv2.imshow("Simple_black", black_screen)
cv2.waitKey(0)
3
AlexeyGy