如何有效地采样600 MP图像

时间:2018-02-21 23:44:32

标签: php python image-processing

我有一个过程可以产生非常高分辨率的600+ MP图像。加载到RAM(40MB高度压缩)时,这些图像大约为2GB。我正在索引它们并通过PHP Web应用程序提供它们。

我有数据告诉我对像素单位感兴趣的区域,所以我很好奇是否有一种方法可以读取图像的特定区域而不将整个内容加载到内存中。有点像移动文件指针,但选择何时读取。目标是创建一个感兴趣区域的小图片。

我知道PHP中有一些图像处理库,而且有一些用于Python的图像处理库,但我真的不知道关于库的正确问题是什么。

我真的在寻找PHP或Python的解决方案

2 个答案:

答案 0 :(得分:2)

你可能想看看ImageMagick,我已经从Java中使用了非常成功的东西。

有一点学习曲线,但它非常强大,我相信"选择一个图像区域的命令行示例" on https://www.imagemagick.org/script/command-line-processing.php说明了你所描述的内容(从更大的图像中提取一个小的已知AoI)。

答案 1 :(得分:1)

php-vips会尽可能阅读您需要的部分。它通常比imagemagick快3到5倍,并且需要更少的内存。

许多图片格式不允许随机访问。 JPEG,PNG,GIF和其他许多内容会强制您在所需像素之前至少解压缩像素,对于您正在处理的那种巨大图像,这将非常慢。

一种解决方案是切换到JPEG压缩的平铺TIFF。此格式将图像分成(默认情况下)256x256像素图块并分别压缩每个图块。磁贴存储在带索引的TIFF文件中,因此您可以非常快速地拉出单个磁贴。

例如,您可以使用libvips将巨大的JPEG图像转换为JPEG压缩的平铺tiff:

create trigger 'upd' before update 
on 'obligations' 
for each row 
set old.user_id = old.id;

索引使图像更大,但也不错:

ERROR 1362 (HY000): Updating of OLD row is not allowed in trigger

你可以在PHP中读出它的随机区域:

$ time vips copy wac_nearside.jpg wac_nearside.tif[tile,compression=jpeg]
real    0m3.891s
user    0m6.332s
sys     0m0.198s
peak RES 40mb

我可以像这样运行该程序:

$ ls -l wac_nearside.* 
-rw-r--r-- 1 john john 74661771 May  7  2015 wac_nearside.jpg
-rw-r--r-- 1 john john 76049323 Feb 24 15:39 wac_nearside.tif
$ vipsheader wac_nearside.jpg wac_nearside.jpg: 24000x24000 uchar, 1 band, b-w, jpegload

因此,在这款老式笔记本电脑上,它可以在0.2秒内读出(并创建)100个JPEG文件。