/*========================================================================= Program: Insight Segmentation & Registration Toolkit Module: $RCSfile: itkHessianToObjectnessMeasureImageFilter.txx,v $ Language: C++ Date: $Date: 2007/07/26 20:59:44 $ Version: $Revision: 1.1 $ Copyright (c) Insight Software Consortium. All rights reserved. See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef __itkHessianToObjectnessMeasureImageFilter_txx #define __itkHessianToObjectnessMeasureImageFilter_txx #include "itkHessianToObjectnessMeasureImageFilter.h" #include "itkImageRegionIterator.h" #include "itkImageRegionConstIterator.h" #include "vnl/vnl_math.h" namespace itk { /** * Constructor */ template < typename TPixel, unsigned int VDimension > HessianToObjectnessMeasureImageFilter< TPixel, VDimension > ::HessianToObjectnessMeasureImageFilter() { m_Alpha = 0.5; m_Beta = 0.5; m_Gamma = 5.0; m_SymmetricEigenValueFilter = EigenAnalysisFilterType::New(); m_SymmetricEigenValueFilter->SetDimension( ImageDimension ); m_SymmetricEigenValueFilter->OrderEigenValuesBy(EigenAnalysisFilterType::FunctorType::OrderByValue); m_ScaleObjectnessMeasure = true; // by default extract bright lines (equivalent to vesselness) m_ObjectDimension = 1; m_BrightObject = true; } template < typename TPixel, unsigned int VDimension > void HessianToObjectnessMeasureImageFilter< TPixel, VDimension > ::GenerateData() { itkDebugMacro(<< "HessianToObjectnessMeasureImageFilter generating data "); if (m_ObjectDimension >= ImageDimension) { throw ExceptionObject(__FILE__, __LINE__,"ObjectDimension must be lower than ImageDimension.",ITK_LOCATION); } m_SymmetricEigenValueFilter->SetInput( this->GetInput() ); typename OutputImageType::Pointer output = this->GetOutput(); typedef typename EigenAnalysisFilterType::OutputImageType EigenValueImageType; m_SymmetricEigenValueFilter->Update(); const typename EigenValueImageType::ConstPointer eigenImage = m_SymmetricEigenValueFilter->GetOutput(); // walk the region of eigen values and get the objectness measure EigenValueArrayType eigenValues; ImageRegionConstIterator it; it = ImageRegionConstIterator(eigenImage, eigenImage->GetRequestedRegion()); ImageRegionIterator oit; this->AllocateOutputs(); oit = ImageRegionIterator(output,output->GetRequestedRegion()); oit.GoToBegin(); it.GoToBegin(); while (!it.IsAtEnd()) { // Get the eigenvalues eigenValues = it.Get(); // Sort the eigenvalues by magnitude but retain their sign EigenValueArrayType sortedEigenValues = eigenValues; bool done = false; while (!done) { done = true; for (unsigned int i=0; i vnl_math_abs(sortedEigenValues[i+1])) { EigenValueType temp = sortedEigenValues[i+1]; sortedEigenValues[i+1] = sortedEigenValues[i]; sortedEigenValues[i] = temp; done = false; } } } // check whether eigenvalues have the right sign bool signConstraintsSatisfied= true; for (unsigned int i=m_ObjectDimension; i 0.0) || (!m_BrightObject && sortedEigenValues[i] < 0.0) ) { signConstraintsSatisfied = false; break; } } if (!signConstraintsSatisfied) { oit.Set(NumericTraits< OutputPixelType >::Zero); ++it; ++oit; continue; } EigenValueArrayType sortedAbsEigenValues; for (unsigned int i=0; i 0) { double rB = sortedAbsEigenValues[m_ObjectDimension-1]; double rBDenominatorBase = 1.0; for (unsigned int j=m_ObjectDimension; j(objectnessMeasure)); ++it; ++oit; } } template < typename TPixel, unsigned int VDimension > void HessianToObjectnessMeasureImageFilter< TPixel, VDimension > ::PrintSelf(std::ostream& os, Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Alpha: " << m_Alpha << std::endl; os << indent << "Beta: " << m_Beta << std::endl; os << indent << "Gamma: " << m_Gamma << std::endl; os << indent << "ScaleObjectnessMeasure: " << m_ScaleObjectnessMeasure << std::endl; os << indent << "ObjectDimension: " << m_ObjectDimension << std::endl; os << indent << "BrightObject: " << m_BrightObject << std::endl; } } // end namespace itk #endif