Last active
April 11, 2025 18:44
-
-
Save pangyuteng/11dcea5fcd54986c2d4a39f566d0f65a to your computer and use it in GitHub Desktop.
sample ugly csv to nifti
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
""" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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