aaa_web_app / app.py
Adrit Rao
Add application file
18285c1
raw
history blame
2.08 kB
import streamlit as st
import pydicom
import matplotlib.pyplot as plt
import zipfile
import os
# Streamlit app title
st.title("DICOM Image Viewer")
# Upload a ZIP file containing DICOMs
uploaded_zip = st.file_uploader("Upload a ZIP file containing DICOMs", type=["zip"])
# Initialize variables for DICOM data and image list
dicom_images = []
num_slices = 0
error_message = ""
if uploaded_zip is not None:
# Unzip the uploaded ZIP file and extract DICOMs
with zipfile.ZipFile(uploaded_zip, "r") as zip_ref:
zip_ref.extractall("temp_zip_folder")
# Get a list of DICOM files
dicom_files = [f for f in os.listdir("temp_zip_folder") if f.lower().endswith(".dcm")]
num_slices = len(dicom_files)
# Initialize a list to store successfully processed DICOMs
processed_dicoms = []
# Process DICOM files and skip problematic ones
for dicom_file in dicom_files:
try:
dicom_data = pydicom.dcmread(f"temp_zip_folder/{dicom_file}")
dicom_images.append(dicom_data.pixel_array)
processed_dicoms.append(dicom_data)
except Exception as e:
error_message += f"Skipping problematic DICOM ({dicom_file}): {str(e)}\n"
# User selects the slice using a slider
selected_slice = st.slider("Select a DICOM slice", 0, len(processed_dicoms) - 1)
if selected_slice < len(processed_dicoms):
# Display the selected DICOM image
plt.imshow(dicom_images[selected_slice], cmap=plt.cm.bone)
plt.axis("off")
plt.title(f"DICOM Image - Slice {selected_slice + 1}/{len(processed_dicoms)}")
plt.tight_layout()
# Show the image in the Streamlit app
st.pyplot(plt)
else:
error_message += "No DICOM slices available for the selected slice number."
# Remove the temporary folder and its contents
for dicom_file in dicom_files:
os.remove(f"temp_zip_folder/{dicom_file}")
os.rmdir("temp_zip_folder")
st.write("Upload a ZIP file containing DICOMs to view and scroll through the slices.")
st.write(error_message)