經典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 ;
}