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!
Sie müssen kein numpy
Array in Mat
konvertieren, da OpenCV cv2
Modul kann numpy
array 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();
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
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])
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)