J'ai cherché des questions similaires, mais je n'ai rien trouvé d'utile, car la plupart des solutions utilisent des versions antérieures d'OpenCV.
J'ai un tableau 3D numpy et je voudrais l'afficher et/ou l'enregistrer en tant qu'image BGR avec OpenCV (cv2).
À titre d’exemple, supposons que j’ai eu:
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
Ce que je voudrais faire, c'est sauvegarder et afficher b comme une image couleur semblable à:
cv2.imwrite('color_img.jpg', b)
cv2.imshow('Color image', b)
cv2.waitKey(0)
cv2.destroyAllWindows()
Cela ne fonctionne pas, probablement parce que le type de données b n'est pas correct, mais après des recherches approfondies, je ne vois pas comment le remplacer par le bon. Si vous pouviez offrir des conseils, ce serait grandement apprécié!
Vous n'avez pas besoin de convertir de numpy
array en Mat
car OpenCV cv2
_ module peut accepter numpy
array. La seule chose dont vous devez tenir compte est que {0,1} est associé à {0,255} et que toute valeur supérieure à 1 dans le tableau numpy
est égale à 255. Vous devez donc diviser par 255 dans votre code, comme indiqué ci-dessous.
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();
Tu recherches scipy.misc.toimage
:
import scipy.misc
rgb = scipy.misc.toimage(np_array)
Il semble être aussi dans scipy 1. , mais a un avertissement de dépréciation. Au lieu de cela, vous pouvez utiliser pillow
et PIL.Image.fromarray
Les images c, d, e et f illustrent ci-après la conversion d’espaces colorimétriques. Il s’agit également de tableaux 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)
Voir ici pour plus d’informations: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor
OU vous pourriez:
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])
Si quelqu'un d'autre veut simplement afficher une image noire en tant qu'arrière-plan, cliquez ici, par exemple. pour 500x500 px:
import cv2
import numpy as np
black_screen = np.zeros([500,500,3])
cv2.imshow("Simple_black", black_screen)
cv2.waitKey(0)