web-dev-qa-db-fra.com

Comment convertir un tableau python numpy en une image RVB 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 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é!

26
jmanring220

Vous n'avez pas besoin de convertir de numpy array en Mat car OpenCV cv2 _ module peut accepter numpyarray. 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();
14
bikz05

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

9
Martin Thoma

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

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)
3
AlexeyGy