簡體   English   中英

如何讀取 python 中的大 tif 文件?

[英]How to read a big tif file in python?

我正在從http://oceancolor.gsfc.nasa.gov/DOCS/DistFromCoast/加載一個 tiff 文件

from PIL import Image
im = Image.open('GMT_intermediate_coast_distance_01d.tif')

數據很大( im.size=(36000, 18000) 1.3GB),常規轉換不起作用; 即, imarray.shape返回()

import numpy as np 
imarray=np.zeros(im.size)
imarray=np.array(im)

如何將此 tiff 文件轉換為numpy.array

到目前為止,我已經測試了許多替代方案,但即使使用巨大的 16 位圖像,也只有gdal始終有效。

您可以使用以下內容打開圖像:

from osgeo import gdal
import numpy as np
ds = gdal.Open("name.tif")
channel = np.array(ds.GetRasterBand(1).ReadAsArray())

願你沒有太多的內存用於這個圖像。你至少需要一些超過 1.3GB 的可用內存。

我不知道你對圖像做了什么,你把整個讀到你的記憶中,但我建議你盡可能一點一點地閱讀它以避免炸毀你的電腦。 您可以使用Image.getdata()每次返回一個像素。

還可以在此鏈接上閱讀更多有關Image.open內容:

http://www.pythonware.com/library/pil/handbook/

我有 1 到 3 GB 的巨大 tif 文件,並且在手動將 Image.py 源代碼中的 MAX_IMAGE_PIXELS 的值更改為任意大數后,最終設法使用 Image.open() 打開它們:

from PIL import Image
im = np.asarray(Image.open("location/image.tif")

對於 Python 32 位 2.7 版,您受到在給定時間可以添加到堆棧的字節數的限制。 一種選擇是分部分讀入圖像,然后調整各個塊的大小並將它們重新組合成需要較少 RAM 的圖像。

我建議為此使用軟件包libtiffopencv

    import os
    os.environ["PATH"] += os.pathsep + "C:\\Program Files (x86)\\GnuWin32\\bin"
    import numpy as np
    import libtiff
    import cv2

    tif = libtiff.TIFF.open("HUGETIFFILE.tif", 'r')
    width = tif.GetField("ImageWidth")
    height = tif.GetField("ImageLength")
    bits = tif.GetField('BitsPerSample')
    sample_format = tif.GetField('SampleFormat')
    
    ResizeFactor = 10 #Reduce Image Size by 10
    Chunks = 8 #Read Image in 8 Chunks to prevent Memory Error (can be increased for 
    # bigger files)

    ReadStrip = tif.ReadEncodedStrip
    typ = tif.get_numpy_type(bits, sample_format)


    #ReadStrip
    newarr = np.zeros((1, width/ResizeFactor), typ)
    for ii in range(0,Chunks):
        pos = 0
        arr = np.empty((height/Chunks, width), typ)
        size = arr.nbytes
        for strip in range((ii*tif.NumberOfStrips()/Chunks),((ii+1)*tif.NumberOfStrips()/Chunks)):
            elem = ReadStrip(strip, arr.ctypes.data + pos, max(size-pos, 0))
            pos = pos + elem

        resized = cv2.resize(arr, (0,0), fx=float(1)/float(ResizeFactor), fy=float(1)/float(ResizeFactor))

        # Now remove the large array to free up Memory for the next chunk
        del arr
        # Finally recombine the individual resized chunks into the final resized image.
        newarr = np.vstack((newarr,resized))

    newarr = np.delete(newarr, (0), axis=0)
    cv2.imwrite('resized.tif', newarr)

您可以嘗試使用“dask”庫:

import dask_image.imread

ds = dask_image.imread.imread('name.tif')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM