Exemplo n.º 1
0
typename AstroStickModel< ScalarType >::PixelType AstroStickModel< ScalarType >::SimulateMeasurement()
{
    PixelType signal;
    signal.SetSize(this->m_GradientList.size());
    double b = -m_BValue*m_Diffusivity;

    if (m_RandomizeSticks)
        m_NumSticks = 30 + m_RandGen->GetIntegerVariate()%31;

    for( unsigned int i=0; i<this->m_GradientList.size(); i++)
    {
        GradientType g = this->m_GradientList[i];
        double bVal = g.GetNorm(); bVal *= bVal;

        if (bVal>0.0001)
        {
            for (int j=0; j<m_NumSticks; j++)
            {
                double dot = 0;
                if(m_RandomizeSticks)
                    dot = GetRandomDirection()*g;
                else
                    dot = m_Sticks[j]*g;
                signal[i] += exp( b*bVal*dot*dot );
            }
            signal[i] /= m_NumSticks;
        }
        else
            signal[i] = 1;
    }

    return signal;
}
Exemplo n.º 2
0
typename TensorModel< ScalarType >::PixelType TensorModel< ScalarType >::SimulateMeasurement()
{
    PixelType signal;
    signal.SetSize(this->m_GradientList.size());
    signal.Fill(0.0);

    ItkTensorType tensor;
    tensor.Fill(0.0);
    this->m_FiberDirection.Normalize();
    vnl_vector_fixed<double, 3> axis = itk::CrossProduct(m_KernelDirection, this->m_FiberDirection).GetVnlVector();
    axis.normalize();
    vnl_quaternion<double> rotation(axis, acos(m_KernelDirection*this->m_FiberDirection));
    rotation.normalize();
    vnl_matrix_fixed<double, 3, 3> matrix = rotation.rotation_matrix_transpose();

    vnl_matrix_fixed<double, 3, 3> tensorMatrix = matrix.transpose()*m_KernelTensorMatrix*matrix;
    tensor[0] = tensorMatrix[0][0];
    tensor[1] = tensorMatrix[0][1];
    tensor[2] = tensorMatrix[0][2];
    tensor[3] = tensorMatrix[1][1];
    tensor[4] = tensorMatrix[1][2];
    tensor[5] = tensorMatrix[2][2];

    for( unsigned int i=0; i<this->m_GradientList.size(); i++)
    {
        GradientType g = this->m_GradientList[i];
        ScalarType bVal = g.GetNorm();
        bVal *= bVal;

        if (bVal>0.0001)
        {
            itk::DiffusionTensor3D< ScalarType > S;
            S[0] = g[0]*g[0];
            S[1] = g[1]*g[0];
            S[2] = g[2]*g[0];
            S[3] = g[1]*g[1];
            S[4] = g[2]*g[1];
            S[5] = g[2]*g[2];

            ScalarType D = tensor[0]*S[0] + tensor[1]*S[1] + tensor[2]*S[2] +
                           tensor[1]*S[1] + tensor[3]*S[3] + tensor[4]*S[4] +
                           tensor[2]*S[2] + tensor[4]*S[4] + tensor[5]*S[5];

            // check for corrupted tensor and generate signal
            if (D>=0)
                signal[i] = exp ( -m_BValue * bVal * D );
        }
        else
            signal[i] = 1;
    }

    return signal;
}
Exemplo n.º 3
0
double Image3D::GetMaximumNorm()
{
    ImageVectorType::RegionType region = image_->GetLargestPossibleRegion();
    itk::ImageRegionConstIterator<ImageVectorType> imageIterator(image_,region);
    PixelType pixelGradient;
    double max = 0.0, courant;
    while(!imageIterator.IsAtEnd())
    {
        pixelGradient = imageIterator.Get();
        courant = pixelGradient.GetNorm();
        if (courant > max) max = courant;
        
        ++imageIterator;
    }
    return max;
}
Exemplo n.º 4
0
typename BallModel< ScalarType >::PixelType BallModel< ScalarType >::SimulateMeasurement()
{
    PixelType signal;
    signal.SetSize(this->m_GradientList.size());

    for( unsigned int i=0; i<this->m_GradientList.size(); i++)
    {
        GradientType g = this->m_GradientList[i];
        if (g.GetNorm()>0.0001)
            signal[i] = exp( -m_BValue * m_Diffusivity );
        else
            signal[i] = 1;
    }

    return signal;
}
    bool writePixel(const PixelType& _pixel)
    {
      _UByteCV* ptr;
      if (!ImageRowAccessor::accessPixel(ptr, 4))
        return false;

      return _pixel.pack(ptr[0], ptr[1], ptr[2], ptr[3]);
    }
    bool readPixel(PixelType& _pixel)
    {
      _UByteCV* ptr;
      if (!ImageRowAccessor::accessPixel(ptr, 4))
        return false;

      return _pixel.unpack(ptr[0], ptr[1], ptr[2], ptr[3]);
    }
