[英]How to convert a python numpy array to an RGB image with Opencv 2.4?
我搜索过类似的问题,但没有找到任何有用的信息,因为大多数解决方案使用旧版本的 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 的数据类型不正确,但经过大量搜索后,我无法弄清楚如何将其更改为正确的类型。 如果您能提供任何指示,将不胜感激!
您不需要将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()
您正在寻找scipy.misc.toimage
:
import scipy.misc
rgb = scipy.misc.toimage(np_array)
它似乎也在scipy 1.0 中,但有弃用警告。 相反,您可以使用pillow
和PIL.Image.fromarray
下面的图像 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])
如果其他人只想显示黑色图像作为背景,例如 500x500 像素:
import cv2
import numpy as np
black_screen = np.zeros([500,500,3])
cv2.imshow("Simple_black", black_screen)
cv2.waitKey(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()
这是因为cv2使用来自 numpy 的类型“uint8” 。 因此,您应该在创建数组时定义类型。
类似于以下内容:
import numpy
import cv2
b = numpy.zeros([5,5,3], dtype=numpy.uint8)
b[:,:,0] = numpy.ones([5,5])*64
b[:,:,1] = numpy.ones([5,5])*128
b[:,:,2] = numpy.ones([5,5])*192
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.