23 import multiprocessing
27 import SimpleITK
as sitk
30 def convert_image(input_file_name, output_file_name, new_width=None):
34 image_file_reader.SetImageIO(
"GDCMImageIO")
35 image_file_reader.SetFileName(input_file_name)
36 image_file_reader.ReadImageInformation()
37 image_size = list(image_file_reader.GetSize())
38 if len(image_size) == 3
and image_size[2] == 1:
40 image_file_reader.SetExtractSize(image_size)
41 image = image_file_reader.Execute()
43 original_size = image.GetSize()
44 original_spacing = image.GetSpacing()
46 (original_size[0] - 1) * original_spacing[0] / (new_width - 1)
51 (original_size[1] - 1)
60 interpolator=sitk.sitkLinear,
61 outputOrigin=image.GetOrigin(),
62 outputSpacing=new_spacing,
63 outputDirection=image.GetDirection(),
65 outputPixelType=image.GetPixelID(),
73 if image.GetNumberOfComponentsPerPixel() == 1:
76 image_file_reader.GetMetaData(
"0028|0004").strip()
87 def convert_images(input_file_names, output_file_names, new_width):
89 with multiprocessing.Pool(processes=MAX_PROCESSES)
as pool:
91 functools.partial(convert_image, new_width=new_width),
92 zip(input_file_names, output_file_names),
96 def positive_int(int_str):
99 raise argparse.ArgumentTypeError(
100 int_str +
" is not a positive integer value"
105 def directory(dir_name):
106 if not os.path.isdir(dir_name):
107 raise argparse.ArgumentTypeError(
108 dir_name +
" is not a valid directory name"
114 parser = argparse.ArgumentParser(
115 description=
"Convert and resize DICOM files to common image types."
118 "root_of_data_directory",
120 help=
"Path to the topmost directory containing data.",
123 "output_file_extension",
124 help=
"Image file extension, this determines output file type "
128 "--w", type=positive_int, help=
"Width of converted images."
130 parser.add_argument(
"--od", type=directory, help=
"Output directory.")
131 args = parser.parse_args(argv)
133 input_file_names = []
134 for dir_name, subdir_names, file_names
in os.walk(
135 args.root_of_data_directory
137 input_file_names += [
138 os.path.join(os.path.abspath(dir_name), fname)
139 for fname
in file_names
145 os.path.join(os.path.abspath(args.od), str(i))
146 for i
in range(len(input_file_names))
149 file_names = input_file_names
150 output_file_names = [
151 file_name +
"." + args.output_file_extension
152 for file_name
in file_names
155 res = convert_images(input_file_names, output_file_names, args.w)
156 input_file_names = list(itertools.compress(input_file_names, res))
157 output_file_names = list(itertools.compress(output_file_names, res))
162 dir_name = args.od
if args.od
else os.getcwd()
163 with open(os.path.join(dir_name,
"file_names.csv"), mode=
"w")
as fp:
164 fp_writer = csv.writer(
165 fp, delimiter=
",", quotechar=
'"', quoting=csv.QUOTE_MINIMAL
167 fp_writer.writerow([
"input file name",
"output file name"])
168 for data
in zip(input_file_names, output_file_names):
169 fp_writer.writerow(data)
172 if __name__ ==
"__main__":