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)
50 int((original_size[1] - 1) * original_spacing[1] / new_spacing[1]),
56 interpolator=sitk.sitkLinear,
57 outputOrigin=image.GetOrigin(),
58 outputSpacing=new_spacing,
59 outputDirection=image.GetDirection(),
61 outputPixelType=image.GetPixelID(),
69 if image.GetNumberOfComponentsPerPixel() == 1:
71 if image_file_reader.GetMetaData(
"0028|0004").strip() ==
"MONOCHROME1":
80 def convert_images(input_file_names, output_file_names, new_width):
82 with multiprocessing.Pool(processes=MAX_PROCESSES)
as pool:
84 functools.partial(convert_image, new_width=new_width),
85 zip(input_file_names, output_file_names),
89 def positive_int(int_str):
92 raise argparse.ArgumentTypeError(int_str +
" is not a positive integer value")
96 def directory(dir_name):
97 if not os.path.isdir(dir_name):
98 raise argparse.ArgumentTypeError(dir_name +
" is not a valid directory name")
103 parser = argparse.ArgumentParser(
104 description=
"Convert and resize DICOM files to common image types."
107 "root_of_data_directory",
109 help=
"Path to the topmost directory containing data.",
112 "output_file_extension",
113 help=
"Image file extension, this determines output file type " "(e.g. png) .",
115 parser.add_argument(
"--w", type=positive_int, help=
"Width of converted images.")
116 parser.add_argument(
"--od", type=directory, help=
"Output directory.")
117 args = parser.parse_args(argv)
119 input_file_names = []
120 for dir_name, subdir_names, file_names
in os.walk(args.root_of_data_directory):
121 input_file_names += [
122 os.path.join(os.path.abspath(dir_name), fname)
for fname
in file_names
128 os.path.join(os.path.abspath(args.od), str(i))
129 for i
in range(len(input_file_names))
132 file_names = input_file_names
133 output_file_names = [
134 file_name +
"." + args.output_file_extension
for file_name
in file_names
137 res = convert_images(input_file_names, output_file_names, args.w)
138 input_file_names = list(itertools.compress(input_file_names, res))
139 output_file_names = list(itertools.compress(output_file_names, res))
144 dir_name = args.od
if args.od
else os.getcwd()
145 with open(os.path.join(dir_name,
"file_names.csv"), mode=
"w")
as fp:
146 fp_writer = csv.writer(
147 fp, delimiter=
",", quotechar=
'"', quoting=csv.QUOTE_MINIMAL
149 fp_writer.writerow([
"input file name",
"output file name"])
150 for data
in zip(input_file_names, output_file_names):
151 fp_writer.writerow(data)
154 if __name__ ==
"__main__":