0

Python有什么方法可以直接从图像(如果可能的话压缩格式)中直接获取(只获取,不修改)单个像素(以获取其RGB颜色),而无需将其加载到RAM中或处理它(以节省CPU )?


更多细节:

我的应用程序有一个庞大的图像数据库,而且只有图像。

所以我选择的是直接将图像存储在硬盘上,这样可以避免 DBMS 的额外工作量。

但是我想进行更多优化,我想知道是否有一种方法可以直接访问图像中的单个像素(我的应用程序对图像执行的唯一操作),而无需将其加载到内存中。

PIL 像素访问是否允许这样做?还是有其他方法?

图像的编码是我自己的选择,所以我可以随时更改。目前我正在使用PNG或JPG。我也可以以原始格式存储,但如果可能的话,我更愿意将图像压缩一点。但我认为硬盘驱动器比 CPU 和 RAM 便宜,所以即使图像必须保持 RAW 才能做到这一点,我认为它仍然是一个更好的选择。

谢谢你。

更新

因此,正如我所担心的那样,似乎不可能使用可变压缩格式,例如 PNG。

我想完善我的问题:

  • 是否有一个恒定的压缩格式(不一定特定于图像格式,我将以编程方式访问它),它允许通过读取标题来访问任何部分?
  • 从技术上讲,如何使用 Python 有效地(阅读:快速且非阻塞)访问文件中的字节?

解决方案

多亏了大家,我已经成功地实现了我描述的功能,方法是在每一行上使用游程编码,并将每一行填充到与最大行相同的长度。

这样,通过为每行准备一个描述固定列数的标题,我可以先使用 file.readline() 轻松访问该行以获取标题数据,然后使用 file.seek(headersize + fixedsize*y, 0 ) 其中 y 是当前选定的行。

文件被压缩,在内存中我只获取一行,我的应用程序甚至不需要解压缩它,因为我可以通过迭代每个 RLE 值来计算像素的确切位置。所以在 CPU 周期上也很容易。

4

2 回答 2

1

如果要保留压缩文件格式,可以将每个图像分成较小的矩形并分别存储。使用固定大小的矩形将更容易计算出你需要哪个。当您需要像素值时,计算它所在的矩形,打开该图像文件,并偏移坐标以获得正确的像素。

这并不能完全优化对单个像素的访问,但它可能比打开整个大图像更有效。

于 2012-10-25T22:30:54.390 回答
1

为了评估文件,您必须加载到内存中。但是,根据文件格式,您可能能够弄清楚如何只读取文件的一部分。例如,PNG 文件指定大小为 8 字节的标头。但是,由于压缩,块是可变的。但是如果你想以原始格式存储所有像素,你可以直接访问每个像素,因为你可以计算文件的地址和适当的偏移量。无法预测 PNG、JPEG 将如何处理原始数据。

根据文件的结构,您可能能够计算出有效的哈希值。我想有很多研究,如果你想真正进入这个,例如: http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber= 899541

“本文介绍了一种新的图像索引技术,可以称为图像哈希函数。该算法使用随机信号处理策略将图像不可逆地压缩为随机二进制字符串,并显示出对压缩引起的图像变化具有鲁棒性、几何变形和其他攻击"

于 2012-10-25T22:01:27.310 回答