2009-10-30 120 views
8

我正在使用大约20000 x 20000像素的1gb大型tiff图像。我需要从图像中随机抽取几块图像(大约300x300像素)。高效TIFF瓷砖提取C++

我尝试以下解决方案:

  • 的libtiff(唯一的低级别库,我能找到)提供TIFFReadline(),但是,这意味着在读围绕19700 unnecesary像素。

  • 我实现了我自己的tiff阅读器,它可以从图像中提取图块而不读取不需要的像素。我预计它会更快,但是为每块瓷砖做一个seekg使其非常缓慢。我也尝试读取缓冲区中所有包含我的图块的文件的行,然后从缓冲区中提取图块,但结果差不多。

我希望收到可以改进我的瓷砖提取工具的建议!

一切是值得欢迎的,也许你可以提出更有效的库我可以使用,关于C/C++的I/O,一些更高层次的满足我的需求战略的一些技巧等

问候, 胡安

+0

我们可以假设它们是未压缩的吗? – 2009-10-30 17:30:40

+0

而且数据是在扫描线中组织的? – 2009-10-30 17:44:03

+0

是,数据是未压缩和组织最traditinal方式: 一号线2号线 3号线 ... – Juan 2009-11-02 12:47:32

回答

2
+0

我目前正在测试这个选项。感谢您的回复。 – Juan 2009-11-13 14:52:49

+0

在64位操作系统上有趣。大的tiff文件很容易超过32位的边界。在我的XP上,我有读取400MByte及以上位图的问题,因为'虚拟内存'碎片化。即:即使使用2 GB的免费(!)RAM,我也无法找到400 MB的连续内存空间块。 – Adriaan 2010-01-14 22:05:20

3

[主要编辑10年1月14日]

我还是有点贵的瓷砖提起,迷茫时,TIFF是不是平铺。

我确实使用平铺/金字塔TIFF图像。我创建了那些VIPS

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,pyramid 

我认为你可以这样做:

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,flat 

你可能想用瓷砖大小的实验。然后你可以使用TIFFReadEncodedTile进行阅读。

如果您需要放大/缩小,使用金字塔tiff的多分辨率存储速度要快得多。您可能还想用它来制作一幅粗略的图像,接下来是详细的图片。

切换到(大小适中的)平铺存储(这会为随机访问带来巨大的性能改进!),您的瓶颈将是磁盘io。如果按顺序读取,文件读取速度会更快。这里的映射可能是解决方案。

一些有用的链接:

VIPS IIPImage LibTiff.NET stackoverflow VIPS是一种图像处理库,可以做更多的不仅仅是读/写。它有自己的,非常有效的内部格式。它有一个很好的算法文档。首先,它从文件系统中分离处理,从而允许缓存切片。

IIPImage是一个多变焦网络服务器/浏览器库。我发现该文档是多分辨率成像信息的非常好的来源(如谷歌地图)

此页面上的其他解决方案使用mmap,仅对'小'文件有效。我经常碰到32位的边界。通常情况下,分配1 GB的内存将在32位操作系统(安装4 GB内存)上失败,这是因为即使在运行一个或两个应用程序后,虚拟内存也会分裂。仍然有足够的内存来缓存部分或整个图像。更多的内存=更多的性能。

+0

TIFF可以平铺或具有数据条。这是管理大图像创建和读取的唯一方法。 – WhoCares 2018-01-12 13:04:02

0

我做了类似的事情来处理一个任意大的TARGA(TGA)格式文件。 使这种文件变得简单的事情是图像没有被压缩。您可以计算图像内任意像素的位置,并通过简单的查找来找到它。如果您可以选择指定图像编码,则可以考虑使用targa格式。

如果没有TIFF格式的种类很多。如果他们已经经历了支持所有不同格式的痛苦,那么你可能想要使用一个库。

2

谢谢大家的回复。

实际上,需要改变瓷砖的方式,允许我以顺序的方式从硬盘中的文件中提取瓷砖,而不是随机的方式。这使我可以将文件的一部分加载到内存中,并从那里提取切片。

效率增益巨大。否则,如果你需要随机访问一个文件,mmap是一个很好的交易。

问候, 胡安

-1

你得到一个特定的错误消息?根据您使用该命令行的方式,您可能已经加入了自己的文件。

如果这不是问题,请尝试使用imagemagick而不是vips(如果它是一个选项)。