#include <iostream>
#include <vector>
#include <string>
#include <chrono>
#include <iomanip>
#include <sstream>
int
main(int argc, char * argv[])
{
if (argc < 3)
{
std::cout << "Usage: " << argv[0] << " <input_directory_with_DICOM_series> <output_directory>" << std::endl;
return 1;
}
std::string dataDirectory = argv[1];
if (seriesIDs.empty())
{
std::cout << "ERROR: given directory \"" << dataDirectory << "\" does not contain a DICOM series." << std::endl;
return 1;
}
std::vector<std::string> seriesFileNames =
std::vector<std::string> tagsToCopy = {
"0010|0010",
"0010|0020",
"0010|0030",
"0020|000d",
"0020|0010",
"0008|0020",
"0008|0030",
"0008|0050",
"0008|0060"
};
auto now = std::chrono::system_clock::now();
auto time_t = std::chrono::system_clock::to_time_t(now);
std::tm tm = *std::localtime(&time_t);
std::ostringstream modificationTimeStream, modificationDateStream;
modificationDateStream << std::put_time(&tm, "%Y%m%d");
modificationTimeStream << std::put_time(&tm, "%H%M%S");
std::string modificationTime = modificationTimeStream.str();
std::string modificationDate = modificationDateStream.str();
std::vector<double> direction = filteredImage.
GetDirection();
std::vector<std::pair<std::string, std::string>> seriesTagValues;
for (const auto & tag : tagsToCopy)
{
{
seriesTagValues.push_back({ tag, seriesReader.
GetMetaData(0, tag) });
}
}
seriesTagValues.insert(
seriesTagValues.end(),
{
{ "0008|0031", modificationTime },
{ "0008|0021", modificationDate },
{ "0008|0008", "DERIVED\\SECONDARY" },
{ "0020|000e",
"1.2.826.0.1.3680043.2.1125." + modificationDate + ".1" + modificationTime },
});
std::ostringstream orientationStream;
orientationStream << direction[0] << "\\" << direction[3] << "\\" << direction[6] << "\\" << direction[1] << "\\"
<< direction[4] << "\\" << direction[7];
seriesTagValues.push_back({ "0020|0037", orientationStream.str() });
std::string seriesDescription;
if (seriesReader.HasMetaDataKey(0, "0008|103e"))
{
seriesDescription = seriesReader.GetMetaData(0, "0008|103e");
}
seriesDescription += " Processed-SimpleITK";
seriesTagValues.push_back({ "0008|103e", seriesDescription });
std::vector<unsigned int> size = filteredImage.
GetSize();
size[2] = 1;
for (int i = 0; i < (int)filteredImage.GetDepth(); ++i)
{
auto imageSlice = extractFilter.
Execute(filteredImage);
for (const auto & tagValue : seriesTagValues)
{
imageSlice.SetMetaData(tagValue.first, tagValue.second);
}
auto sliceNow = std::chrono::system_clock::now();
auto sliceTime_t = std::chrono::system_clock::to_time_t(sliceNow);
std::tm sliceTm = *std::localtime(&sliceTime_t);
std::ostringstream instanceDateStream, instanceTimeStream;
instanceDateStream << std::put_time(&sliceTm, "%Y%m%d");
instanceTimeStream << std::put_time(&sliceTm, "%H%M%S");
imageSlice.SetMetaData("0008|0012", instanceDateStream.str());
imageSlice.SetMetaData("0008|0013", instanceTimeStream.str());
std::vector<double> position = filteredImage.TransformIndexToPhysicalPoint({ 0, 0, i });
std::ostringstream posStream;
for (size_t j = 0; j < position.size(); ++j)
{
if (j > 0)
posStream << "\\";
posStream << position[j];
}
imageSlice.SetMetaData("0020|0032", posStream.str());
imageSlice.SetMetaData("0020|0013", std::to_string(i));
std::string outPath = std::string(argv[2]) + "/" + std::to_string(i) + ".dcm";
writer.SetFileName(outPath);
writer.Execute(imageSlice);
}
return 0;
}
Write out a SimpleITK image to the specified file location.
void KeepOriginalImageUIDOn()
Set/Get name of ImageIO to use.
virtual void LoadPrivateTagsOn()
Set/Get loading private DICOM tags into Image's MetaData.
Read series of image files into a SimpleITK image.
bool HasMetaDataKey(unsigned int slice, const std::string &key) const
Query a meta-data dictionary for the existence of a key.
static std::vector< std::string > GetGDCMSeriesIDs(const PathType &directory, bool useSeriesDetails=false)
Get all the seriesIDs from a DICOM data set.
void MetaDataDictionaryArrayUpdateOn()
std::string GetMetaData(unsigned int slice, const std::string &key) const
Get the value of a meta-data dictionary entry as a string.
void SetFileNames(const std::vector< PathType > &fileNames)
static std::vector< PathType > GetGDCMSeriesFileNames(const PathType &directory, const std::string &seriesID="", bool useSeriesDetails=false, bool recursive=false, bool loadSequences=false)
Generate a sequence of filenames from a directory with a DICOM data set and a series ID.
The Image class for SimpleITK.
std::vector< double > GetDirection() const
Set/Get the Direction.
SITKBasicFilters_EXPORT Image DiscreteGaussian(const Image &image1, double variance, unsigned int maximumKernelWidth=32u, double maximumError=0.01, bool useImageSpacing=true)
Blurs an image by separable convolution with discrete gaussian kernels. This filter performs Gaussian...