Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Image turns dark after converting

Tags:

python

image

png

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

like image 262
Tareq Mahmud Avatar asked Oct 17 '25 17:10

Tareq Mahmud


1 Answers

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

like image 110
Walter Tross Avatar answered Oct 20 '25 08:10

Walter Tross