#include <iostream>
int
main(int argc, char * argv[])
{
if (argc < 3)
{
std::cerr << "Usage: " << argv[0]
<< " NrrdFileName(.nhdr) threshold(on B0)"
<< " FAImageFileName RelativeAnisotropyFileName "
<< "[ExtractGradientAndReferenceImage from the NRRD file and "
<< "write them as images]" << std::endl;
std::cerr << "\tExample args: xt_dwi.nhdr 80 FA.mhd 1" << std::endl;
return EXIT_FAILURE;
}
unsigned int numberOfImages = 0;
unsigned int numberOfGradientImages = 0;
bool readb0 = false;
double b0 = 0;
using PixelType = unsigned short;
ImageType::Pointer img;
reader->SetFileName(argv[1]);
try
{
reader->Update();
img = reader->GetOutput();
}
catch (const itk::ExceptionObject & ex)
{
std::cout << ex << std::endl;
return EXIT_FAILURE;
}
using TensorReconstructionImageFilterType = itk::
DiffusionTensor3DReconstructionImageFilter<PixelType, PixelType, double>;
std::vector<std::string> imgMetaKeys = imgMetaDictionary.
GetKeys();
std::vector<std::string>::const_iterator itKey = imgMetaKeys.begin();
std::string metaString;
TensorReconstructionImageFilterType::GradientDirectionType vect3d;
TensorReconstructionImageFilterType::GradientDirectionContainerType::Pointer
DiffusionVectors = TensorReconstructionImageFilterType::
GradientDirectionContainerType::New();
for (; itKey != imgMetaKeys.end(); ++itKey)
{
double x, y, z;
itk::ExposeMetaData<std::string>(imgMetaDictionary, *itKey, metaString);
if (itKey->find("DWMRI_gradient") != std::string::npos)
{
std::cout << *itKey << " ---> " << metaString << std::endl;
sscanf(metaString.c_str(), "%lf %lf %lf\n", &x, &y, &z);
vect3d[0] = x;
vect3d[1] = y;
vect3d[2] = z;
DiffusionVectors->InsertElement(numberOfImages, vect3d);
++numberOfImages;
if (vect3d[0] == 0.0 && vect3d[1] == 0.0 && vect3d[2] == 0.0)
{
continue;
}
++numberOfGradientImages;
}
else if (itKey->find("DWMRI_b-value") != std::string::npos)
{
std::cout << *itKey << " ---> " << metaString << std::endl;
readb0 = true;
b0 = std::stod(metaString.c_str());
}
}
std::cout << "Number of gradient images: " << numberOfGradientImages
<< " and Number of reference images: "
<< numberOfImages - numberOfGradientImages << std::endl;
if (!readb0)
{
std::cerr << "BValue not specified in header file" << std::endl;
return EXIT_FAILURE;
}
using GradientImageType = ReferenceImageType;
std::vector<GradientImageType::Pointer> imageContainer;
DWIIteratorType dwiit(img, img->GetBufferedRegion());
for (unsigned int i = 0; i < numberOfImages; i++)
{
GradientImageType::Pointer image = GradientImageType::New();
image->CopyInformation(img);
image->SetBufferedRegion(img->GetBufferedRegion());
image->SetRequestedRegion(img->GetRequestedRegion());
image->Allocate();
IteratorType it(image, image->GetBufferedRegion());
dwiit.GoToBegin();
it.GoToBegin();
while (!it.IsAtEnd())
{
it.Set(dwiit.Get()[i]);
++it;
++dwiit;
}
imageContainer.push_back(image);
}
if ((argc > 4) && (std::stoi(argv[6])))
{
unsigned int referenceImageIndex = 0;
for (unsigned int i = 0; i < numberOfImages; i++)
{
GradientWriterType::Pointer gradientWriter = GradientWriterType::New();
gradientWriter->SetInput(imageContainer[i]);
char filename[100];
if (DiffusionVectors->ElementAt(i).two_norm() <=
0.0)
{
std::string fn("ReferenceImage%d.mhd");
sprintf(filename, fn.c_str(), referenceImageIndex);
++referenceImageIndex;
}
else
{
std::string fn("Gradient%d.mhd");
sprintf(filename, fn.c_str(), i);
}
gradientWriter->SetFileName(filename);
gradientWriter->Update();
}
}
TensorReconstructionImageFilterType::Pointer tensorReconstructionFilter =
TensorReconstructionImageFilterType::New();
tensorReconstructionFilter->SetGradientImage(DiffusionVectors,
reader->GetOutput());
tensorReconstructionFilter->SetNumberOfWorkUnits(1);
tensorReconstructionFilter->SetBValue(b0);
tensorReconstructionFilter->SetThreshold(
static_cast<TensorReconstructionImageFilterType::ReferencePixelType>(
std::stod(argv[2])));
tensorReconstructionFilter->Update();
TensorReconstructionImageFilterType::OutputImageType>;
TensorWriterType::Pointer tensorWriter = TensorWriterType::New();
tensorWriter->SetFileName(argv[3]);
tensorWriter->SetInput(tensorReconstructionFilter->GetOutput());
tensorWriter->Update();
using TensorPixelType =
TensorReconstructionImageFilterType::TensorPixelType;
using RealValueType = TensorPixelType::RealValueType;
TensorReconstructionImageFilterType::OutputImageType,
FAImageType>;
FAFilterType::Pointer fractionalAnisotropyFilter = FAFilterType::New();
fractionalAnisotropyFilter->SetInput(
tensorReconstructionFilter->GetOutput());
FAWriterType::Pointer faWriter = FAWriterType::New();
faWriter->SetInput(fractionalAnisotropyFilter->GetOutput());
faWriter->SetFileName(argv[4]);
faWriter->Update();
using TensorPixelType =
TensorReconstructionImageFilterType::TensorPixelType;
using RealValueType = TensorPixelType::RealValueType;
TensorReconstructionImageFilterType::OutputImageType,
RAImageType>;
RAFilterType::Pointer relativeAnisotropyFilter = RAFilterType::New();
relativeAnisotropyFilter->SetInput(tensorReconstructionFilter->GetOutput());
RAWriterType::Pointer raWriter = RAWriterType::New();
raWriter->SetInput(relativeAnisotropyFilter->GetOutput());
raWriter->SetFileName(argv[5]);
raWriter->Update();
return EXIT_SUCCESS;
}