如何从OpenCV映像而不是numpy数组中获取TIFF字节流?

时间:2018-08-24 09:53:33

标签: python numpy opencv image-processing

在python中,我想转换已使用OpenCV处理过的图像,以便以某种图像格式(在这种情况下为 TIFF 进行传输,但是可以是:BMP,JPEG,PNG,.. ...)。

为此,将OpenCV映像编码到内存缓冲区中就足够了。问题是,当我使用cv2.imencode()进行此操作时,返回的对象仍然看起来像numpy数组:

import cv2
img_cv2_aka_nparr = cv2.imread('test.jpg')
my_format = '.tiff'
retval, im_buffer = cv2.imencode(my_format, img_cv2_aka_nparr)
print type(im_buffer)

im_buffer只是另一个numpy数组-根本不是TIFF编码的字节流!据我所知,Python中的OpenCV映像始终表现得像numpy数组,甚至通过numpy看起来也像type()数组。

实际上,如果您要创建虚拟的“ OpenCV映像”,则必须使用numpy-例如,参见https://stackoverflow.com/a/22921648/1021819

这是为什么,如何解决?也就是说,如何获取实际的TIFF编码字节流,而不是另一个numpy数组?

现在,我喜欢numpy,但是在这种情况下,我需要非Python服务可以读取该图像,因此它必须采用通用(最好是无损)格式(请参见上面的列表)。

(我已经绕过将numpy嵌入JSON的屋子,并决定反对它。)

我可以使用PIL / pillow,scipy和其他一些工具,但是我正在尝试最小化依赖关系(即,到目前为止仅cv2numpy和内在函数)。

谢谢!

1 个答案:

答案 0 :(得分:3)

紧随https://stackoverflow.com/a/50630390/1021819并根据Dan Masek的评论建立(但不是很严格)之后,所需的额外步骤只是使用im_buffer.tobytes(),它返回可以通过流发送的字节串。

Python OpenCV图像似乎确实以纯numpy数组表示。正如Dan Masek指出的那样,可以使用cv2.imencode()将数组转换为TIFF,PNG,BMP,JPG等。

显然,围绕格式和压缩的选择存在一些争论。在上述情况下,首选无损压缩,这意味着TIFF,BMP或PNG(仍然存在争议)。与OpenCV的python绑定没有用于TIFF压缩的可调参数(与C ++绑定不同?),因此发现在其中执行 并不容易。使用其他库,压缩级别显然会更好,但是我的目的是最小化依赖关系(见上文)。

BMP编码的图像不小于TIFF图像。 PNG压缩可在python OpenCV中进行调整,并设置

cv2.imencode('.png', nparr, [int(cv2.IMWRITE_PNG_COMPRESSION),1])
到目前为止,

给出了最佳的尺寸速度权衡。谢谢。