Can I save a numpy array as a 16-bit image using “normal” (Enthought) python?

后端 未结 5 1728
抹茶落季
抹茶落季 2020-12-03 12:15

Is there any way to save a numpy array as a 16 bit image (tif, png) using any of the commonly available python packages? This is the only way that I could get to work in the

5条回答
  •  情话喂你
    2020-12-03 12:58

    One alternative is to use pypng. You'll still have to install another package, but it is pure Python, so that should be easy. (There is actually a Cython file in the pypng source, but its use is optional.)

    Here's an example of using pypng to write numpy arrays to PNG:

    import png
    
    import numpy as np
    
    # The following import is just for creating an interesting array
    # of data.  It is not necessary for writing a PNG file with PyPNG.
    from scipy.ndimage import gaussian_filter
    
    
    # Make an image in a numpy array for this demonstration.
    nrows = 240
    ncols = 320
    np.random.seed(12345)
    x = np.random.randn(nrows, ncols, 3)
    
    # y is our floating point demonstration data.
    y = gaussian_filter(x, (16, 16, 0))
    
    # Convert y to 16 bit unsigned integers.
    z = (65535*((y - y.min())/y.ptp())).astype(np.uint16)
    
    # Use pypng to write z as a color PNG.
    with open('foo_color.png', 'wb') as f:
        writer = png.Writer(width=z.shape[1], height=z.shape[0], bitdepth=16)
        # Convert z to the Python list of lists expected by
        # the png writer.
        z2list = z.reshape(-1, z.shape[1]*z.shape[2]).tolist()
        writer.write(f, z2list)
    
    # Here's a grayscale example.
    zgray = z[:, :, 0]
    
    # Use pypng to write zgray as a grayscale PNG.
    with open('foo_gray.png', 'wb') as f:
        writer = png.Writer(width=z.shape[1], height=z.shape[0], bitdepth=16, greyscale=True)
        zgray2list = zgray.tolist()
        writer.write(f, zgray2list)
    

    Here's the color output:

    foo_color.png

    and here's the grayscale output:

    foo_gray.png


    Update: I recently created a github repository for a module called numpngw that provides a function for writing a numpy array to a PNG file. The repository has a setup.py file for installing it as a package, but the essential code is in a single file, numpngw.py, that could be copied to any convenient location. The only dependency of numpngw is numpy.

    Here's a script that generates the same 16 bit images as those shown above:

    import numpy as np
    import numpngw
    
    # The following import is just for creating an interesting array
    # of data.  It is not necessary for writing a PNG file with PyPNG.
    from scipy.ndimage import gaussian_filter
    
    
    # Make an image in a numpy array for this demonstration.
    nrows = 240
    ncols = 320
    np.random.seed(12345)
    x = np.random.randn(nrows, ncols, 3)
    
    # y is our floating point demonstration data.
    y = gaussian_filter(x, (16, 16, 0))
    
    # Convert y to 16 bit unsigned integers.
    z = (65535*((y - y.min())/y.ptp())).astype(np.uint16)
    
    # Use numpngw to write z as a color PNG.
    numpngw.write_png('foo_color.png', z)
    
    # Here's a grayscale example.
    zgray = z[:, :, 0]
    
    # Use numpngw to write zgray as a grayscale PNG.
    numpngw.write_png('foo_gray.png', zgray)
    

提交回复
热议问题