Skip to content Skip to sidebar Skip to footer

How To Read A Big Tif File In Python?

I'm loading a tiff file from http://oceancolor.gsfc.nasa.gov/DOCS/DistFromCoast/ from PIL import Image im = Image.open('GMT_intermediate_coast_distance_01d.tif') The data is large

Solution 1:

So far I have tested many alternatives but only gdal worked always even with huge 16bit images.

You can open an image with something like this:

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

Solution 2:

May you dont have too much Ram for this image.You'll need at least some more than 1.3GB free memory.

I don't know what you're doing with the image and you read the entire into your memory but i recommend you to read it bit by bit if its possible to avoid blowing up your computer. You can use Image.getdata() which returns one pixel per time.

Also read some more for Image.open on this link :

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

Solution 3:

I had huge tif files between 1 and 3 GB and managed to finally open them with Image.open() after manually changing the value of MAX_IMAGE_PIXELS inside the Image.py source code to an arbitrarily large number:

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

Solution 4:

For Python 32 bit, version 2.7 you are limited by the number of bytes you can add to the stack at a given time. One option is to read in the image in parts and then resize the individual chunks and reassemble them into a image that requires less RAM.

I recommend using the packages libtiff and opencv for that.

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 inrange(0,Chunks):
        pos = 0
        arr = np.empty((height/Chunks, width), typ)
        size = arr.nbytes
        for strip inrange((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 chunkdel 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)

Post a Comment for "How To Read A Big Tif File In Python?"