我搜索过类似的问题,但由于大多数解决方案都使用旧版本的OpenCV,因此没有找到任何帮助。
我有一个3D numpy数组,我想使用OpenCV(cv2)显示和/或保存为BGR图像。
作为一个简短的例子,假设我有:
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的数据类型不正确,但经过大量搜索后,我无法弄清楚如何将其更改为正确的数据类型。如果您能提供任何指示,我们将不胜感激!
答案 0 :(得分:14)
您无需将numpy
数组转换为Mat
,因为OpenCV cv2
模块可以接受numpy
数组。
您需要关注的唯一事情是{0,1}被映射到{0,255}并且numpy
数组中任何大于1的值都等于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();
答案 1 :(得分:9)
您正在寻找scipy.misc.toimage
:
import scipy.misc
rgb = scipy.misc.toimage(np_array)
答案 2 :(得分:4)
以下图像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 :(得分:3)
如果其他任何人只想显示黑色图像作为背景,例如为500x500像素:
import cv2
import numpy as np
black_screen = np.zeros([500,500,3])
cv2.imshow("Simple_black", black_screen)
cv2.waitKey(0)
答案 4 :(得分:3)
这是由于 cv2 使用了numpy中的“ uint8” 类型。因此,在创建数组时应定义类型。
类似以下内容:
> length(alist)
[1] 5000
> unlist(res)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
答案 5 :(得分:0)
图像大小不足以肉眼看到。因此,请尝试至少使用50x50
import cv2 as cv
import numpy as np
black_screen = np.zeros([50,50,3])
black_screen[:, :, 2] = np.ones([50,50])*64/255.0
cv.imshow("Simple_black", black_screen)
cv.waitKey(0)
cv.displayAllWindows()