black pixels when save MRI dicom after applying lut

88 Views Asked by At

I'm trying to apply LUT to MR images using following codes. the original dicom pixel intensities ranges from 0 to 4334 and the pixel intensities after applying LUT function ranges from 0 to 254. I need to preserve the metadata info for the resulted image. When I plot the resulted image, it displays correct but when I save the image, it is all black pixels. I know I need to change some meta data tags but I'm new to dicom image processing and couldn't figure out what is causing the problem.

def make_lut(dcm_data, width, center, p_i):
"""
LUT: look-up tables
VOI: volume of interest
"""
slope= 1.0
intercept= 0.0
min_px= int(np.amin(dcm_data))
max_px= int(np.amax(dcm_data))
lut= [0] * (max_px + 1)
invert= False
if p_i == "MONOCHROME1":
    invert= True
else:
    center = (max_px - min_px) - center
for px_value in range(min_px, max_px):
    lut_value = px_value * slope + intercept
    voi_value= (((lut_value - center) / width + 0.5) * 255.0)
    clamped_value= min(max(voi_value, 0), 255)
    if invert: 
        lut[px_value] = round(255 - clamped_value)
    else:
        lut[px_value] = round(clamped_value)
return lut

def apply_lut(pixels_in, lut):
pixels= pixels_in.flatten()
pixels_out= [0] * len(pixels)
for i in range (0, len(pixels)):
    pixel= pixels[i]
    if pixel > 0:
        pixels_out[i] = int(lut[pixel])
return np.reshape(pixels_out, (pixels_in.shape[0], pixels_in.shape[1]))

# apply the function
idx= 30
ds= pydicom.dcmread(dcm_files[idx])
raw_pixels= dcm_data.pixel_array
if dcm_data.WindowWidth != '' and dcm_data.WindowCenter != '':
    window_width = dcm_data.WindowWidth
    window_center = dcm_data.WindowCenter

lut = make_lut(raw_pixels, window_width, window_center, dcm_data.PhotometricInterpretation)
dcm_default_windowing = apply_lut(raw_pixels, lut)

# save the result
ds.PixelData = dcm_default_windowing.tobytes()
ds.save_as("test_luted.dcm")
0

There are 0 best solutions below