import org.itk.simple.*;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
public class DicomSeriesReadModifySeriesWrite {
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.out.println("Usage: DicomSeriesReadModifySeriesWrite <input_directory_with_DICOM_series> <output_directory>");
System.exit(1);
}
String dataDirectory = args[0];
VectorString seriesIDs = ImageSeriesReader.getGDCMSeriesIDs(dataDirectory);
if (seriesIDs.size() == 0) {
System.out.println("ERROR: given directory \"" + dataDirectory + "\" does not contain a DICOM series.");
System.exit(1);
}
VectorString seriesFileNames = ImageSeriesReader.getGDCMSeriesFileNames(dataDirectory, seriesIDs.get(0));
ImageSeriesReader seriesReader = new ImageSeriesReader();
seriesReader.setFileNames(seriesFileNames);
seriesReader.metaDataDictionaryArrayUpdateOn();
seriesReader.loadPrivateTagsOn();
Image image3D = seriesReader.execute();
Image filteredImage = SimpleITK.discreteGaussian(image3D);
ImageFileWriter writer = new ImageFileWriter();
writer.keepOriginalImageUIDOn();
String[] tagsToCopy = {
"0010|0010",
"0010|0020",
"0010|0030",
"0020|000d",
"0020|0010",
"0008|0020",
"0008|0030",
"0008|0050",
"0008|0060"
};
SimpleDateFormat timeFormat = new SimpleDateFormat("HHmmss");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date now = new Date();
String modificationTime = timeFormat.format(now);
String modificationDate = dateFormat.format(now);
VectorDouble direction = filteredImage.getDirection();
List<String[]> seriesTagValues = new ArrayList<>();
for (String tag : tagsToCopy) {
if (seriesReader.hasMetaDataKey(0, tag)) {
seriesTagValues.add(new String[]{tag, seriesReader.getMetaData(0, tag)});
}
}
seriesTagValues.add(new String[]{"0008|0031", modificationTime});
seriesTagValues.add(new String[]{"0008|0021", modificationDate});
seriesTagValues.add(new String[]{"0008|0008", "DERIVED\\SECONDARY"});
seriesTagValues.add(new String[]{"0020|000e", "1.2.826.0.1.3680043.2.1125." + modificationDate + ".1" + modificationTime});
String orientation = String.format("%f\\%f\\%f\\%f\\%f\\%f",
direction.get(0), direction.get(3), direction.get(6),
direction.get(1), direction.get(4), direction.get(7));
seriesTagValues.add(new String[]{"0020|0037", orientation});
String seriesDescription = "";
if (seriesReader.hasMetaDataKey(0, "0008|103e")) {
seriesDescription = seriesReader.getMetaData(0, "0008|103e");
}
seriesDescription += " Processed-SimpleITK";
seriesTagValues.add(new String[]{"0008|103e", seriesDescription});
ExtractImageFilter extractFilter = new ExtractImageFilter();
VectorUInt32 size = filteredImage.getSize();
size.set(2, 1L);
extractFilter.setSize(size);
for (int i = 0; i < filteredImage.getDepth(); i++) {
extractFilter.setIndex(new VectorInt32(new int[]{0, 0, i}));
Image imageSlice = extractFilter.execute(filteredImage);
for (String[] tagValue : seriesTagValues) {
imageSlice.setMetaData(tagValue[0], tagValue[1]);
}
SimpleDateFormat instanceDateFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat instanceTimeFormat = new SimpleDateFormat("HHmmss");
Date instanceNow = new Date();
imageSlice.setMetaData("0008|0012", instanceDateFormat.format(instanceNow));
imageSlice.setMetaData("0008|0013", instanceTimeFormat.format(instanceNow));
VectorDouble position = filteredImage.transformIndexToPhysicalPoint(new VectorInt64(new long[]{0, 0, i}));
StringJoiner posJoiner = new StringJoiner("\\");
for (int j = 0; j < position.size(); j++) {
posJoiner.add(String.valueOf(position.get(j)));
}
imageSlice.setMetaData("0020|0032", posJoiner.toString());
imageSlice.setMetaData("0020|0013", String.valueOf(i));
writer.setFileName(new File(args[1], i + ".dcm").getAbsolutePath());
writer.execute(imageSlice);
}
}
}