Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import nibabel as nib | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| import matplotlib | |
| matplotlib.use('Agg') | |
| def visualize_nifti(file, volume_idx=0, slice_idx=0): | |
| if file is None: | |
| return None | |
| try: | |
| # Load the NIfTI file | |
| img = nib.load(file.name) | |
| data = img.get_fdata() | |
| shape = data.shape | |
| # Determine if 3D or 4D | |
| if len(shape) == 3: | |
| # 3D data | |
| max_slice = shape[2] - 1 | |
| slice_idx = min(slice_idx, max_slice) | |
| # Extract the axial slice | |
| slice_data = data[:, :, slice_idx] | |
| # Create the plot | |
| fig, ax = plt.subplots(figsize=(8, 8)) | |
| ax.imshow(slice_data.T, cmap='gray', origin='lower') | |
| ax.axis('off') | |
| plt.title(f'Axial Slice: {slice_idx}/{max_slice}') | |
| plt.tight_layout() | |
| return fig | |
| elif len(shape) == 4: | |
| # 4D data | |
| max_volume = shape[3] - 1 | |
| max_slice = shape[2] - 1 | |
| volume_idx = min(volume_idx, max_volume) | |
| slice_idx = min(slice_idx, max_slice) | |
| # Extract the axial slice from the specified volume | |
| slice_data = data[:, :, slice_idx, volume_idx] | |
| # Create the plot | |
| fig, ax = plt.subplots(figsize=(8, 8)) | |
| ax.imshow(slice_data.T, cmap='gray', origin='lower') | |
| ax.axis('off') | |
| plt.title(f'Volume: {volume_idx}/{max_volume}, Slice: {slice_idx}/{max_slice}') | |
| plt.tight_layout() | |
| return fig | |
| else: | |
| return None | |
| except Exception as e: | |
| return None | |
| # Create Gradio interface with Blocks for dynamic controls | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# NIfTI File Visualizer") | |
| gr.Markdown("Upload a NIfTI (.nii or .nii.gz) file to visualize axial slices.") | |
| with gr.Row(): | |
| file_input = gr.File(label="Upload NIfTI file (.nii or .nii.gz)") | |
| with gr.Row(): | |
| volume_slider = gr.Slider(minimum=0, maximum=100, step=1, value=0, label="Volume/Frame (for 4D)") | |
| slice_slider = gr.Slider(minimum=0, maximum=100, step=1, value=0, label="Axial Slice (Z-plane)") | |
| with gr.Row(): | |
| visualize_btn = gr.Button("Visualize") | |
| with gr.Row(): | |
| output_plot = gr.Plot(label="Slice Visualization") | |
| visualize_btn.click( | |
| fn=visualize_nifti, | |
| inputs=[file_input, volume_slider, slice_slider], | |
| outputs=[output_plot] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |