How to resize and save a slice from a nii file as a PNG image in Python?

  • Python
  • Thread starter BRN
  • Start date
  • Tags
    File
In summary, I solved the problem by cropping the image with the 'Mathshow ()' function and saving it in the correct size.
  • #1
BRN
108
10
Hello everyone,

I have to extract a slice from a nii files and resize it with dimensions 256x256. Once this is done, I have to save it as a PNG image.

This is my code:

slice from nii file:
def img_from_nii(height, width, n_slice, label,  in_path, temp_path):
    
    filenames = os.listdir(in_path)
    
    for i in range(len(filenames)):
        mri_file = in_path + filenames[i]
        img_data = nib.load(mri_file).get_fdata()
        img_data = np.transpose(img_data, (2, 1, 0))
        slice_2D = Image.fromarray(img_data[:, :, n_slice]).resize((height, width))
        
        resized_slice = plt.matshow(slice_2D, cmap = 'gray', fignum = 0)
        plt.axis('off')
        plt.gca().set_axis_off()
        plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, hspace = 0, wspace = 0)
        plt.margins(0, 0)
        
        plt.savefig(temp_path + label + '_ADNI_' + 'slc' + str(n_slice) + '_' + str(i + 1) + '.png')
        plt.close()
    
    print('dataset done!')

The problem is that PNG files are correctly created, but if you check the image size I do not get 256x256. How is it possible?

check size:
im = Image.open('./outputs/ADNI_png_temp/P_ADNI_slc150_3.png')

width, height = im.size

print('width:', width)
print('height:', height)

outputs:
width: 432
height: 288

How can I solve?

Thanks.
 
Technology news on Phys.org
  • #2
Have you looked at the images in Paint or something? From memory savefig pads the images the same way show() does.

Doesn't the Image class have a save method? Have you tried that?
 
  • #3
If as Image class you mean that of Pillow, yes there is the save method, but it does not support 32-bit images and I lose quality.

By opening the image with any reader, I see the image in the correct size 256x256, but I also have two completely empty side bands.

I believe that the save method of Matplotlib does not provide for the cropping.
 
  • #4
Oops! I forgot to update this post ...:-p

The problem was given by the 'Mathshow ()' function that adds additional spaces around the figure even if the axes are hidden.

I solved this way:
slice from nii file ok:
def img_from_nii(height, width, n_slice, label,  in_path, temp_path):
    
    filenames = os.listdir(in_path)
    
    for i in range(len(filenames)):
        mri_file = in_path + filenames[i]
        img_data = nib.load(mri_file).get_fdata()
        img_data = np.transpose(img_data, (2, 1, 0))
        slice_2D = Image.fromarray(img_data[:, :, n_slice]).resize((height, width), resample = Image.Resampling.LANCZOS)

        plt.imsave(temp_path + label + '_ADNI_' + 'slc' + str(n_slice) + '_' + str(i + 1) + '.png', slice_2D)
        
        plt.close()
    
    print('ADNI ' + label + ' dataset done!')
 

Similar threads

  • Programming and Computer Science
Replies
3
Views
1K
  • Programming and Computer Science
Replies
1
Views
1K
  • Programming and Computer Science
Replies
1
Views
4K
Back
Top