gpt4 book ai didi

c++ - 高效的 TIFF 图 block 提取 C++

转载 作者:可可西里 更新时间:2023-11-01 17:55:27 26 4
gpt4 key购买 nike

我正在处理大约 20000 x 20000 像素的 1gb 大型 tiff 图像。我需要从图像中随机提取几个图 block (大约 300x300 像素)。

我尝试了以下解决方案:

  • Libtiff(我能找到的唯一低级库)提供 TIFFReadline() 但这意味着读取大约 19700 个不必要的像素。

  • 我实现了自己的 tiff 阅读器,它可以从图像中提取一个图 block ,而不会读取不必要的像素。我预计它会更快,但是对磁贴的每一行进行搜索会使它变得非常慢。我还尝试将包含我的图 block 的文件的所有行读取到缓冲区,然后从缓冲区中提取图 block ,但结果大致相同。

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

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

问候,胡安

最佳答案

[2010 年 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 stackoverflowVIPS 是一个图像处理库,它可以做的不仅仅是读/写。它有自己的、非常有效的内部格式。它有很好的算法文档。其一,它将处理与文件系统分离,从而允许缓存切片。

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

此页面上的其他解决方案使用 mmap,仅对“小”文件有效。我经常达到 32 位边界。通常,分配 1 GByte 的内存块在 32 位操作系统(安装了 4 GBytes RAM)上会失败,因为即使是虚拟内存在一两个应用程序运行后也会变得碎片化。尽管如此,仍有足够的内存来缓存部分或整个图像。更多内存 = 更多性能。

关于c++ - 高效的 TIFF 图 block 提取 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com