天天看點

《itk實用demo》-開操作Openning

邏輯運算
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
#include "vtkImageViewer.h"
#include "vtkWin32RenderWindowInteractor.h"

#include "itkResampleImageFilter.h"//采樣
#include "itkBinaryThresholdImageFilter.h"//二值化
#include "itkThresholdImageFilter.h"//門檻值分割

#include "itkBinaryBallStructuringElement.h"
#include "itkBinaryMorphologicalOpeningImageFilter.h"//開運算

#include "itkMultiplyImageFilter.h"//乘法
#include "itkAndImageFilter.h"//與

int _tmain(int argc, _TCHAR* argv[])
{
 double factor = ;

 typedef itk::Image<short,> ImageType;
 typedef itk::ImageFileReader<ImageType> ReaderType;
 typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
 ReaderType::Pointer reader= ReaderType::New();
 ConnectorType::Pointer connector= ConnectorType::New();
 reader->SetFileName("D:\\MedImg\\SE2\\IM182");
 reader->Update();

 ImageType::SizeType inputSize = reader->GetOutput()->GetLargestPossibleRegion().GetSize();
 std::cout << "Original size: " << reader->GetOutput()->GetLargestPossibleRegion().GetSize() << std::endl;

 // Resize
 ImageType::SizeType outputSize;
 outputSize[] = inputSize[]/;
 outputSize[] = inputSize[]/;

 ImageType::SpacingType outputSpacing;
 outputSpacing[] =  reader->GetOutput()->GetSpacing()[] * ;
 outputSpacing[] =  reader->GetOutput()->GetSpacing()[] * ;

 typedef itk::IdentityTransform<double, > TransformType;
 typedef itk::ResampleImageFilter<ImageType, ImageType> ResampleImageFilterType;
 ResampleImageFilterType::Pointer resample = ResampleImageFilterType::New();
 resample->SetInput( reader->GetOutput());
 resample->SetSize(outputSize);
 resample->SetOutputSpacing(outputSpacing);
 resample->SetTransform(TransformType::New());
 resample->UpdateLargestPossibleRegion();

 ImageType::PointType origin;
 origin[]=-static_cast<double>(inputSize[])/;
 origin[]=-static_cast<double>(inputSize[])/;
 resample->SetOutputOrigin(origin);//設定原點
 resample->Update();

 ImageType::Pointer output = resample->GetOutput();
 std::cout << "Output size: " << output->GetLargestPossibleRegion().GetSize() << std::endl;

 typedef itk::BinaryThresholdImageFilter<ImageType, ImageType>  FilterType;
 FilterType::Pointer Thresholdfilter = FilterType::New();
 Thresholdfilter->SetInput( resample->GetOutput() );
 Thresholdfilter->SetLowerThreshold(-);
 Thresholdfilter->SetUpperThreshold();
 //預設設定 SetInsideValue 255 SetOutsideValue 0
 Thresholdfilter->Update();

 typedef itk::BinaryBallStructuringElement<ImageType::PixelType, ImageType::ImageDimension>
  StructuringElementType;
 StructuringElementType structuringElement;
 structuringElement.SetRadius();
 structuringElement.CreateStructuringElement();

 typedef itk::BinaryMorphologicalOpeningImageFilter <ImageType, ImageType, StructuringElementType>
  BinaryMorphologicalOpeningImageFilterType;
 BinaryMorphologicalOpeningImageFilterType::Pointer openingFilter
  = BinaryMorphologicalOpeningImageFilterType::New();
 openingFilter->SetInput(Thresholdfilter->GetOutput());
 openingFilter->SetKernel(structuringElement);
 openingFilter->Update();

 typedef itk::MultiplyImageFilter <ImageType,ImageType,ImageType> MultiplyImageFilterType;
 MultiplyImageFilterType::Pointer multiplyFilter
  = MultiplyImageFilterType::New ();
 multiplyFilter->SetInput1( resample->GetOutput());
 multiplyFilter->SetInput2( openingFilter->GetOutput() );

 typedef itk::AndImageFilter <ImageType> AndImageFilterType;
 AndImageFilterType::Pointer andFilter
  = AndImageFilterType::New();
 andFilter->SetInput(, resample->GetOutput());
 andFilter->SetInput(, openingFilter->GetOutput());
 andFilter->Update();

 connector->SetInput( andFilter->GetOutput() );
 vtkImageViewer* viewer= vtkImageViewer::New();
 vtkWin32RenderWindowInteractor* renderWindowInteractor=
  vtkWin32RenderWindowInteractor::New();
 viewer->SetupInteractor( renderWindowInteractor);
 viewer->SetInput( connector->GetOutput() );
 viewer->Render();
 viewer->SetColorWindow();
 viewer->SetColorLevel();
 renderWindowInteractor->Start();
 return ;
}