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

  • Thread starter Thread starter BRN
  • Start date Start date
  • Tags Tags
    File
AI Thread Summary
The discussion centers around extracting a slice from NIfTI (.nii) files, resizing it to 256x256 pixels, and saving it as a PNG image using Python. The initial code correctly generates PNG files but results in images that are not the expected dimensions, showing additional empty space around the images. The issue was identified as stemming from the use of the `matshow()` function in Matplotlib, which adds padding even when axes are hidden. The solution involved switching to the `imsave()` function, which properly saves the resized image without extra padding. The updated code successfully generates PNG images in the desired size of 256x256 pixels.
BRN
Messages
107
Reaction score
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:

[CODE lang="python" title="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
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!')[/CODE]

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?

[CODE lang="python" title="check size"]
im = Image.open('./outputs/ADNI_png_temp/P_ADNI_slc150_3.png')

width, height = im.size

print('width:', width)
print('height:', height)[/CODE]

[CODE title="outputs"]
width: 432
height: 288
[/CODE]

How can I solve?

Thanks.
 
Technology news on Phys.org
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?
 
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.
 
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:
[CODE lang="python" title="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
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!')[/CODE]
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
hi; i purchased 3 of these, AZDelivery 3 x AZ-MEGA2560-Board Bundle with Prototype Shield and each is reporting the error message below. I have triple checked every aspect of the set up and all seems in order, cable devices port, board reburn bootloader et al . I have substituted an arduino uno and it works fine; could you help please Thanks Martyn 'avrdude: ser_open(): can't set com-state for "\\.\COM3"avrdude: ser_drain(): read error: The handle is invalid.avrdude: ser_send(): write...

Similar threads

Back
Top