我正在创建无损的PNG图像吗?

19

我在科学领域进行图像处理。每当我需要将图像保存到硬盘上时,我希望能够在以后重新打开它并获取与保存前完全相同的数据。我独占使用PNG格式,因为一直以来我认为它是无损格式。如果我没有使用错误的比特深度,那么这总是正确的吗?编码器和解码器是否完全不起作用呢?具体来说,我保存的图像:

  • 以2D numpy数组形式存在
  • 具有从0到255的整数值
  • 使用OpenCV的imwrite()函数进行编码,例如: cv2.imwrite("image.png", array)

5
在这种情况下,我不知道除了"像素完美"的数据之外还能有其他的方式。 - Mark Setchell
4
如果你有疑虑,重新加载图像并计算absdiff,测试是否存在任何结果像素不为0,对于一些良好数量的样本图像进行测试。 - Micka
2
我的当前信息是PNG压缩绝对不会有损失,但用户可能会通过将太多的位数每像素压入格式中而搞砸它,导致颜色/值范围的损失。 - smcs
2
@percusse 有什么好处呢?据我所知,并没有“一个”TIFF格式。使用它时,似乎需要非常仔细地观察你在做什么。英文维基百科页面列出了20多种不同的压缩模式,有些是无损的,有些是有损的。再仔细看一下,显然只有其中5种经常被使用。尽管如此,它似乎是一个非常复杂的格式,有许多版本和自由度。 - smcs
2
在这里使用TIFF没有任何好处 - 它只会使事情变得复杂并增加依赖关系。实际上,我会采用最简单的格式,它不支持压缩 - 即NetPBM格式之一,例如灰度的PGM或彩色的PPM - 特别是因为OpenCV可以在没有任何库依赖的情况下读写它们。此外,如果以后需要更高的颜色分辨率,它们还支持16位... https://en.wikipedia.org/wiki/Netpbm_format - Mark Setchell
显示剩余9条评论
2个回答

17

PNG是一种设计上无损格式

由于PNG的压缩完全是无损的,而且它支持高达48位真彩色或16位灰度,因此保存、恢复和重新保存图像不会降低其质量,这与标准的JPEG(即使在最高质量设置下)不同。

编码器和解码器在正确读取图像方面不应该有影响。(当然,假设它们没有漏洞)。

而且,与TIFF不同,PNG规范不留任何余地供实现者选择他们将支持的功能;结果是,在一个应用程序中保存的PNG图像可以在任何其他支持PNG的应用程序中读取。


谢谢!编码器在压缩率方面差异巨大,标准编码器(也被OpenCV使用)的表现要比其他编码器差得多:https://dev59.com/QWct5IYBdhLWcg3wQ7bP#12216875 - smcs

15

虽然png是无损的,但这并不意味着它默认情况下是未压缩的。

我使用IMWRITE_PNG_COMPRESSION标志来指定压缩。它的值介于0(无压缩)和9(最大压缩)之间。所以如果您想要未压缩的png:

cv2.imwrite(filename, data, [cv2.IMWRITE_PNG_COMPRESSION, 0])

压缩得越多,保存所需的时间就越长。

文档链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接