Skip to content

Instantly share code, notes, and snippets.

@pangyuteng
Last active April 11, 2025 18:44
Show Gist options
  • Save pangyuteng/11dcea5fcd54986c2d4a39f566d0f65a to your computer and use it in GitHub Desktop.
Save pangyuteng/11dcea5fcd54986c2d4a39f566d0f65a to your computer and use it in GitHub Desktop.
sample ugly csv to nifti
import time
import sys
import pandas as pd
import numpy as np
import SimpleITK as sitk
def foobar_np(source_nifti_file,source_csv_file,target_nifti_file):
df = pd.read_csv(source_csv_file) # columns,x,y,z,foo
source_obj = sitk.ReadImage(source_nifti_file)
source = sitk.GetArrayFromImage(source_obj)
arr = np.zeros_like(source)
multi_index = df.apply(lambda row: [int(row.z),int(row.y),int(row.x)], axis=1)
multi_index = np.array(multi_index.to_list()).T
ind = np.ravel_multi_index(multi_index, arr.shape)
v = df.apply(lambda row: [row.foo], axis=1).to_list()
np.put(arr,ind,v)
target_obj = sitk.GetImageFromArray(arr)
target_obj.CopyInformation(source_obj)
sitk.WriteImage(target_obj,target_nifti_file)
# confirm values are same
target = sitk.GetArrayFromImage(target_obj)
print(np.mean(np.abs(target-source)))
def foobar_itk(source_nifti_file,source_csv_file,target_nifti_file):
df = pd.read_csv(source_csv_file) # columns,x,y,z,foo
foo_series = df.apply(lambda row: [int(row.x),int(row.y),int(row.z),row.foo], axis=1)
source_obj = sitk.ReadImage(source_nifti_file)
arr = np.zeros_like(sitk.GetArrayFromImage(source_obj))
target_obj = sitk.GetImageFromArray(arr)
for item in foo_series:
target_obj.SetPixel(*item)
target_obj.CopyInformation(source_obj)
sitk.WriteImage(target_obj,target_nifti_file)
# confirm values are same
target = sitk.GetArrayFromImage(target_obj)
source = sitk.GetArrayFromImage(source_obj)
print(np.mean(np.abs(target-source)))
def gen_mock_data():
foo = np.round(np.random.rand(16,16,16),2)
z,y,x = np.indices(foo.shape) # NOTE the ordering between numpy vs SimpleITK
df=pd.DataFrame()
df['x']=pd.Series(x.ravel())
df['y']=pd.Series(y.ravel())
df['z']=pd.Series(z.ravel())
df['foo']=pd.Series(foo.ravel())
df.to_csv("foo.csv",index=False)
foo_obj = sitk.GetImageFromArray(foo)
sitk.WriteImage(foo_obj,'foo.nii.gz')
if __name__ == "__main__":
gen_mock_data()
template_nifti_file = sys.argv[1]
source_csv_file = sys.argv[2]
target_nifti_file = sys.argv[3]
s=time.time()
foobar_itk(template_nifti_file,source_csv_file,target_nifti_file)
e=time.time()
print(e-s)
s=time.time()
foobar_np(template_nifti_file,source_csv_file,target_nifti_file)
e=time.time()
print(e-s)
"""
docker run -it -u $(id -u):$(id -g) \
-w $PWD -v $PWD:$PWD \
pangyuteng/dcm:latest bash
python csv2nifti.py foo.nii.gz foo.csv bar.nii.gz
"""
import sys
import SimpleITK as sitk
original_image_file = sys.argv[1]
original_mask_file = sys.argv[2]
cropped_image_file = sys.argv[3]
cropped_mask_file = sys.argv[4]
img_obj = sitk.ReadImage(original_image_file)
mask_obj = sitk.ReadImage(original_mask_file)
lower_threshold, upper_threshold = 1,2
inside_val, outside_val = 1,0
roi_obj = sitk.BinaryThreshold( mask_obj, lower_threshold, upper_threshold, inside_val, outside_val)
print("mask_obj")
print("GetSize",mask_obj.GetSize())
print("GetSpacing",mask_obj.GetSpacing())
print("GetDirection",mask_obj.GetDirection())
print("GetOrigin",mask_obj.GetOrigin())
label_shape_filter = sitk.LabelShapeStatisticsImageFilter()
label_shape_filter.Execute(roi_obj)
bounding_box = label_shape_filter.GetBoundingBox(1)
cropped_size = bounding_box[int(len(bounding_box)/2):]
cropped_start = bounding_box[0:int(len(bounding_box)/2)]
cropped_img_obj = sitk.RegionOfInterest(img_obj,cropped_size,cropped_start)
cropped_mask_obj = sitk.RegionOfInterest(mask_obj,cropped_size,cropped_start)
print("cropped_mask_obj")
print("GetSize",cropped_mask_obj.GetSize())
print("GetSpacing",cropped_mask_obj.GetSpacing())
print("GetDirection",cropped_mask_obj.GetDirection())
print("GetOrigin",cropped_mask_obj.GetOrigin())
sitk.WriteImage(cropped_img_obj,cropped_image_file)
sitk.WriteImage(cropped_mask_obj,cropped_mask_file)
"""
for binary thresholding you can use:
+ `binary_obj = mask_obj > 0`
+ BinaryThreshold
+ or ConnectedThresholdImageFilter https://stackoverflow.com/a/76256678/868736
"""
"""
python sample_crop.py tmp/img.nii.gz tmp/mask.nii.gz tmp/cropped_img.nii.gz tmp/cropped_mask.nii.gz
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment