Comment convertir un tableau python numpy en image RGB avec Opencv 2.4?

j'ai cherché des questions similaires, mais je n'ai rien trouvé d'utile car la plupart des solutions utilisent des versions plus anciennes D'OpenCV.

j'ai un tableau numpy 3D, et je voudrais l'afficher et/ou le sauvegarder comme une image BGR en utilisant OpenCV (cv2).

comme un bref exemple, supposons que j'ai:

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 enregistrer et afficher b comme une image couleur similaire à:

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 de b n'est pas correct, mais après une recherche substantielle, Je ne peux pas trouver comment le changer pour le bon. Si vous pouvez offrir n'importe quels conseils, il serait grandement apprécié!

16
demandé sur jmanring220 2014-10-31 22:06:32

4 réponses

Vous n'avez pas besoin de convertir à partir de numpy array Mat parce que OpenCV cv2 module peut accepter numpy array. La seule chose que vous devez prendre en charge est que {0,1} est mappé à {0,255} et toute valeur supérieure à 1 en numpy array est égal à 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();
9
répondu bikz05 2014-11-01 07:15:26

Les images c, d, e et f dans le spectacle suivant, couleur de la conversion, ils se trouvent également être des 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 pouvez:

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])
3
répondu jmunsch 2014-10-31 21:24:19

Vous êtes à la recherche pour scipy.misc.toimage:

import scipy.misc
rgb = scipy.misc.toimage(np_array)
3
répondu Martin Thoma 2016-08-16 08:51:51

si quelqu'un d'autre veut simplement afficher une image noire en arrière-plan, 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)
0
répondu Julia92 2018-08-14 13:09:11