天天看點

《itk實用demo》-canny算子

canny算子
void Segment()
{
    ImageType::Pointer sliceimage = image_data;
    itk::TimeProbe clock;
    clock.Start();
    //-------------------------------------------
    //---------canny
    float variance = ;
    float maximumError = ;
    float upperThreshold = ;

    typedef itk::MedianImageFilter<ImageType, ImageType > FilterType;
    FilterType::Pointer medianFilter = FilterType::New();
    FilterType::InputSizeType radius;
    radius.Fill();
    medianFilter->SetRadius(radius);
    medianFilter->SetInput( sliceimage);
    //-------------------------------------------
    typedef itk::BinaryBallStructuringElement<PixelType, ImageDimension > SRType;
    SRType kernel;
    kernel.SetRadius(  );
    kernel.CreateStructuringElement();

    //typedef itk::WhiteTopHatImageFilter<ImageType,ImageType,SRType > TopHatFilterType;
    typedef itk::BlackTopHatImageFilter<ImageType,ImageType,SRType > TopHatFilterType;
    TopHatFilterType::Pointer topHatFilter = TopHatFilterType::New();
    topHatFilter->SetInput( medianFilter->GetOutput() );
    topHatFilter->SetSafeBorder( false);
    topHatFilter->SetKernel( kernel );

    //------------------------------------------------------------
    typedef double        RealPixelType;  //  Operations
    typedef itk::Image< RealPixelType, ImageDimension> RealImageType;
    typedef itk::CastImageFilter< ImageType, RealImageType >    CastToRealFilterType;    
    typedef itk::CannyEdgeDetectionImageFilter< RealImageType, RealImageType > CannyFilterType;
    typedef itk::RescaleIntensityImageFilter< RealImageType, ImageType > RescaleFilterType;

    CastToRealFilterType::Pointer toReal      = CastToRealFilterType::New();
    CannyFilterType::Pointer      cannyFilter = CannyFilterType::New();
    RescaleFilterType::Pointer    rescale     = RescaleFilterType::New();

    toReal->SetInput( topHatFilter->GetOutput() );
    cannyFilter->SetInput( toReal->GetOutput() );
    rescale->SetInput( cannyFilter->GetOutput() );

    cannyFilter->SetVariance( variance );
    cannyFilter->SetUpperThreshold( upperThreshold );
    cannyFilter->SetMaximumError( maximumError );
    //------------------------------------------------------------
    rescale->Update();
    image_canny = rescale->GetOutput();

    coronary_data = image_canny;

    clock.Stop();
    std::cout << "Algorithm Total time: " << clock.GetTotal() << std::endl;
}