使用Python直接访问单个像素

2024-04-25 14:46:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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


更多详情:

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

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

不过,我想再优化一些,我想知道是否有一种方法可以直接从图像中访问单个像素(我的应用程序只对图像执行操作),而不必将其加载到内存中。在

PIL像素访问允许吗?还是有别的办法?在

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

谢谢。在

更新

所以,正如我担心的那样,似乎不可能使用诸如PNG这样的可变压缩格式。在

我想进一步完善我的问题:

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

解决方案

感谢大家,我已经成功地实现了我描述的功能,通过对每一行使用游程编码,并将每一行填充到最大行的相同长度。在

这样,通过预先添加一个标题来描述每行的固定列数,我可以使用first a轻松地访问该行文件.readline()以获取标头数据,然后文件.seek(headersize+fixedsize*y,0)其中y是当前选定的行。在

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


Tags: 文件方法内存图像应用程序标题编码png
2条回答

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

这并不能完全优化对单个像素的访问,但它比打开整个大图像要高效得多。在

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

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

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

相关问题 更多 >