コード例 #1
0
void QmitkTensorReconstructionView::ItkTensorReconstruction(mitk::DataStorage::SetOfObjects::Pointer inImages)
{
    try
    {
        itk::TimeProbe clock;

        int nrFiles = inImages->size();
        if (!nrFiles) return;

        QString status;
        mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles);

        mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() );
        mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() );

        std::vector<mitk::DataNode::Pointer> nodes;
        while ( itemiter != itemiterend ) // for all items
        {

            mitk::DiffusionImage<DiffusionPixelType>* vols =
                    static_cast<mitk::DiffusionImage<DiffusionPixelType>*>(
                        (*itemiter)->GetData());

            std::string nodename;
            (*itemiter)->GetStringProperty("name", nodename);
            ++itemiter;

            // TENSOR RECONSTRUCTION
            clock.Start();
            MITK_DEBUG << "Tensor reconstruction ";
            mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Tensor reconstruction for %s", nodename.c_str()).toAscii());
            typedef itk::DiffusionTensor3DReconstructionImageFilter<
                    DiffusionPixelType, DiffusionPixelType, TTensorPixelType > TensorReconstructionImageFilterType;
            TensorReconstructionImageFilterType::Pointer tensorReconstructionFilter =
                    TensorReconstructionImageFilterType::New();
            tensorReconstructionFilter->SetGradientImage( vols->GetDirections(), vols->GetVectorImage() );
            tensorReconstructionFilter->SetBValue(vols->GetB_Value());
            tensorReconstructionFilter->SetThreshold( m_Controls->m_TensorReconstructionThreshold->value() );
            tensorReconstructionFilter->Update();
            clock.Stop();
            MITK_DEBUG << "took " << clock.GetMeanTime() << "s.";

            // TENSORS TO DATATREE
            mitk::TensorImage::Pointer image = mitk::TensorImage::New();

            typedef itk::Image<itk::DiffusionTensor3D<TTensorPixelType>, 3> TensorImageType;
            TensorImageType::Pointer tensorImage;
            tensorImage = tensorReconstructionFilter->GetOutput();

            // Check the tensor for negative eigenvalues
            if(m_Controls->m_CheckNegativeEigenvalues->isChecked())
            {
                typedef itk::ImageRegionIterator<TensorImageType> TensorImageIteratorType;
                TensorImageIteratorType tensorIt(tensorImage, tensorImage->GetRequestedRegion());
                tensorIt.GoToBegin();

                while(!tensorIt.IsAtEnd())
                {

                    typedef itk::DiffusionTensor3D<TTensorPixelType> TensorType;
                    //typedef itk::Tensor<TTensorPixelType, 3> TensorType2;

                    TensorType tensor = tensorIt.Get();

                    TensorType::EigenValuesArrayType ev;
                    tensor.ComputeEigenValues(ev);
                    for(unsigned int i=0; i<ev.Size(); i++)
                    {
                        if(ev[i] < 0.0)
                        {
                            tensor.Fill(0.0);
                            tensorIt.Set(tensor);
                            break;
                        }
                    }
                    ++tensorIt;
                }
            }

            tensorImage->SetDirection( vols->GetVectorImage()->GetDirection() );
            image->InitializeByItk( tensorImage.GetPointer() );
            image->SetVolume( tensorReconstructionFilter->GetOutput()->GetBufferPointer() );
            mitk::DataNode::Pointer node=mitk::DataNode::New();
            node->SetData( image );

            QString newname;
            newname = newname.append(nodename.c_str());
            newname = newname.append("_dti");

            SetDefaultNodeProperties(node, newname.toStdString());
            nodes.push_back(node);

            mitk::ProgressBar::GetInstance()->Progress();
        }

        std::vector<mitk::DataNode::Pointer>::iterator nodeIt;
        for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt)
            GetDefaultDataStorage()->Add(*nodeIt);

        mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toAscii());
        m_MultiWidget->RequestUpdate();

    }
    catch (itk::ExceptionObject &ex)
    {
        MITK_INFO << ex ;
        QMessageBox::information(0, "Reconstruction not possible:", ex.GetDescription());
        return;
    }
}
コード例 #2
0
/**
 * Convert files from one ending to the other
 */
