在 Python 中构建高分辨率图像
Posted
技术标签:
【中文标题】在 Python 中构建高分辨率图像【英文标题】:Constructing high resolution images in Python 【发布时间】:2013-06-02 09:49:13 【问题描述】:假设我在 HDF5 数据文件中存储了大量数据(大小:20k x 20k,如果不是更多),我想使用 Python 从所有这些数据创建图像。显然,这么多数据是无法打开并存储在内存中而不会出现错误的。因此,是否有其他库或方法不需要将所有数据转储到内存中然后处理成图像(例如库:Image、matplotlib、numpy 等如何处理它)?
谢谢。
这个问题来自我提出的一个类似问题:Generating pcolormesh images from very large data sets saved in H5 files with Python 但我认为我在这里提出的问题涵盖了更广泛的应用。
编辑 (7.6.2013)
请允许我进一步澄清我的问题:在第一个问题(链接)中,我使用了我能想到的最简单的方法,从存储在多个文件中的大量数据集合中生成图像。该方法是导入数据,使用 matplotlib 生成 pcolormesh 图,然后从该图中保存高分辨率图像。但是这种方法有明显的内存限制。在出现内存错误之前,我只能从文件中导入大约 10 个数据集。
在那个问题中,我问是否有更好的方法可以将数据集(保存在 HDF5 文件中)拼凑成一个图像,而无需将所有数据导入计算机的内存中。 (我可能需要将 100 个这些数据集拼凑成一个图像。)此外,我需要在 Python 中完成所有操作以使其自动化(因为该脚本需要经常针对不同的数据集运行)。
我在尝试使用各种库使其工作时发现的真正问题是:如何在 Python 中处理高分辨率图像?例如,如果我有一个非常高分辨率的 PNG 图像,我如何使用 Python 操作它(裁剪、拆分、运行 fft 等)?以我的经验,我在尝试导入高分辨率图像时总是遇到内存问题(想想显微镜或望远镜中的高分辨率图片(我的应用程序是显微镜))。是否有任何设计用于处理此类图像的库?
或者,相反,我如何使用 Python 从保存在文件中的大量数据生成高分辨率图像?同样,数据文件可以任意大(如果不是更大,则为 5-6 GB)。
但在我的实际应用中,我的问题是:是否有一个库或某种技术可以让我获取从我的设备接收到的所有数据集(保存在 HDF5 中)并将它们修补在一起从所有这些中生成图像?或者我可以将所有数据集保存在一个(非常大的)HDF5 文件中。那我怎么能导入这个文件,然后从它的数据中创建一个图像呢?
我不关心在某些交互式绘图中显示数据。情节的分辨率并不重要。我可以轻松地为它使用较低的分辨率,但我必须能够从数据中生成并保存高分辨率图像。
希望这能澄清我的问题。请随时就我的问题提出任何其他问题。
【问题讨论】:
可以用GDAL完成,例如:***.com/questions/14911590/… 可以使用hdf image api吗? 这个问题不是很清楚。您似乎不需要图像,而是以pcolormesh
或imshow
的形式可视化您的数据。 (请注意,Float32
中的 20k x 20k 仅为 1.5 Gb,您确定没有这个吗?)另外,您其他问题中的方法可能会导致每个子图像中的强度缩放不同。如果您知道图像的边界,我建议为整个事物创建一个空的 uint8 数组(更少的内存使用),然后通过将每个子图像缩放到数据的最小/最大值来填充它。如果失败,我会将每个图像保存为 png 并将它们与 ImageMagick 合并。
@tiago 请查看问题的编辑。
【参考方案1】:
你说它“显然不能存储在内存中”,但下面的计算却不是这样。
20,000 * 20,000 pixels * 4 channels = 1.6GB
大多数现代计算机都有 8GB 到 16GB 的内存,因此处理 1.6GB 应该不是问题。
但是,为了处理您需要做的修补工作,您可以将每个像素从一个文件流式传输到另一个文件。这假定格式是使用线性编码格式(如 BMP 或 TIFF)的无损位图。只需读取每个文件并附加到您的结果文件。
如果文件大小不同或以某种类型的网格拼凑在一起,您可能需要聪明一点。在这种情况下,您需要计算生成图像的总尺寸并偏移文件写入指针。
【讨论】:
以上是关于在 Python 中构建高分辨率图像的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xcode 的 Storyboard 中保持高分辨率图像而不使其像素化?