我在科学领域进行图像处理。每当我需要将图像保存到硬盘上时,我希望能够在以后重新打开它并获取与保存前完全相同的数据。我独占使用PNG格式,因为一直以来我认为它是无损格式。如果我没有使用错误的比特深度,那么这总是正确的吗?编码器和解码器是否完全不起作用呢?具体来说,我保存的图像:
- 以2D numpy数组形式存在
- 具有从0到255的整数值
- 使用OpenCV的
imwrite()
函数进行编码,例如:cv2.imwrite("image.png", array)
我在科学领域进行图像处理。每当我需要将图像保存到硬盘上时,我希望能够在以后重新打开它并获取与保存前完全相同的数据。我独占使用PNG格式,因为一直以来我认为它是无损格式。如果我没有使用错误的比特深度,那么这总是正确的吗?编码器和解码器是否完全不起作用呢?具体来说,我保存的图像:
imwrite()
函数进行编码,例如: cv2.imwrite("image.png", array)
PNG是一种设计上无损格式:
由于PNG的压缩完全是无损的,而且它支持高达48位真彩色或16位灰度,因此保存、恢复和重新保存图像不会降低其质量,这与标准的JPEG(即使在最高质量设置下)不同。
编码器和解码器在正确读取图像方面不应该有影响。(当然,假设它们没有漏洞)。
而且,与TIFF不同,PNG规范不留任何余地供实现者选择他们将支持的功能;结果是,在一个应用程序中保存的PNG图像可以在任何其他支持PNG的应用程序中读取。
虽然png是无损的,但这并不意味着它默认情况下是未压缩的。
我使用IMWRITE_PNG_COMPRESSION
标志来指定压缩。它的值介于0
(无压缩)和9
(最大压缩)之间。所以如果您想要未压缩的png:
cv2.imwrite(filename, data, [cv2.IMWRITE_PNG_COMPRESSION, 0])
压缩得越多,保存所需的时间就越长。
PGM
或彩色的PPM
- 特别是因为OpenCV可以在没有任何库依赖的情况下读写它们。此外,如果以后需要更高的颜色分辨率,它们还支持16位... https://en.wikipedia.org/wiki/Netpbm_format - Mark Setchell