#include "vtkSmartPointer.h"
#include "vtkRenderWindow.h"
#include "vtkAutoInit.h"
#include "vtkRenderer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkVolume.h"
#include "vtkGPUVolumeRayCastMapper.h"
#include "vtkVolumeProperty.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageData.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkColorTransferFunction.h"
#include "vtkPiecewiseFunction.h"
#include "vtkImageActor.h"
#include "vtkInteractorStyleImage.h"
#include "itkImageToVTKImageFilter.h"
#include "itkImage.h"
#include "itkGDCMImageIO.h"
#include "itkGDCMSeriesFileNames.h"
#include "itkImageSeriesReader.h"
#include "vtkImageViewer.h"
#include "itkNeighborhoodConnectedImageFilter.h"
#include "itkImage.h"
#include "itkImageSeriesWriter.h"
#include "itkImageSeriesWriter.h"
#include <qdebug.h>
#include "itkCastImageFilter.h"
#include "itkConnectedThresholdImageFilter.h"
#include "itkCurvatureFlowImageFilter.h"
#include "itkConfidenceConnectedImageFilter.h"
#include "itkSubtractImageFilter.h"
#include "itkMultiplyImageFilter.h"
#include "itkAndImageFilter.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
int main(int argc, char* argv[])
{
/*---------------------------------------------------------------------------------------*/
/*
/* 将目录A中的文件分别读取,然后处理,然后写入目录B
/*
/*---------------------------------------------------------------------------------------*/
typedef float InternalOneFilePixelType;
const unsigned int DimensionOneFile = 2;
typedef itk::Image< InternalOneFilePixelType, DimensionOneFile > InternalOneFileImageType;
typedef itk::ImageFileReader< InternalOneFileImageType > ReaderType;
ReaderType::Pointer readerOneFile = ReaderType::New();
readerOneFile->SetFileName("E:/ITK/results/test80.DCM");
typedef itk::GDCMImageIO ImageIOType;
ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
readerOneFile->SetImageIO(gdcmImageIO);
try
{
readerOneFile->Update();
}
catch (itk::ExceptionObject & e)
{
std::cerr << "exception in file reader " << std::endl;
std::cerr << e << std::endl;
}
//平滑过滤器是使用图像类型作为模板参数实例化的。
typedef itk::CurvatureFlowImageFilter< InternalOneFileImageType, InternalOneFileImageType >
CurvatureFlowImageFilterTypeT;
CurvatureFlowImageFilterTypeT::Pointer smoothingT =
CurvatureFlowImageFilterTypeT::New();
//声明区域生长滤波器
typedef itk::ConnectedThresholdImageFilter< InternalOneFileImageType,
InternalOneFileImageType > ConnectedFilterTypeT;
//创建实例
ConnectedFilterTypeT::Pointer connectedThresholdT = ConnectedFilterTypeT::New();
//现在是时候连接一个简单的线性管道了。在管道的开头添加一个文件读取器,在结尾添加一个转换筛选器和写入程序。
//转换浮点像素类型为整数类型需要使用转换过滤器,因为只有少数图像文件格式支持浮点类型。
smoothingT->SetInput(readerOneFile->GetOutput());
connectedThresholdT->SetInput(smoothingT->GetOutput());
const InternalOneFilePixelType lowerThreshold = 30;
const InternalOneFilePixelType upperThreshold = 255;
connectedThresholdT->SetLower(lowerThreshold);
connectedThresholdT->SetUpper(upperThreshold);
//这个滤波器的输出是一个二值图像,除了提取的区域外,其他地方都是零值像素。使用方法选择区域内设置的强度值
connectedThresholdT->SetReplaceValue(255);
smoothingT->SetNumberOfIterations(2);
smoothingT->SetTimeStep(0.125);
smoothingT->Update();
InternalOneFileImageType::IndexType index1T;
index1T[0] = 158;
index1T[1] = 190;
connectedThresholdT->AddSeed(index1T);
InternalOneFileImageType::IndexType index2T;
index2T[0] = 192;
index2T[1] = 154;
connectedThresholdT->AddSeed(index2T);
InternalOneFileImageType::IndexType index3T;
index3T[0] = 217;
index3T[1] = 269;
connectedThresholdT->AddSeed(index3T);
InternalOneFileImageType::IndexType index4T;
index4T[0] = 381;
index4T[1] = 192;
connectedThresholdT->AddSeed(index4T);
connectedThresholdT->Update();
typedef unsigned short OutputUCharPixelType;
typedef itk::Image< OutputUCharPixelType, DimensionOneFile > OutputUCharImageType;
typedef itk::CastImageFilter< InternalOneFileImageType, OutputUCharImageType > CastingFilterTypeT;
CastingFilterTypeT::Pointer casterT1 = CastingFilterTypeT::New();
CastingFilterTypeT::Pointer casterT2 = CastingFilterTypeT::New();
typedef itk::ImageFileWriter< OutputUCharImageType > WriterType;
WriterType::Pointer writerOneFile = WriterType::New();
writerOneFile->SetFileName("E:/ITK/results/ITKFilterTest80.DCM");
casterT1->SetInput(connectedThresholdT->GetOutput());
casterT1->Update();
casterT2->SetInput(readerOneFile->GetOutput());
casterT2->Update();
typedef itk::AndImageFilter<OutputUCharImageType, OutputUCharImageType > mathFilterType;
mathFilterType::Pointer mathFilter = mathFilterType::New();
mathFilter->SetInput1(casterT1->GetOutput());
mathFilter->SetInput2(casterT2->GetOutput());
mathFilter->Update();
//writerOneFile->SetInput(mathFilter->GetOutput());//smoothingT->GetOutput()
//写入之前先用VTK显示
typedef itk::ImageToVTKImageFilter<OutputUCharImageType> ConnectorType2D; //connenct itk and vtk
ConnectorType2D::Pointer connector2D = ConnectorType2D::New();
connector2D->SetInput(mathFilter->GetOutput());
connector2D->Update();
vtkSmartPointer<vtkImageActor> actor =
vtkSmartPointer<vtkImageActor>::New();
actor->SetInputData(connector2D->GetOutput());
vtkSmartPointer<vtkRenderer> render =
vtkSmartPointer<vtkRenderer>::New();
render->AddActor(actor);
render->ResetCamera();
render->SetBackground(1, 1, 1);
vtkSmartPointer<vtkRenderWindow> window =
vtkSmartPointer<vtkRenderWindow>::New();
window->AddRenderer(render);
window->SetSize(640, 480);
window->SetWindowName("ImageViewer3D");
window->Render();
/* rwi是vtk渲染窗口交互器对象。 */
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style1 =
vtkSmartPointer<vtkInteractorStyleImage>::New();
rwi->SetInteractorStyle(style1);
rwi->SetRenderWindow(window);
rwi->Initialize();
rwi->Start();
//如果把typedef unsigned short OutputUCharPixelType 换成 typedef unsigned char //OutputUCharPixelType;再把下一行放开,会出现错误图像,不放开,又会报错
// writerOneFile->UseInputMetaDataDictionaryOff();
writerOneFile->SetInput(mathFilter->GetOutput());
writerOneFile->SetImageIO(gdcmImageIO);
try
{
writerOneFile->Update();
}
catch (itk::ExceptionObject & excep)
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
return 1;
}