Exemplo n.º 7
0
void Image3D::DeleteHighVector()
{
    double threshold = GetMaximumNorm()/3;
    
    ImageVectorType::RegionType region = image_->GetLargestPossibleRegion();
    itk::ImageRegionConstIterator<ImageVectorType> imageIterator(image_,region);
    PixelType pixelGradient;
    IndexType indexGradient;
    while(!imageIterator.IsAtEnd())
    {
        indexGradient = imageIterator.GetIndex();
        pixelGradient = imageIterator.Get();
        if (pixelGradient.GetNorm() > threshold) {
            pixelGradient[0] = 0.0; pixelGradient[1] = 0.0; pixelGradient[2] = 0.0;
            image_->SetPixel(indexGradient,pixelGradient);
        }
        ++imageIterator;
    }
}
Exemplo n.º 8
0
typename StickModel< ScalarType >::PixelType StickModel< ScalarType >::SimulateMeasurement(GradientType &fiberDirection)
{
  PixelType signal;
  signal.SetSize(this->m_GradientList.size());

  for( unsigned int i=0; i<this->m_GradientList.size(); i++)
  {
    GradientType g = this->m_GradientList[i];
    if (g.GetNorm()>0.0001)
    {
      ScalarType dot = fiberDirection*g;
      signal[i] = std::exp( -this->m_BValue*m_Diffusivity*dot*dot ); // skip * bVal becaus bVal is already encoded in the dot product (norm of g encodes b-value relative to baseline b-value m_BValue)
    }
    else
      signal[i] = 1;
  }

  return signal;
}
    bool readPixel(PixelType& _pixel)
    {
      _UByteCV* ptr;
      if (m_readParity)
      {
        if (!ImageRowAccessor::accessPixel(ptr, 4, 2)) // 4 bytes, 2 pixels
          return false;

        m_readParity = false;
        return _pixel.unpack(ptr[2], ptr[1], ptr[3]);
      }
      else
      {
        if (!ImageRowAccessor::accessPixelDontMove(ptr, 4, 2)) // 4 bytes, 2 pixels
          return false;

        m_readParity = true;
        return _pixel.unpack(ptr[0], ptr[1], ptr[3]);
      }
    }
    bool writePixel(const PixelType& _pixel)
    {
      _UByteCV* ptr;
      if (m_writeParity)
      {
        if (!ImageRowAccessor::accessPixel(ptr, 4, 2)) // 4 bytes, 2 pixels
          return false;

        m_writeParity = false;
        return _pixel.pack(ptr[2], ptr[1], ptr[3], true);
      }
      else
      {
        if (!ImageRowAccessor::accessPixelDontMove(ptr, 4, 2)) // 4 bytes, 2 pixels
          return false;

        m_writeParity = true;
        return _pixel.pack(ptr[0], ptr[1], ptr[3], false);
      }
    }
Exemplo n.º 11
0
typename StickModel< ScalarType >::PixelType StickModel< ScalarType >::SimulateMeasurement()
{
    PixelType signal;
    signal.SetSize(this->m_GradientList.size());

    for( unsigned int i=0; i<this->m_GradientList.size(); i++)
    {
        GradientType g = this->m_GradientList[i];
        double bVal = g.GetNorm(); bVal *= bVal;

        if (bVal>0.0001)
        {
            double dot = this->m_FiberDirection*g;
            signal[i] = exp( -m_BValue * bVal * m_Diffusivity*dot*dot );
        }
        else
            signal[i] = 1;
    }

    return signal;
}
Exemplo n.º 12
0
void ComparePixels( itk::Image<itk::RGBPixel<TPixel>,VImageDimension>* image )
{

  typedef itk::RGBPixel<TPixel> PixelType;
  typedef itk::Image<PixelType, VImageDimension> ImageType;

  typename ImageType::IndexType pixelIndex;
  pixelIndex[0] = pos1.x;
  pixelIndex[1] = pos1.y;
  PixelType onePixel = image->GetPixel( pixelIndex );

  MITK_TEST_CONDITION( color1[0] == onePixel.GetBlue(), "Testing if blue value (= " << static_cast<int>(color1[0]) << ") at postion "
    << pos1.x << ", " << pos1.y << " in OpenCV image is "
    << "equals the blue value (= " <<  static_cast<int>(onePixel.GetBlue()) << ")"
    << " in the generated mitk image");


  pixelIndex[0] = pos2.x;
  pixelIndex[1] = pos2.y;
  onePixel = image->GetPixel( pixelIndex );

  MITK_TEST_CONDITION( color2[1] == onePixel.GetGreen(), "Testing if green value (= " << static_cast<int>(color2[1]) << ") at postion "
    << pos2.x << ", " << pos2.y << " in OpenCV image is "
    << "equals the green value (= " <<  static_cast<int>(onePixel.GetGreen()) << ")"
    << " in the generated mitk image");


  pixelIndex[0] = pos3.x;
  pixelIndex[1] = pos3.y;
  onePixel = image->GetPixel( pixelIndex );

  MITK_TEST_CONDITION( color3[2] == onePixel.GetRed(), "Testing if red value (= " << static_cast<int>(color3[2]) << ") at postion "
    << pos3.x << ", " << pos3.y << " in OpenCV image is "
    << "equals the red value (= " <<  static_cast<int>(onePixel.GetRed()) << ")"
    << " in the generated mitk image");

}
Exemplo n.º 13
0
void mitk::ImageVtkMapper2D::SetDefaultProperties(mitk::DataNode* node, mitk::BaseRenderer* renderer, bool overwrite)
{
  mitk::Image::Pointer image = dynamic_cast<mitk::Image*>(node->GetData());

  // Properties common for both images and segmentations
  node->AddProperty( "depthOffset", mitk::FloatProperty::New( 0.0 ), renderer, overwrite );
  node->AddProperty( "outline binary", mitk::BoolProperty::New( false ), renderer, overwrite );
  node->AddProperty( "outline width", mitk::FloatProperty::New( 1.0 ), renderer, overwrite );
  node->AddProperty( "outline binary shadow", mitk::BoolProperty::New( false ), renderer, overwrite );
  node->AddProperty( "outline binary shadow color", ColorProperty::New(0.0,0.0,0.0), renderer, overwrite );
  node->AddProperty( "outline shadow width", mitk::FloatProperty::New( 1.5 ), renderer, overwrite );
  if(image->IsRotated()) node->AddProperty( "reslice interpolation", mitk::VtkResliceInterpolationProperty::New(VTK_RESLICE_CUBIC) );
  else node->AddProperty( "reslice interpolation", mitk::VtkResliceInterpolationProperty::New() );
  node->AddProperty( "texture interpolation", mitk::BoolProperty::New( mitk::DataNodeFactory::m_TextureInterpolationActive ) );  // set to user configurable default value (see global options)
  node->AddProperty( "in plane resample extent by geometry", mitk::BoolProperty::New( false ) );
  node->AddProperty( "bounding box", mitk::BoolProperty::New( false ) );

  mitk::RenderingModeProperty::Pointer renderingModeProperty = mitk::RenderingModeProperty::New();
  node->AddProperty( "Image Rendering.Mode", renderingModeProperty);

  // Set default grayscale look-up table
  mitk::LookupTable::Pointer mitkLut = mitk::LookupTable::New();
  mitkLut->SetType(mitk::LookupTable::GRAYSCALE);
  mitk::LookupTableProperty::Pointer mitkLutProp = mitk::LookupTableProperty::New();
  mitkLutProp->SetLookupTable(mitkLut);
  node->SetProperty("LookupTable", mitkLutProp);

  std::string photometricInterpretation; // DICOM tag telling us how pixel values should be displayed
  if ( node->GetStringProperty( "dicom.pixel.PhotometricInterpretation", photometricInterpretation ) )
  {
    // modality provided by DICOM or other reader
    if ( photometricInterpretation.find("MONOCHROME1") != std::string::npos ) // meaning: display MINIMUM pixels as WHITE
    {
      // Set inverse grayscale look-up table
      mitkLut->SetType(mitk::LookupTable::INVERSE_GRAYSCALE);
      mitkLutProp->SetLookupTable(mitkLut);
      node->SetProperty("LookupTable", mitkLutProp);
    }
    // Otherwise do nothing - the default grayscale look-up table has already been set
  }

  bool isBinaryImage(false);
  if ( ! node->GetBoolProperty("binary", isBinaryImage) )
  {

    // ok, property is not set, use heuristic to determine if this
    // is a binary image
    mitk::Image::Pointer centralSliceImage;
    ScalarType minValue = 0.0;
    ScalarType maxValue = 0.0;
    ScalarType min2ndValue = 0.0;
    ScalarType max2ndValue = 0.0;
    mitk::ImageSliceSelector::Pointer sliceSelector = mitk::ImageSliceSelector::New();

    sliceSelector->SetInput(image);
    sliceSelector->SetSliceNr(image->GetDimension(2)/2);
    sliceSelector->SetTimeNr(image->GetDimension(3)/2);
    sliceSelector->SetChannelNr(image->GetDimension(4)/2);
    sliceSelector->Update();
    centralSliceImage = sliceSelector->GetOutput();
    if ( centralSliceImage.IsNotNull() && centralSliceImage->IsInitialized() )
    {
      minValue    = centralSliceImage->GetStatistics()->GetScalarValueMin();
      maxValue    = centralSliceImage->GetStatistics()->GetScalarValueMax();
      min2ndValue = centralSliceImage->GetStatistics()->GetScalarValue2ndMin();
      max2ndValue = centralSliceImage->GetStatistics()->GetScalarValue2ndMax();
    }
    if ((maxValue == min2ndValue && minValue == max2ndValue) || minValue == maxValue)
    {
      // centralSlice is strange, lets look at all data
      minValue    = image->GetStatistics()->GetScalarValueMin();
      maxValue    = image->GetStatistics()->GetScalarValueMaxNoRecompute();
      min2ndValue = image->GetStatistics()->GetScalarValue2ndMinNoRecompute();
      max2ndValue = image->GetStatistics()->GetScalarValue2ndMaxNoRecompute();
    }
    isBinaryImage = ( maxValue == min2ndValue && minValue == max2ndValue );
  }

  // some more properties specific for a binary...
  if (isBinaryImage)
  {
    node->AddProperty( "opacity", mitk::FloatProperty::New(0.3f), renderer, overwrite );
    node->AddProperty( "color", ColorProperty::New(1.0,0.0,0.0), renderer, overwrite );
    node->AddProperty( "binaryimage.selectedcolor", ColorProperty::New(1.0,0.0,0.0), renderer, overwrite );
    node->AddProperty( "binaryimage.selectedannotationcolor", ColorProperty::New(1.0,0.0,0.0), renderer, overwrite );
    node->AddProperty( "binaryimage.hoveringcolor", ColorProperty::New(1.0,0.0,0.0), renderer, overwrite );
    node->AddProperty( "binaryimage.hoveringannotationcolor", ColorProperty::New(1.0,0.0,0.0), renderer, overwrite );
    node->AddProperty( "binary", mitk::BoolProperty::New( true ), renderer, overwrite );
    node->AddProperty("layer", mitk::IntProperty::New(10), renderer, overwrite);
  }
  else          //...or image type object
  {
    node->AddProperty( "opacity", mitk::FloatProperty::New(1.0f), renderer, overwrite );
    node->AddProperty( "color", ColorProperty::New(1.0,1.0,1.0), renderer, overwrite );
    node->AddProperty( "binary", mitk::BoolProperty::New( false ), renderer, overwrite );
    node->AddProperty("layer", mitk::IntProperty::New(0), renderer, overwrite);

    std::string className = image->GetNameOfClass();

    if (className != "TensorImage" && className != "QBallImage")
    {
      PixelType pixelType = image->GetPixelType();
      size_t numComponents = pixelType.GetNumberOfComponents();

      if ((pixelType.GetPixelTypeAsString() == "vector" && numComponents > 1) || numComponents == 2 || numComponents > 4)
        node->AddProperty("Image.Displayed Component", mitk::IntProperty::New(0), renderer, overwrite);
    }
  }

  if(image.IsNotNull() && image->IsInitialized())
  {
    if((overwrite) || (node->GetProperty("levelwindow", renderer)==NULL))
    {
      /* initialize level/window from DICOM tags */
      std::string sLevel;
      std::string sWindow;
      if ( image->GetPropertyList()->GetStringProperty( "dicom.voilut.WindowCenter", sLevel )
           && image->GetPropertyList()->GetStringProperty( "dicom.voilut.WindowWidth", sWindow ) )
      {
        float level = atof( sLevel.c_str() );
        float window = atof( sWindow.c_str() );

        mitk::LevelWindow contrast;
        std::string sSmallestPixelValueInSeries;
        std::string sLargestPixelValueInSeries;

        if ( image->GetPropertyList()->GetStringProperty( "dicom.series.SmallestPixelValueInSeries", sSmallestPixelValueInSeries )
             && image->GetPropertyList()->GetStringProperty( "dicom.series.LargestPixelValueInSeries", sLargestPixelValueInSeries ) )
        {
          float smallestPixelValueInSeries = atof( sSmallestPixelValueInSeries.c_str() );
          float largestPixelValueInSeries = atof( sLargestPixelValueInSeries.c_str() );
          contrast.SetRangeMinMax( smallestPixelValueInSeries-1, largestPixelValueInSeries+1 ); // why not a little buffer?
          // might remedy some l/w widget challenges
        }
        else
        {
          contrast.SetAuto( static_cast<mitk::Image*>(node->GetData()), false, true ); // we need this as a fallback
        }

        contrast.SetLevelWindow( level, window, true );
        node->SetProperty( "levelwindow", LevelWindowProperty::New( contrast ), renderer );
      }
    }
    if(((overwrite) || (node->GetProperty("opaclevelwindow", renderer)==NULL))
       && (image->GetPixelType().GetPixelType() == itk::ImageIOBase::RGBA)
       && (image->GetPixelType().GetComponentType() == itk::ImageIOBase::UCHAR) )
    {
      mitk::LevelWindow opaclevwin;
      opaclevwin.SetRangeMinMax(0,255);
      opaclevwin.SetWindowBounds(0,255);
      mitk::LevelWindowProperty::Pointer prop = mitk::LevelWindowProperty::New(opaclevwin);
      node->SetProperty( "opaclevelwindow", prop, renderer );
    }
  }
  Superclass::SetDefaultProperties(node, renderer, overwrite);
}
Exemplo n.º 14
0
 void operator() (PixelType& pixel) const
 {
     pixel.desaturate();
 }
Exemplo n.º 15
0
 void operator() (PixelType& pixel) const
 {
     pixel.multiplyAlpha (alpha);
 }
  void MultiComponentImageDataComparisonFilter::GenerateData()
  {
    // check inputs
    const Image* testInput = this->GetTestImage();
    const Image* validInput = this->GetValidImage();

    // Generally this filter is part of the mitk::Image::Equal() method and only checks the equality of the image data
    // so no further image type comparison is performed!
    // CAVE: If the images differ in a parameter other then the image data, the filter may fail!!

    PixelType type = validInput->GetPixelType();

    if(type.GetComponentType() == itk::ImageIOBase::CHAR)
    {
      CompareMultiComponentImage<char>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::UCHAR)
    {
      CompareMultiComponentImage<unsigned char>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::INT)
    {
      CompareMultiComponentImage<int>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::UINT)
    {
      CompareMultiComponentImage<unsigned int>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::SHORT)
    {
      CompareMultiComponentImage<short>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::USHORT)
    {
      CompareMultiComponentImage<unsigned short>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::LONG)
    {
      CompareMultiComponentImage<long>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::ULONG)
    {
      CompareMultiComponentImage<unsigned long>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::FLOAT)
    {
      CompareMultiComponentImage<float>( testInput, validInput);
    }
    else if (type.GetComponentType() == itk::ImageIOBase::DOUBLE)
    {
      CompareMultiComponentImage<double>( testInput, validInput);
    }
    else
    {
      mitkThrow() << "Pixel component type not supported!";
    }
  }