繁体   English   中英

是否有比LibTIFF更快的方法从32位tiff中提取浮点数?

[英]Is there a quicker way to extract floats from a 32 bit tiff than LibTIFF?

我目前正在使用它来提取浮点数:

TIFF* tiff = TIFFOpen(tiffs[i].c_str(), "r");
if (tiff) {
    uint32 width, height;
    tsize_t scanlength; 
    if (TIFFGetField(tiff,TIFFTAG_IMAGEWIDTH, &width) != 1) {}
    if (TIFFGetField(tiff,TIFFTAG_IMAGELENGTH, &height) != 1) {}
    fwidth = width;
    fheight = height;
    vector<float> data;
    scanlength = TIFFScanlineSize(tiff);
    float image[height][width];
    for (uint32 y = 0; y < height; y++) {
        TIFFReadScanline(tiff,image[y],y);
    }
}

每个TIFF花费超过0.02秒,我需要更快。 我知道,其他库可以种处理这个问题,但我只找到一个其他的可以处理32位TIFF格式,它是CIMG,历时较长。 即使这就像使用system()来执行命令行或调用一个真正快速的脚本那样简单,我也很想知道是否有一种更快的方法。

谢谢!

https://www.dropbox.com/s/5zb8spaz7cma1gx/pic.tif?dl=0

这是一个例子。

嗯,答案还不尽如我所愿,但我确实有一些想法要分享。 也许他们会引起我或其他人的进一步思考。


首先,您的图像缺少TIFF标签262( “光度解释” ),这会打乱您可能会使用的几种工具。 图像由什么程序生成-由于它们不严格兼容? 您可以更正/改善生成图像的程序吗?

我设法通过以下方法将“光度学解释”标签设置为“ min-is-black”

tiffset -s 262 0 YourImage.tif

设置好之后,我设法使用了vips (从这里开始) -非常快,而且内存高效,可以将文件转换为JPEG。 如果您喜欢这些语言,它具有Ruby和Python绑定。

因此,终端中用于将文件转换为JPEG的命令行为:

vips im_vips2jpeg YourFile.tif result.jpg

在此处输入图片说明

我不相信,虽然可以正常工作,所以也许约翰@ user894763(笔者vips )将看一看。


使用vips另一种想法是,以下命令将保存每个像素3个浮点的RGB原始文件,您可以将其直接读取到自己的程序中,而无需任何解码:

vips rawsave YourFile.tif image.raw

-rw-r--r--   1 mark  staff  3145728 20 Jun 16:59 image.raw

您会注意到文件大小(3145728)对应于:

512 pixels * 512 pixels * 3 RGB values * 4 bytes of float each

我还使用ImageMagick将图像转换为JPEG

convert YourImage.tif result.jpg

并得到以下结果:

在此处输入图片说明


我想到的另一种想法是,您可以在运行自己的TIFF提取程序之前预热缓冲区缓存,方法是在每个文件上运行cat以使它们从NFS服务器中获取:

cat *.tif > /dev/null

或运行并行流以减少延迟。


另一个想法是,您可以将文件预取到RAM支持的文件系统中,以便可以以最小的延迟读取文件。 每个文件186kB,您可以在1GB RAM磁盘中获得5,000,以进行更快的处理:

mkdir /tmp/RAM
sudo mount -t temps -o size=1G temps /tmp/RAM

您也可以将我在上面的想法中建议的中间文件放入RAM文件系统。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM