天天看點

《itk實用demo》-Hough檢測圓

經典hough變換
#include "itkHoughTransform2DCirclesImageFilter.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkImageRegionIterator.h"
#include "itkThresholdImageFilter.h"
#include "itkMinimumMaximumImageCalculator.h"
#include <itkGradientMagnitudeImageFilter.h>
#include <itkDiscreteGaussianImageFilter.h>
#include <list>
#include "itkCastImageFilter.h"
#include "vnl/vnl_math.h"

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
#include "vtkImageViewer.h"
#include "vtkWin32RenderWindowInteractor.h" 
#include "vtkImageCast.h"

int main( int argc, char *argv[] )
{
  // Software Guide : BeginCodeSnippet
  typedef   unsigned char   PixelType;
  typedef   float           AccumulatorPixelType;
  const     unsigned int    Dimension = ;
  typedef itk::Image< PixelType, Dimension >  ImageType;
  ImageType::IndexType localIndex;
  typedef itk::Image< AccumulatorPixelType, Dimension > AccumulatorImageType;  

  typedef  itk::ImageFileReader< ImageType > ReaderType;
  ReaderType::Pointer reader = ReaderType::New();
 reader->SetFileName("D:\\1\\IM208");
    reader->Update();

  ImageType::Pointer localImage = reader->GetOutput();

  // Software Guide : BeginCodeSnippet
  std::cout << "Computing Hough Map" << std::endl;

  typedef itk::HoughTransform2DCirclesImageFilter<PixelType,
               AccumulatorPixelType> HoughTransformFilterType;
  HoughTransformFilterType::Pointer houghFilter = HoughTransformFilterType::New();
  // Software Guide : BeginCodeSnippet
  houghFilter->SetInput( reader->GetOutput() );

  houghFilter->SetNumberOfCircles();
  houghFilter->SetMinimumRadius();
  houghFilter->SetMaximumRadius();

  houghFilter->Update();
  AccumulatorImageType::Pointer localAccumulator = houghFilter->GetOutput();  
  // Software Guide : BeginCodeSnippet
  HoughTransformFilterType::CirclesListType circles;
  circles = houghFilter->GetCircles();
  std::cout << "Found " << circles.size() << " circle(s)." << std::endl;

  // Software Guide : BeginCodeSnippet
  typedef  unsigned char                            OutputPixelType;
  typedef  itk::Image< OutputPixelType, Dimension > OutputImageType;  

  OutputImageType::Pointer  localOutputImage = OutputImageType::New();

  OutputImageType::RegionType region;
  region.SetSize(localImage->GetLargestPossibleRegion().GetSize());
  region.SetIndex(localImage->GetLargestPossibleRegion().GetIndex());
  localOutputImage->SetRegions( region );
  localOutputImage->SetOrigin(localImage->GetOrigin());
  localOutputImage->SetSpacing(localImage->GetSpacing());
  localOutputImage->Allocate();
  localOutputImage->FillBuffer();
  // Software Guide : BeginCodeSnippet
  typedef HoughTransformFilterType::CirclesListType CirclesListType;
  CirclesListType::const_iterator itCircles = circles.begin();

  while( itCircles != circles.end() )
    {
    std::cout << "Center: ";
    std::cout << (*itCircles)->GetObjectToParentTransform()->GetOffset()
              << std::endl;
    std::cout << "Radius: " << (*itCircles)->GetRadius()[] << std::endl;

    // Software Guide : BeginCodeSnippet
    for(double angle = ;angle <= *vnl_math::pi; angle += vnl_math::pi/ )
      {
      localIndex[] =
         (long int)((*itCircles)->GetObjectToParentTransform()->GetOffset()[]
                                  + (*itCircles)->GetRadius()[]*vcl_cos(angle));
      localIndex[] =
         (long int)((*itCircles)->GetObjectToParentTransform()->GetOffset()[]
                                  + (*itCircles)->GetRadius()[]*vcl_sin(angle));
      OutputImageType::RegionType outputRegion =
                                  localOutputImage->GetLargestPossibleRegion();

      if( outputRegion.IsInside( localIndex ) )
        {
        localOutputImage->SetPixel( localIndex,  );
        }
      }
    itCircles++;
    }


  typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
  ConnectorType::Pointer connector= ConnectorType::New();  connector->SetInput( localOutputImage );
  vtkImageViewer* viewer= vtkImageViewer::New();
  vtkWin32RenderWindowInteractor* renderWindowInteractor=
   vtkWin32RenderWindowInteractor::New();
  viewer->SetupInteractor( renderWindowInteractor);
  viewer->SetInput( connector->GetOutput() );
  viewer->Render();
  viewer->SetColorWindow( );
  viewer->SetColorLevel( );
   renderWindowInteractor->Start();

  ConnectorType::Pointer connector2= ConnectorType::New();  connector2->SetInput( reader->GetOutput() );
  vtkImageViewer* viewer2= vtkImageViewer::New();
  vtkWin32RenderWindowInteractor* renderWindowInteractor2=
   vtkWin32RenderWindowInteractor::New();
  viewer2->SetupInteractor( renderWindowInteractor2);
  viewer2->SetInput( connector2->GetOutput() );
  viewer2->Render();
  viewer2->SetColorWindow( );
  viewer2->SetColorLevel( );
 renderWindowInteractor2->Start();

  return ;
}