如何将Python的numpy数组转换为带有Opencv 2.4的RGB图像?
如何将Python的numpy数组转换为带有Opencv 2.4的RGB图像?
我已经搜索了类似的问题,但没有找到有帮助的答案,因为大多数解决方案使用的是旧版本的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的数据类型不正确,但是经过大量搜索,我找不到如何将其更改为正确的数据类型。如果您有任何指导,将不胜感激!
问题的出现原因是需要将一个Python的numpy数组转换为RGB图像,并使用OpenCV 2.4进行处理。文章的解决方法如下:
首先,通过使用numpy库创建一个200x200的3通道零矩阵,并将其中的第一个通道的值设置为全255,第二个通道的值设置为全255,第三个通道的值设置为全0。然后,使用cv2库的imwrite方法将该矩阵保存为名为color_img.jpg的图像。
接下来,通过使用cv2库的imread方法读取color_img.jpg图像,并将读取的图像转换为RGB颜色空间,存储在变量c中。然后,再次使用imread方法读取color_img.jpg图像,并将读取的图像转换为BGR颜色空间,存储在变量d中。接着,使用imread方法读取color_img.jpg图像,并将读取的图像转换为RGB颜色空间,存储在变量e中。最后,使用imread方法读取color_img.jpg图像,并将读取的图像转换为BGR颜色空间,存储在变量f中。
在接下来的代码中,将变量d、c、f和e存储在pictures列表中,并通过调用show_pic函数显示这些图像。show_pic函数通过调用imshow方法显示图像,并通过按下键盘上的esc键来关闭窗口。然后,通过调用cv2库的destroyAllWindows方法关闭所有的窗口。
最后,通过打印变量c的值和形状,显示矩阵c的值和形状信息。
另外,还提供了另一种解决方法。通过使用numpy库创建一个200x200的3通道零矩阵,并将其中的第一个通道的值设置为全255,第二个通道的值设置为全255,第三个通道的值设置为全0。然后,使用cv2库的split方法将图像分割为单个通道的图像,存储在变量r、g和b中。最后,使用cv2库的merge方法将r、g和b重新合并为BGR图像,存储在变量img_bgr中。
通过这两种方法,就可以将Python的numpy数组转换为RGB图像,并使用OpenCV 2.4进行处理。
如何将Python的NumPy数组转换为带有OpenCV 2.4的RGB图像?
如果你正在寻找一种方法来将NumPy数组转换为RGB图像,你可以使用`scipy.misc.toimage`。你可以导入`scipy.misc`库,并使用其中的`toimage`函数来完成转换:
import scipy.misc rgb = scipy.misc.toimage(np_array)
然而,这个方法似乎在`scipy 1.0`版本中被弃用了,并且会有一个警告。相反,你可以使用`pillow`库中的`PIL.Image.fromarray`函数来完成转换。这个方法可以在`https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.fromarray`找到。
根据之前的回答,这个方法在`scipy 0.18.0`版本中可能不存在。你可以参考这个链接`http://docs.scipy.org/doc/scipy-0.18.0/reference/generated/scipy.misc.toimage.html`来查看具体的文档。
原问题提到了需要使用OpenCV的方法。回答中提供的方法对其他人可能也有用。
实际上,这正是我在寻找的方法。我有一个来自OpenCV的NumPy数组,我想在pysimpleui中显示它,而pysimpleui要求一个正确的图像格式。
问题的原因是:用户想要将Python的NumPy数组转换成RGB图像,并使用OpenCV 2.4进行操作。然而,他们在转换过程中遇到了一些问题。
解决方法是:不需要将NumPy数组转换成Mat,因为OpenCV的cv2模块可以直接接受NumPy数组。唯一需要注意的是,将{0,1}映射到{0,255},并且任何大于1的值在NumPy数组中等于255。因此,在代码中应该除以255,如下所示:
import cv2 import numpy 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()
如果需要反转颜色通道,可以使用以下代码:
cv2.imshow("color_img.jpg", input[..., ::-1] * 255)
以上是解决该问题的方法,希望对你有所帮助。