Подтвердить что ты не робот

Как преобразовать массив numpy python в RGB-образ с помощью Opencv 2.4?

Я искал похожие вопросы, но не нашел ничего полезного, так как большинство решений используют более старые версии OpenCV.

У меня есть массив 3D numpy, и я хотел бы отображать и/или сохранять его как изображение BGR с помощью OpenCV (cv2).

В качестве короткого примера предположим, что у меня было:

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

Что бы я хотел сделать, это сохранить и отобразить b как цветное изображение, подобное:

cv2.imwrite('color_img.jpg', b)
cv2.imshow('Color image', b)
cv2.waitKey(0)
cv2.destroyAllWindows()

Это не работает, по-видимому, потому, что тип данных b неверен, но после существенного поиска я не могу понять, как изменить его на правильный. Если вы можете предложить любые указатели, мы будем очень благодарны!

4b9b3361

Ответ 1

Вам не нужно преобразовывать из массива numpy в Mat, потому что модуль OpenCV cv2 может принимать массив numpy. Единственное, что вам нужно позаботиться, это то, что {0,1} сопоставляется с {0,255}, а любое значение, большее 1 в массиве numpy, равно 255. Таким образом, вы должны разделить на 255 код, как показано ниже.

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

Ответ 2

Изображения c, d, e и f в следующем преобразовании цветового пространства показывают, что они также являются массивами 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)

См. здесь для получения дополнительной информации: http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#cvtcolor

ИЛИ вы могли:

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

Вы ищете scipy.misc.toimage:

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