【问题标题】:How do I read an arbitrary image file format (PNG, JPEG, TIFF, BMP) in Python using only the standard library?如何仅使用标准库在 Python 中读取任意图像文件格式(PNG、JPEG、TIFF、BMP)?
【发布时间】:2018-08-26 00:03:42
【问题描述】:

我是一位经验丰富的 Python 程序员,拥有丰富的图像处理和计算机视觉经验。我非常熟悉所有标准工具,例如PILPillowopencvnumpyscikit-image

如果我只有标准库可以使用,我将如何将图像读入 Python 数据格式,如嵌套列表、字节数组或类似格式?

我意识到不同的图像格式有不同的规格。我的问题是我什至如何开始构建一个读取任何给定格式的函数。

注意 Python 2.6 在标准库中有一个jpeg 模块,该模块已被弃用。我们不讨论这个,因为它不受支持。

【问题讨论】:

  • 看看 PIL 是如何实现它的......你可能会发现只需要读取原始字节,通过幻数识别类型(通常是前几个字节,并且有一个查找表为整个网络),然后使用它决定如何使文件中的内容/元数据可用。 (此时您已经编写了一个大大简化的 PIL 版本......)......我会首先查看这些库的来源并从那里重用想法。
  • 1) 我担心opencvPIL 之类的东西依赖了多少纯 C 代码。 OpenCV 几乎使用纯 C 绑定。 PIL 有一些 C. 2) 理解这非常困难:github.com/python-pillow/Pillow/blob/…
  • 是的...您可能必须使用 C 代码作为基础并熟悉使用 struct 来模拟对结构/打包数据的操作...以及所有您可能希望能够执行的任何操作的细微差别/图像格式规范文档......除了花时间查看现有解决方案的建议......这非常“接近一本书来解释” -稍微细读一下源代码和技术规格……信息就在你需要的地方。

标签: python computer-vision


【解决方案1】:

如果您询问如何“从头开始”实现这些格式(因为标准库不这样做),那么格式规范就是一个很好的起点。

对于 PNG,这是https://www.w3.org/TR/2003/REC-PNG-20031110/。它定义了 PNG 流的组成,包括签名(8 个字节,8950 4e47 0d0a 1a0a,将文件标识为 PNG 图像)和一些包含元数据、调色板信息和图像本身的数据块。 (如果你真的不想使用现有的库,这肯定是一个需要承担的重大项目,但也不过分。)

对于 BMP 来说,因为文件已经包含未压缩的像素数据,所以要容易一些,您只需要知道如何找到大小和偏移量;一些格式定义在维基百科 (https://en.wikipedia.org/wiki/BMP_file_format) 和这里:http://www.digicamsoft.com/bmp/bmp.html

JPG 要复杂得多。该文件不存储像素,而是将“小波”转换为您在屏幕上看到的像素图。要读取这种格式,您需要实现这个转换函数。

【讨论】:

  • 你绝对是对的。我意识到,在实践中,从头开始构建这样一个工具会导致我遇到无数的边缘情况,而这些情况已经被成熟的图像库很好地处理了。
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2021-08-01
  • 2023-01-16
  • 1970-01-01
相关资源
最近更新 更多