3 #include <cpExtensions/IO/MementoState.h>
5 #include <vtkSmartPointer.h>
6 #include <vtkRenderWindow.h>
7 #include <vtkRenderWindowInteractor.h>
8 #include <vtkRenderer.h>
10 #include <vtkImageCast.h>
11 #include <vtkMetaImageWriter.h>
12 #include <vtkMetaImageReader.h>
13 #include <vtkImageMandelbrotSource.h>
14 #include <vtkImageActor.h>
15 #include <vtkRenderWindowInteractor.h>
18 #include <itkBinaryErodeImageFilter.h>
19 #include <itkBinaryBallStructuringElement.h>
20 #include <itkImageFileReader.h>
22 #include <itkImageToVTKImageFilter.h>
23 #include <itkVTKImageToImageFilter.h>
24 #include <itkBinaryThresholdImageFilter.h>
25 #include <itkInvertIntensityImageFilter.h>
27 typedef itk::Image<unsigned char, 2> ImageType;
28 typedef itk::ImageFileReader<ImageType> ReaderType;
30 typedef cpPlugins::Interface::Image TPluginImage;
33 auto memento = cpExtensions::IO::MementoState();
38 std::string filePath = "julia_mha.mhd";
39 std::string filePathRaw = "julia_mha.raw";
41 vtkSmartPointer<vtkImageMandelbrotSource> source =
42 vtkSmartPointer<vtkImageMandelbrotSource>::New();
44 vtkSmartPointer<vtkImageCast> castFilter =
45 vtkSmartPointer<vtkImageCast>::New();
46 castFilter->SetOutputScalarTypeToUnsignedChar();
47 castFilter->SetInputConnection(source->GetOutputPort());
50 vtkSmartPointer<vtkMetaImageWriter> writer =
51 vtkSmartPointer<vtkMetaImageWriter>::New();
52 writer->SetInputConnection(castFilter->GetOutputPort());
53 writer->SetFileName(filePath.c_str());
54 writer->SetRAWFileName(filePathRaw.c_str());
57 //ReaderType::Pointer reader = ReaderType::New();
58 vtkSmartPointer<vtkMetaImageReader> reader =
59 vtkSmartPointer<vtkMetaImageReader>::New();
60 reader->SetFileName(filePath.c_str());
64 /* auto obj = TPluginImage::New();
66 auto oo = dynamic_cast<cpPlugins::Interface::Image *> (reader->GetOutput());
68 memento.SetToMemento(oo);*/
70 // filter 1 (state 2) ---------------------------------------------------------------
72 typedef itk::BinaryBallStructuringElement<
73 ImageType::PixelType, 2> StructuringElementType;
74 StructuringElementType structuringElement;
75 structuringElement.SetRadius(10);
76 structuringElement.CreateStructuringElement();
78 typedef itk::VTKImageToImageFilter<ImageType> imgToFilter;
79 imgToFilter::Pointer connectorimg = imgToFilter::New();
80 connectorimg->SetInput(reader->GetOutput());
81 connectorimg->Update();
83 typedef itk::BinaryErodeImageFilter<ImageType, ImageType, StructuringElementType>
84 BinaryErodeImageFilterType;
86 BinaryErodeImageFilterType::Pointer erodeFilter
87 = BinaryErodeImageFilterType::New();
88 erodeFilter->SetInput(connectorimg->GetOutput());
89 erodeFilter->SetKernel(structuringElement);
91 // filter 2 (state 3) ---------------------------------------------------------------
93 typedef itk::BinaryThresholdImageFilter<ImageType, ImageType>
94 BinaryThresholdImageFilterType;
96 BinaryThresholdImageFilterType::Pointer thresholdFilter
97 = BinaryThresholdImageFilterType::New();
98 thresholdFilter->SetInput(erodeFilter->GetOutput());
99 thresholdFilter->SetLowerThreshold(10);
100 thresholdFilter->SetUpperThreshold(30);
101 thresholdFilter->SetInsideValue(255);
102 thresholdFilter->SetOutsideValue(0);
105 // filter 3 (state 4) ---------------------------------------------------------------
107 typedef itk::InvertIntensityImageFilter <ImageType>
108 InvertIntensityImageFilterType;
110 InvertIntensityImageFilterType::Pointer invertIntensityFilter
111 = InvertIntensityImageFilterType::New();
112 invertIntensityFilter->SetInput(thresholdFilter->GetOutput());
113 invertIntensityFilter->SetMaximum(255);
115 // undo (state 3) ---------------------------------------------------------------
117 // undo (state 2) ---------------------------------------------------------------
119 // redo (state 3) ---------------------------------------------------------------
121 // visualization -- just for test
123 typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
124 ConnectorType::Pointer connector = ConnectorType::New();
125 connector->SetInput(invertIntensityFilter->GetOutput());
128 vtkSmartPointer<vtkImageActor> actor =
129 vtkSmartPointer<vtkImageActor>::New();
130 actor->GetMapper()->SetInputData(connector->GetOutput());
132 vtkSmartPointer<vtkRenderer> renderer =
133 vtkSmartPointer<vtkRenderer>::New();
134 vtkSmartPointer<vtkRenderWindow> renderWindow =
135 vtkSmartPointer<vtkRenderWindow>::New();
136 renderWindow->AddRenderer(renderer);
137 vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
138 vtkSmartPointer<vtkRenderWindowInteractor>::New();
139 renderWindowInteractor->SetRenderWindow(renderWindow);
141 renderer->AddActor(actor);
142 renderer->SetBackground(.2, .3, .4);
144 renderWindow->Render();
145 renderWindowInteractor->Start();
151 // std::cout << "wait for close";