在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
和其他一些工具,但是我正在尝试最小化依赖关系(即,到目前为止仅cv2
,numpy
和内在函数)。
谢谢!
答案 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])
到目前为止,给出了最佳的尺寸速度权衡。谢谢。