簡體   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