Search code examples
pythonimagepng

Image turns dark after converting


I am working with a dataset that contains .mha files. I want to convert these files to either png/tiff for some work. I am using the Medpy library for converting.

image_data, image_header = load('image_path/c0001.mha')

from medpy.io import  save
save(image_data, 'image_save_path/new_image.png', image_header)

I can actually convert the image into png/tiff format, but the converted image turns dark after the conversion. I am attaching the screenshot below. How can I convert the images successfully?

enter image description here enter image description here


Solution

  • Your data is clearly limited to 12 bits (white is 2**12-1, i.e., 4095), while a PNG image in this context is 16 bits (white is 2**16-1, i.e., 65535). For this reason your PNG image is so dark that it appears almost black (but if you look closely it isn't).

    The most precise transformation you can apply is the following:

    import numpy as np
    from medpy.io import load, save
    
    def convert_to_uint16(data, source_max):
        target_max = 65535  # 2 ** 16 - 1
        # build a linear lookup table (LUT) indexed from 0 to source_max
        source_range = np.arange(source_max + 1)
        lut = np.round(source_range * target_max / source_max).astype(np.uint16)
        # apply it
        return lut[data]
    
    image_data, image_header = load('c0001.mha')
    new_image_data = convert_to_uint16(image_data, 4095)  # 2 ** 12 - 1
    save(new_image_data, 'new_image.png', image_header)
    

    Output: sample image converted to PNG

    N.B.: new_image_data = image_data * 16 corresponds to replacing 65535 with 65520 (4095 * 16) in convert_to_uint16