Spaces:
No application file
No application file
| # -*- coding: utf-8 -*- | |
| import os | |
| join = os.path.join | |
| import random | |
| import numpy as np | |
| from skimage import io | |
| import SimpleITK as sitk | |
| def dcm2nii(dcm_path, nii_path): | |
| """ | |
| Convert dicom files to nii files | |
| """ | |
| reader = sitk.ImageSeriesReader() | |
| dicom_names = reader.GetGDCMSeriesFileNames(dcm_path) | |
| reader.SetFileNames(dicom_names) | |
| image = reader.Execute() | |
| sitk.WriteImage(image, nii_path) | |
| def mhd2nii(mhd_path, nii_path): | |
| """ | |
| Convert mhd files to nii files | |
| """ | |
| image = sitk.ReadImage(mhd_path) | |
| sitk.WriteImage(image, nii_path) | |
| def nii2nii(nii_path, nii_gz_path): | |
| """ | |
| Convert nii files to nii.gz files, which can reduce the file size | |
| """ | |
| image = sitk.ReadImage(nii_path) | |
| sitk.WriteImage(image, nii_gz_path) | |
| def nrrd2nii(nrrd_path, nii_path): | |
| """ | |
| Convert nrrd files to nii files | |
| """ | |
| image = sitk.ReadImage(nrrd_path) | |
| sitk.WriteImage(image, nii_path) | |
| def jpg2png(jpg_path, png_path): | |
| """ | |
| Convert jpg files to png files | |
| """ | |
| image = io.imread(jpg_path) | |
| io.imsave(png_path, image) | |
| def patchfy(img, mask, outpath, basename): | |
| """ | |
| Patchfy the image and mask into 1024x1024 patches | |
| """ | |
| image_patch_dir = join(outpath, "images") | |
| mask_patch_dir = join(outpath, "labels") | |
| os.makedirs(image_patch_dir, exist_ok=True) | |
| os.makedirs(mask_patch_dir, exist_ok=True) | |
| assert img.shape[:2] == mask.shape | |
| patch_height = 1024 | |
| patch_width = 1024 | |
| img_height, img_width = img.shape[:2] | |
| mask_height, mask_width = mask.shape | |
| if img_height % patch_height != 0: | |
| img = np.pad(img, ((0, patch_height - img_height % patch_height), (0, 0), (0, 0)), mode="constant") | |
| if img_width % patch_width != 0: | |
| img = np.pad(img, ((0, 0), (0, patch_width - img_width % patch_width), (0, 0)), mode="constant") | |
| if mask_height % patch_height != 0: | |
| mask = np.pad(mask, ((0, patch_height - mask_height % patch_height), (0, 0)), mode="constant") | |
| if mask_width % patch_width != 0: | |
| mask = np.pad(mask, ((0, 0), (0, patch_width - mask_width % patch_width)), mode="constant") | |
| assert img.shape[:2] == mask.shape | |
| assert img.shape[0] % patch_height == 0 | |
| assert img.shape[1] % patch_width == 0 | |
| assert mask.shape[0] % patch_height == 0 | |
| assert mask.shape[1] % patch_width == 0 | |
| height_steps = (img_height // patch_height) if img_height % patch_height == 0 else (img_height // patch_height + 1) | |
| width_steps = (img_width // patch_width) if img_width % patch_width == 0 else (img_width // patch_width + 1) | |
| for i in range(height_steps): | |
| for j in range(width_steps): | |
| img_patch = img[i * patch_height:(i + 1) * patch_height, j * patch_width:(j + 1) * patch_width, :] | |
| mask_patch = mask[i * patch_height:(i + 1) * patch_height, j * patch_width:(j + 1) * patch_width] | |
| assert img_patch.shape[:2] == mask_patch.shape | |
| assert img_patch.shape[0] == patch_height | |
| assert img_patch.shape[1] == patch_width | |
| print(f"img_patch.shape: {img_patch.shape}, mask_patch.shape: {mask_patch.shape}") | |
| img_patch_path = join(image_patch_dir, f"{basename}_{i}_{j}.png") | |
| mask_patch_path = join(mask_patch_dir, f"{basename}_{i}_{j}.png") | |
| io.imsave(img_patch_path, img_patch) | |
| io.imsave(mask_patch_path, mask_patch) | |
| def rle_decode(mask_rle, img_shape): | |
| """ | |
| #functions to convert encoding to mask and mask to encoding | |
| mask_rle: run-length as string formated (start length) | |
| shape: (height,width) of array to return | |
| Returns numpy array, 1 - mask, 0 - background | |
| """ | |
| seq = mask_rle.split() | |
| starts = np.array(list(map(int, seq[0::2]))) | |
| lengths = np.array(list(map(int, seq[1::2]))) | |
| assert len(starts) == len(lengths) | |
| ends = starts + lengths | |
| img = np.zeros((np.product(img_shape),), dtype=np.uint8) | |
| for begin, end in zip(starts, ends): | |
| img[begin:end] = 255 | |
| # https://stackoverflow.com/a/46574906/4521646 | |
| img.shape = img_shape | |
| return img.T |