int main(int argc, char* argv[])
{
    mitkCommandLineParser parser;
    parser.setArgumentPrefix("--", "-");
    parser.addArgument("input", "i", mitkCommandLineParser::InputFile, "Input file", "input raw dwi (.dwi or .fsl/.fslgz)", us::Any(), false);
    parser.addArgument("outFile", "o", mitkCommandLineParser::OutputFile, "Output file", "output file", us::Any(), false);
    parser.addArgument("b0Threshold", "t", mitkCommandLineParser::Int, "b0 threshold", "baseline image intensity threshold", 0, true);

    parser.setCategory("Signal Modelling");
    parser.setTitle("Tensor Reconstruction");
    parser.setDescription("");
    parser.setContributor("MIC");

    std::map<std::string, us::Any> parsedArgs = parser.parseArguments(argc, argv);
    if (parsedArgs.size()==0)
        return EXIT_FAILURE;

    std::string inFileName = us::any_cast<std::string>(parsedArgs["input"]);
    std::string outfilename = us::any_cast<std::string>(parsedArgs["outFile"]);
    outfilename = itksys::SystemTools::GetFilenamePath(outfilename)+"/"+itksys::SystemTools::GetFilenameWithoutExtension(outfilename);
    outfilename += ".dti";

    int threshold = 0;
    if (parsedArgs.count("b0Threshold"))
        threshold = us::any_cast<int>(parsedArgs["b0Threshold"]);

    try
    {
        mitk::Image::Pointer dwi = dynamic_cast<mitk::Image*>(mitk::IOUtil::Load(inFileName)[0].GetPointer());

        mitk::DiffusionPropertyHelper::ImageType::Pointer itkVectorImagePointer = mitk::DiffusionPropertyHelper::ImageType::New();
        mitk::CastToItkImage(dwi, itkVectorImagePointer);

        typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, float > TensorReconstructionImageFilterType;
        TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New();
        filter->SetGradientImage( mitk::DiffusionPropertyHelper::GetGradientContainer(dwi), itkVectorImagePointer );
        filter->SetBValue( mitk::DiffusionPropertyHelper::GetReferenceBValue( dwi ));
        filter->SetThreshold(threshold);
        filter->Update();

        // Save tensor image
        itk::NrrdImageIO::Pointer io = itk::NrrdImageIO::New();
        io->SetFileType( itk::ImageIOBase::Binary );
        io->UseCompressionOn();

        itk::ImageFileWriter< itk::Image< itk::DiffusionTensor3D< float >, 3 > >::Pointer writer = itk::ImageFileWriter< itk::Image< itk::DiffusionTensor3D< float >, 3 > >::New();
        writer->SetInput(filter->GetOutput());
        writer->SetFileName(outfilename);
        writer->SetImageIO(io);
        writer->UseCompressionOn();
        writer->Update();
    }
    catch ( itk::ExceptionObject &err)
    {
        std::cout << "Exception: " << err;
    }
    catch ( std::exception err)
    {
        std::cout << "Exception: " << err.what();
    }
    catch ( ... )
    {
        std::cout << "Exception!";
    }
    return EXIT_SUCCESS;

}
コード例 #3
0
int mitkImageReconstructionTest(int argc, char* argv[])
{
    MITK_TEST_BEGIN("mitkImageReconstructionTest");

    MITK_TEST_CONDITION_REQUIRED(argc>1,"check for input data")

    try
    {
        mitk::DiffusionImage<short>::Pointer dwi = dynamic_cast<mitk::DiffusionImage<short>*>(mitk::IOUtil::LoadDataNode(argv[1])->GetData());

        {
            MITK_INFO << "Tensor reconstruction " << argv[2];
            mitk::TensorImage::Pointer tensorImage = dynamic_cast<mitk::TensorImage*>(mitk::IOUtil::LoadDataNode(argv[2])->GetData());
            typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, float > TensorReconstructionImageFilterType;
            TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->Update();
            mitk::TensorImage::Pointer testImage = mitk::TensorImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, tensorImage, 0.0001, true), "tensor reconstruction test.");
        }

        {
            MITK_INFO << "Numerical Q-ball reconstruction " << argv[3];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[3])->GetData());
            typedef itk::DiffusionQballReconstructionImageFilter<short, short, float, QBALL_ODFSIZE> QballReconstructionImageFilterType;
            QballReconstructionImageFilterType::Pointer filter = QballReconstructionImageFilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "Numerical Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "Standard Q-ball reconstruction " << argv[4];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[4])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_STANDARD);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "Standard Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "CSA Q-ball reconstruction " << argv[5];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[5])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_SOLID_ANGLE);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "CSA Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "ADC profile reconstruction " << argv[6];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[6])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_ADC_ONLY);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "ADC profile reconstruction test.");
        }

        {
            MITK_INFO << "Raw signal modeling " << argv[7];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[7])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_RAW_SIGNAL);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "Raw signal modeling test.");
        }
    }
    catch (itk::ExceptionObject e)
    {
        MITK_INFO << e;
        return EXIT_FAILURE;
    }
    catch (std::exception e)
    {
        MITK_INFO << e.what();
        return EXIT_FAILURE;
    }
    catch (...)
    {
        MITK_INFO << "ERROR!?!";
        return EXIT_FAILURE;
    }

    MITK_TEST_END();
}
コード例 #4
0
int mitkImageReconstructionTest(int argc, char* argv[])
{
    MITK_TEST_BEGIN("mitkImageReconstructionTest");

    MITK_TEST_CONDITION_REQUIRED(argc>1,"check for input data")

    try
    {
        mitk::Image::Pointer dwi = dynamic_cast<mitk::Image*>(mitk::IOUtil::Load(argv[1])[0].GetPointer());

        itk::VectorImage<short,3>::Pointer itkVectorImagePointer = itk::VectorImage<short,3>::New();
        mitk::CastToItkImage(dwi, itkVectorImagePointer);

        float b_value = mitk::DiffusionPropertyHelper::GetReferenceBValue( dwi );
        mitk::DiffusionPropertyHelper::GradientDirectionsContainerType::Pointer gradients = mitk::DiffusionPropertyHelper::GetGradientContainer(dwi);
        {
            MITK_INFO << "Tensor reconstruction " << argv[2];
            mitk::TensorImage::Pointer tensorImage = dynamic_cast<mitk::TensorImage*>(mitk::IOUtil::Load(argv[2])[0].GetPointer());
            typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, float > TensorReconstructionImageFilterType;
            TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->Update();
            mitk::TensorImage::Pointer testImage = mitk::TensorImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *tensorImage, 0.0001, true), "tensor reconstruction test.");
        }

        {
            MITK_INFO << "Numerical Q-ball reconstruction " << argv[3];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[3])[0].GetPointer());
            typedef itk::DiffusionQballReconstructionImageFilter<short, short, float, ODF_SAMPLING_SIZE> QballReconstructionImageFilterType;
            QballReconstructionImageFilterType::Pointer filter = QballReconstructionImageFilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "Numerical Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "Standard Q-ball reconstruction " << argv[4];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[4])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_STANDARD);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "Standard Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "CSA Q-ball reconstruction " << argv[5];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[5])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_SOLID_ANGLE);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "CSA Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "ADC profile reconstruction " << argv[6];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[6])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_ADC_ONLY);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "ADC profile reconstruction test.");
        }

        {
            MITK_INFO << "Raw signal modeling " << argv[7];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[7])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_RAW_SIGNAL);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "Raw signal modeling test.");
        }
    }
    catch (itk::ExceptionObject e)
    {
        MITK_INFO << e;
        return EXIT_FAILURE;
    }
    catch (std::exception e)
    {
        MITK_INFO << e.what();
        return EXIT_FAILURE;
    }
    catch (...)
    {
        MITK_INFO << "ERROR!?!";
        return EXIT_FAILURE;
    }

    MITK_TEST_END();
}