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]
 
Thread 'Is this public key encryption?'
I've tried to intuit public key encryption but never quite managed. But this seems to wrap it up in a bow. This seems to be a very elegant way of transmitting a message publicly that only the sender and receiver can decipher. Is this how PKE works? No, it cant be. In the above case, the requester knows the target's "secret" key - because they have his ID, and therefore knows his birthdate.
Thread 'Project Documentation'
Trying to package up a small bank account manager project that I have been tempering on for a while. One that is certainly worth something to me. Although I have created methods to whip up quick documents with all fields and properties. I would like something better to reference in order to express the mechanical functions. It is unclear to me about any standardized format for code documentation that exists. I have tried object orientated diagrams with shapes to try and express the...

Similar threads

Back
Top