使用Python直接访问单个像素

时间:2012-10-25 21:04:05

标签: python image-processing pixel imaging

有没有办法让Python直接从图像中获取(仅获取,不修改)单个像素(以获得其RGB颜色)(如果可能的话,压缩格式),而不必将其加载到RAM中或处理它(到备用CPU)?


更多详情:

我的应用程序意味着拥有庞大的图像数据库,而且只有图像。

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

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

PIL像素访问是否允许这样做?或者还有另一种方式吗?

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

谢谢。

更新

所以,正如我所担心的那样,似乎无法使用PNG等可变压缩格式。

我想改进我的问题:

  • 是否有一种恒定的压缩格式(不一定特定于图像格式,我会以编程方式访问它),这样只需阅读标题即可访问任何部分?
  • 从技术上讲,如何有效地(读取:快速和非阻塞)从Python文件中访问一个字节?

感谢所有人,我已成功实现了我所描述的功能,在每一行上使用游程编码,并将每一行填充到最大行的相同长度。

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

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

2 个答案:

答案 0 :(得分:1)

为了评估您必须加载到内存中的文件。但是,您可能能够弄清楚如何只读取文件的某些部分,具体取决于文件格式。例如,PNG文件指定大小为8字节的标头。但是,由于压缩,块是可变的。但是,如果要以原始格式存储所有像素,则可以直接访问每个像素,因为您可以计算文件的地址和适当的偏移量。什么PNG,JPEG与原始数据有关是不可能预测的。

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

“本文介绍了一种新颖的图像索引技术,可称为图像散列函数。该算法使用随机信号处理策略将图像不可逆地压缩成随机二进制字符串,并显示出对图像变化的鲁棒性由于压缩,几何扭曲和其他攻击“

答案 1 :(得分:1)

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

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