Search code examples
imagepython-imaging-librarytiff

Pillow: converting a TIFF from greyscale 16 bit to 8 bit results in fully white image


I know that there are multiple similar questions on SO, but I have tried multiple proposed solutions to no avail.

I have the following TIFF image that opens in Pillow as type='I;16'.

Google Drive link

Based on this SO question, I wrote this code to convert it:

def tiff_force_8bit(image, **kwargs):
    if image.format == 'TIFF' and image.mode == 'I;16':
        array = np.array(image)
        normalized = (array.astype(np.uint16) - array.min()) * 255.0 / (array.max() - array.min())
        image = Image.fromarray(normalized.astype(np.uint8))

    return image

However, the result is a completely white image.

I have tried other solutions too, such as this:

table = [i/256 for i in range(65536)]
image = image.point(table, 'L')

with the same result: full white out.

Can anyone shed some light? Thanks!


Solution

  • There's nothing wrong with your code. If you run:

    # Open image
    im = Image.open('NGC 281 11-01-2021 Ha 1.15.tif')
    
    # Force to 8-bit
    res = tiff_force_8bit(im)
    
    # Check min and max of result
    res.getextrema()                           # prints (0,255) as expected
    
    # Save as PNG
    res.save('result.png')
    
    # Display it
    res.show()
    

    I can only guess there is a problem with your installation or the way you display the result.

    enter image description here