#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkMetaDataDictionary.h"
#include "itkImageToVTKImageFilter.h"
#include "itkImageFileWriter.h"
#include "itkGDCMImageIO.h"
#include "itksys/SystemTools.hxx"
#include "itkConnectedThresholdImageFilter.h"
#include "itkMaskImageFilter.h"
#include "itkMetaDataObject.h"
#include "vtkImageViewer.h"
#include "vtkImageActor.h"
#include "vtkRenderer.h"
#include "vtkInteractorStyleImage.h"
#include "vtkAutoInit.h"
#include "vtkSmartPointer.h"
#include "vtkRenderWindowInteractor.h"
#include <iostream>
#include <string>
#include <sstream>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingContextOpenGL2)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
using namespace std;
int main(int argc, char *argv[])
{
const unsigned int Dimension = 2;
typedef signed short PixelType;
typedef itk::Image<PixelType, Dimension> InputImageType;
typedef itk::ImageFileReader<InputImageType> ReaderType;
// for (int num = 0; num<214; num++)
{
std::string inputFilename = "E:\\ITK\\results\\test80.DCM";
std::string outputFilename = "E:\\ITK\\results\\component.DCM";
itk::GDCMImageIO::Pointer gdcmimage = itk::GDCMImageIO::New();
ReaderType::Pointer reader = ReaderType::New();
reader->SetImageIO(gdcmimage);
reader->SetFileName(inputFilename);
reader->Update();
typedef itk::MetaDataDictionary DictionaryType;
DictionaryType& dictionary = gdcmimage->GetMetaDataDictionary();
typedef itk::ConnectedThresholdImageFilter<InputImageType, InputImageType> ConnectedImageFilter;
ConnectedImageFilter::Pointer connectedFilter = ConnectedImageFilter::New();
connectedFilter->SetInput(reader->GetOutput());
connectedFilter->SetLower(30);
connectedFilter->SetUpper(1000);
InputImageType::IndexType index;
index[0] = 215;
index[1] = 256;
connectedFilter->SetSeed(index);
connectedFilter->SetReplaceValue(255);
typedef itk::MaskImageFilter<InputImageType, InputImageType> MaskFilterType;
MaskFilterType::Pointer maskFilter = MaskFilterType::New();
maskFilter->SetInput(reader->GetOutput());
maskFilter->SetMaskImage(connectedFilter->GetOutput());
typedef itk::MetaDataObject< std::string > MetaDataStringType;
DictionaryType::ConstIterator iter = dictionary.Begin();
DictionaryType::ConstIterator end = dictionary.End();
while (iter != end)
{
itk::MetaDataObjectBase::Pointer entry = iter->second;
MetaDataStringType::Pointer entryvalue =
dynamic_cast<MetaDataStringType *>(entry.GetPointer());
if (entryvalue)
{
std::string tagkey = iter->first;
std::string tagvalue = entryvalue->GetMetaDataObjectValue();
std::cout << "(" << tagkey << ") " << tagvalue.c_str() << std::endl;
}
iter++;
}
//写入之前先用VTK显示
typedef itk::ImageToVTKImageFilter<InputImageType> ConnectorType2D; //connenct itk and vtk
ConnectorType2D::Pointer connector2D = ConnectorType2D::New();
connector2D->SetInput(maskFilter->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 itk::ImageFileWriter< InputImageType > WriterType;
WriterType::Pointer writer = WriterType::New();
writer->SetImageIO(gdcmimage);
writer->SetFileName(outputFilename);
writer->SetInput(maskFilter->GetOutput() );
try
{
writer->Update();
}
catch (itk::ExceptionObject & excep)
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
}
return EXIT_SUCCESS;
}
原图
分割后的图