Exemplo n.º 1
0
int main()
{
    std::cout << std::boolalpha;
    constexpr unsigned sizes[]{4, 5, 3, 8, 6};

// Construction
    std::cout << "Construction : " << std::endl;
    std::array<char, sizes[0]> arr0{}, arr0b{{'f', 'r', 's', 'r'}}; // default
    std::array<char, sizes[1]> arr1 = {'e', 'q', 'g', 't', 'e'}, arr1b({0 + 'a', 4 + 'a', 5 + 'a', 2 + 'a', 3 + 'a'}); // braced list
    std::array<char, sizes[2]> arr2({'d', 's', 'a'}), arr2b = {7, 7, 'u'};

// Print elements
    print(arr0, "arr0");
    print(arr0b, "arr0b");
    print(arr1, "arr1");
    print(arr1b, "arr1b");
    print(arr2, "arr2");
    print(arr2b, "arr2b");

// Type aliases
    std::array<char, sizes[0]>::iterator it0(arr0.begin()); // iterator
    std::array<char, sizes[1]>::const_iterator cit1(arr1.begin()); // const_iterator
    std::array<char, sizes[0]>::reverse_iterator rit0(--arr0.rbegin()); // iterator
    std::array<char, sizes[1]>::const_reverse_iterator crit1(--arr1.crbegin()); // const_reverse_iterator
std::array<char, sizes[1]>::size_type sz1 = arr1.size(); // size_type
    std::array<char, sizes[2]>::difference_type diff2 = arr2.cend() - arr2.cbegin(); // difference_type
    std::array<char, sizes[2]>::value_type val2 = arr2[0]; // value_type
    std::array<char, sizes[2]>::reference ref2 = arr2[1]; // reference
    std::array<char, sizes[2]>::const_reference cref2 =arr2[3]; // const_reference

// Print iterators
    std::cout << "it0 : " << *it0 << std::endl;
    std::cout << "rit0 : " << *rit0 << std::endl;
    std::cout << "cit1 : " << *cit1 << std::endl;
    std::cout << "crit1 : " << *crit1 << std::endl;

    std::cout << "val2 : " << val2 << std::endl;
    std::cout << "ref2 : " << ref2 << std::endl;
    std::cout << "cref2 : " << cref2 << std::endl;

// Size operations
    std::cout << "arr1.size : " << sz1 << std::endl;
    std::cout << "arr2 size : " << diff2 << std::endl; // number of elements in container
    std::cout << "arr0.max_size : " << arr0.max_size() << std::endl;// max number of elements container can hold
    std::cout << "arr1.max_size : " << arr1.max_size() << std::endl; // true if container empty, false otherwise
    std::cout << "arr2.max_size : " << arr2.max_size() << std::endl;

// Swap
    std::cout << "Assignment and swap : " << std::endl;
    arr0 = arr0b; // copy assignment of object
    arr1b = {'a', 'b', 'c', 'd'}; // copy assignment of braced list
    arr2.swap(arr2b); // member style swap
    swap(arr1, arr1b); // function style swap

// Print elements
    print(arr0, "arr0");
    print(arr0b, "arr0b");
    print(arr1, "arr1");
    print(arr1b, "arr1b");
    print(arr2, "arr2");
    print(arr2b, "arr2b");

// Relational operations
    std::cout << "Relational operations : " << std::endl;
    std::cout << "arr0 == arr0b : " << (arr0 == arr0b) << std::endl; // ==
    std::cout << "arr1 != arr1b : " << (arr1 != arr1b) << std::endl; // !=
    std::cout << "arr2 < arr2b : " << (arr2 < arr2b) << std::endl; // <
    std::cout << "arr2 <= arr2b : " << (arr2 <= arr2b) << std::endl; // <=
    std::cout << "arr1 > arr1b : " << (arr1 > arr1b) << std::endl; // >
    std::cout << "arr0 >= arr0b : " << (arr0 >= arr0b) << std::endl; // >=

    return 0;
}
  mitk::Image::Pointer PartialVolumeAnalysisClusteringCalculator::CaculateAngularErrorImage(
      mitk::Image::Pointer comp1, mitk::Image::Pointer comp2, mitk::Image::Pointer probImg) const
  {

    // cast input images to itk
    typedef itk::Image<float, 3> ImageType;
    typedef mitk::ImageToItk<ImageType> CastType;
    CastType::Pointer caster = CastType::New();
    caster->SetInput(comp1);
    caster->Update();
    ImageType::Pointer comp1Image = caster->GetOutput();

    caster = CastType::New();
    caster->SetInput(comp2);
    caster->Update();
    ImageType::Pointer comp2Image = caster->GetOutput();

    caster = CastType::New();
    caster->SetInput(probImg);
    caster->Update();
    ImageType::Pointer probImage = caster->GetOutput();

    // figure out maximum probability for fiber class
    float maxProb = 0;
    itk::ImageRegionConstIterator<ImageType>
        itprob(probImage, probImage->GetLargestPossibleRegion());
    itprob.GoToBegin();
    while( !itprob.IsAtEnd() )
    {
      maxProb = itprob.Get() > maxProb ? itprob.Get() : maxProb;
      ++itprob;
    }

    // generate a list sample of angles at positions
    // where the fiber-prob is higher than .2*maxprob
    typedef float MeasurementType;
    const unsigned int MeasurementVectorLength = 2;
    typedef itk::Vector< MeasurementType , MeasurementVectorLength >
                                                                 MeasurementVectorType;
    typedef itk::Statistics::ListSample< MeasurementVectorType > ListSampleType;
    ListSampleType::Pointer listSample = ListSampleType::New();
    listSample->SetMeasurementVectorSize( MeasurementVectorLength );

    itk::ImageRegionIterator<ImageType>
        it1(comp1Image, comp1Image->GetLargestPossibleRegion());
    itk::ImageRegionIterator<ImageType>
        it2(comp2Image, comp2Image->GetLargestPossibleRegion());

    it1.GoToBegin();
    it2.GoToBegin();
    itprob.GoToBegin();

    while( !itprob.IsAtEnd() )
    {
      if(itprob.Get() > 0.2 * maxProb)
      {
        MeasurementVectorType mv;
        mv[0] = ( MeasurementType ) it1.Get();
        mv[1] = ( MeasurementType ) it2.Get();
        listSample->PushBack(mv);
      }
      ++it1;
      ++it2;
      ++itprob;
    }

    // generate a histogram from the list sample
    typedef float HistogramMeasurementType;
    typedef itk::Statistics::Histogram< HistogramMeasurementType, itk::Statistics::DenseFrequencyContainer2 > HistogramType;
    typedef itk::Statistics::SampleToHistogramFilter< ListSampleType, HistogramType > GeneratorType;
    GeneratorType::Pointer generator = GeneratorType::New();

    GeneratorType::HistogramType::SizeType size(2);
    size.Fill(30);
    generator->SetHistogramSize( size );

    generator->SetInput( listSample );
    generator->SetMarginalScale( 10.0 );

    generator->Update();

    // look for frequency mode in the histogram
    GeneratorType::HistogramType::ConstPointer histogram = generator->GetOutput();
    GeneratorType::HistogramType::ConstIterator iter = histogram->Begin();
    float maxFreq = 0;
    MeasurementVectorType maxValue;
    maxValue.Fill(0);
    while ( iter != histogram->End() )
    {
      if(iter.GetFrequency() > maxFreq)
      {
        maxFreq = iter.GetFrequency();
        maxValue[0] = iter.GetMeasurementVector()[0];
        maxValue[1] = iter.GetMeasurementVector()[1];
      }
      ++iter;
    }

    // generate return image that contains the angular
    // error of the voxels to the histogram max measurement
    ImageType::Pointer returnImage = ImageType::New();
    returnImage->SetSpacing( comp1Image->GetSpacing() );   // Set the image spacing
    returnImage->SetOrigin( comp1Image->GetOrigin() );     // Set the image origin
    returnImage->SetDirection( comp1Image->GetDirection() );  // Set the image direction
    returnImage->SetRegions( comp1Image->GetLargestPossibleRegion() );
    returnImage->Allocate();

    itk::ImageRegionConstIterator<ImageType>
        cit1(comp1Image, comp1Image->GetLargestPossibleRegion());

    itk::ImageRegionConstIterator<ImageType>
        cit2(comp2Image, comp2Image->GetLargestPossibleRegion());

    itk::ImageRegionIterator<ImageType>
        itout(returnImage, returnImage->GetLargestPossibleRegion());

    cit1.GoToBegin();
    cit2.GoToBegin();
    itout.GoToBegin();

    vnl_vector<float> v(3);
    v[0] = cos( maxValue[0] ) * sin( maxValue[1] );
    v[1] = sin( maxValue[0] ) * sin( maxValue[1] );
    v[2] = cos( maxValue[1] );
//    MITK_INFO << "max vector: " << v;
    while( !cit1.IsAtEnd() )
    {
      vnl_vector<float> v1(3);
      v1[0] = cos( cit1.Get() ) * sin( cit2.Get() );
      v1[1] = sin( cit1.Get() ) * sin( cit2.Get() );
      v1[2] = cos( cit2.Get() );

      itout.Set(fabs(angle(v,v1)));
//      MITK_INFO << "ang_error " << v1 << ": " << fabs(angle(v,v1));

      ++cit1;
      ++cit2;
      ++itout;
    }

    mitk::Image::Pointer retval = mitk::Image::New();
    retval->InitializeByItk(returnImage.GetPointer());
    retval->SetVolume(returnImage->GetBufferPointer());
    return retval;
  }