#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include "itkResampleImageFilter.h"
#include "itkAffineTransform.h"
#include "itkBMPImageIOFactory.h"
#include "itkMetaImageIOFactory.h"
#include "iostream"
using namespace std;
int main()
{
itk::ObjectFactoryBase::RegisterFactory(itk::BMPImageIOFactory::New());
typedef itk::Image InputImageType;
typedef itk::Image OutputImageType;
typedef itk::ImageFileReader ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName("D:\\lena.bmp");
reader->Update();
typedef itk::LinearInterpolateImageFunction InterpolatorType;
InterpolatorType::Pointer interpolator = InterpolatorType::New();
typedef itk::ResampleImageFilter RotateFilterType;
RotateFilterType::Pointer Rotatefilter = RotateFilterType::New();
Rotatefilter->SetInterpolator( interpolator );
Rotatefilter->SetDefaultPixelValue( 100 );
const InputImageType * inputImage = reader->GetOutput();
const InputImageType::SpacingType & spacing = inputImage->GetSpacing();
const InputImageType::PointType & origin = inputImage->GetOrigin();
InputImageType::SizeType size = inputImage->GetLargestPossibleRegion().GetSize();
Rotatefilter->SetOutputOrigin( origin );
Rotatefilter->SetOutputSpacing( spacing );
Rotatefilter->SetOutputDirection( inputImage->GetDirection() );
Rotatefilter->SetSize( size );
Rotatefilter->SetInput(reader->GetOutput());
typedef itk::AffineTransform<double, 2> TransformType;
TransformType::Pointer transform = TransformType::New();
TransformType::OutputVectorType translation1;
const double imageCenterX = origin[0] + spacing[0] * size[0] / 2.0;
const double imageCenterY = origin[1] + spacing[1] * size[1] / 2.0;
translation1[0] = -imageCenterX;
translation1[1] = -imageCenterY;
transform->Translate( translation1 );
std::cout << "imageCenterX = " <<imageCenterX<< std::endl;
std::cout << "imageCenterY = " <<imageCenterY<< std::endl;
const double degreesToRadians = vcl_atan(1.0) / 45.0;
const double angle = 30* degreesToRadians;
transform->Rotate2D( -angle, false );
TransformType::OutputVectorType translation2;
translation2[0] =imageCenterX;
translation2[1] =imageCenterY;
transform->Translate( translation2, false );
Rotatefilter->SetTransform( transform );
Rotatefilter->Update();
typedef itk::ImageToVTKImageFilter FilterType;
FilterType::Pointer connector = FilterType::New();
connector->SetInput(Rotatefilter->GetOutput());
vtkImageViewer *viewer = vtkImageViewer::New();
vtkRenderWindowInteractor *renderWindowInteractor = vtkRenderWindowInteractor::New();
viewer->SetupInteractor(renderWindowInteractor);
viewer->SetInput(connector->GetOutput());
viewer->Render();
viewer->SetColorWindow(255);
viewer->SetColorLevel(128);
renderWindowInteractor->Start();//顯示圖像
cin.get();
return 0;
}
利用ITK旋轉圖像
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.