sdk/python/foundation-models/healthcare-ai/medimageinsight/classification_demo/demo_utils.py (67 lines of code) (raw):

import os import base64 from PIL import Image from tqdm import tqdm import io import numpy as np import SimpleITK as sitk def read_image(image_path): with open(image_path, "rb") as f: return f.read() def read_dcm(dicom_path): # Read the DICOM file reader = sitk.ImageFileReader() reader.SetFileName(dicom_path) dicom = reader.Execute() # Extract the pixel array img_array = sitk.GetArrayFromImage(dicom)[0, :, :] # Normalize the pixel values to the range [0, 255] img_array = img_array.astype(np.float32) img_array = ( (img_array - np.min(img_array)) / (np.max(img_array) - np.min(img_array)) * 255.0 ) img_array = img_array.astype(np.uint8) # Convert the pixel array to a PIL Image image = Image.fromarray(img_array) # Save the image to a BytesIO object image_bytes = io.BytesIO() image.save(image_bytes, format="PNG") image_bytes = image_bytes.getvalue() return image_bytes def get_files_path(root_folder): print("--------Start Loading Image Files--------") files_data = {} for _, (folder, _, images) in enumerate(os.walk(root_folder)): for count, image_file in tqdm(enumerate(images), total=len(images)): file_path = os.path.join(folder, image_file) if file_path.lower().endswith((".png", ".jpg", ".jpeg")): file_content = base64.encodebytes(read_image(file_path)).decode("utf-8") elif file_path.lower().endswith(".dcm"): file_content = base64.b64encode(read_dcm(file_path)).decode("utf-8") else: continue # Skip non-image files files_data[image_file] = {"file": file_content, "text": "", "index": count} return files_data def get_text(texts): print("--------Start Loading Text--------") text_data = {} for count, text in tqdm(enumerate(texts), total=len(texts)): text_data[text] = {"file": "", "text": text, "index": count} return text_data ## Normalization Example Here def normalize_volume(volume): volume[volume < -1000] = -1000 volume[volume > 1000] = 1000 normalized_volume = (volume + 1000) / 2000 normalized_volume = ( (normalized_volume - normalized_volume.min()) * 255.0 / (normalized_volume.max() - normalized_volume.min()) ) return normalized_volume def convert_volume_to_slices(volume, output_dir, filename_prefix): for i in range(volume.shape[2]): slice_img = volume[:, :, i] slice_img = slice_img.astype(np.uint8) slice_img = ( Image.fromarray(slice_img) .transpose(Image.ROTATE_90) .transpose(Image.FLIP_LEFT_RIGHT) ) slice_img.save(os.path.join(output_dir, f"{filename_prefix}_slice{i}.png"))