-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMorphologicalDistanceTransform.cpp
108 lines (93 loc) · 4.74 KB
/
MorphologicalDistanceTransform.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "mainwindow.h"
#include "ui_mainwindow.h"
//Morphological distance transform
void MainWindow::OnShowMorphologicalDistanceTransformClicked()
{
/* vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
reader->SetFileName((const char*)filename.toStdString().c_str());
reader->Update();
vtkSmartPointer<vtkImageCast> castFilter =
vtkSmartPointer<vtkImageCast>::New();
castFilter->SetOutputScalarTypeToShort();
castFilter->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkImageCityBlockDistance> cityBlockDistanceFilter =
vtkSmartPointer<vtkImageCityBlockDistance>::New();
cityBlockDistanceFilter->SetInputConnection(castFilter->GetOutputPort());
cityBlockDistanceFilter->SetDimensionality(2);
cityBlockDistanceFilter->Update();
// Create actors
vtkSmartPointer<vtkImageCast> inputCastFilter =
vtkSmartPointer<vtkImageCast>::New();
inputCastFilter->SetOutputScalarTypeToUnsignedChar();
inputCastFilter->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkImageActor> inputActor =
vtkSmartPointer<vtkImageActor>::New();
inputActor->GetMapper()->SetInputConnection(inputCastFilter->GetOutputPort());
vtkSmartPointer<vtkImageCast> distanceCastFilter =
vtkSmartPointer<vtkImageCast>::New();
distanceCastFilter->SetOutputScalarTypeToUnsignedChar();
distanceCastFilter->SetInputConnection(cityBlockDistanceFilter->GetOutputPort());
vtkSmartPointer<vtkImageActor> distanceActor =
vtkSmartPointer<vtkImageActor>::New();
distanceActor->GetMapper()->SetInputConnection(
distanceCastFilter->GetOutputPort());
// Define viewport ranges
// (xmin, ymin, xmax, ymax)
double inputViewport[4] = {0.0, 0.0, 0.5, 1.0};
double distanceViewport[4] = {0.5, 0.0, 1.0, 1.0};
// Setup renderers
vtkSmartPointer<vtkRenderer> inputRenderer =
vtkSmartPointer<vtkRenderer>::New();
inputRenderer->SetViewport(inputViewport);
inputRenderer->AddActor(inputActor);
inputRenderer->ResetCamera();
inputRenderer->SetBackground(.4, .5, .9);
vtkSmartPointer<vtkRenderer> distanceRenderer =
vtkSmartPointer<vtkRenderer>::New();
distanceRenderer->SetViewport(distanceViewport);
distanceRenderer->AddActor(distanceActor);
distanceRenderer->ResetCamera();
distanceRenderer->SetBackground(.4, .5, .7);
ui->qvtkWidget_4->GetRenderWindow()->AddRenderer(inputRenderer);
ui->qvtkWidget_4->GetRenderWindow()->AddRenderer(distanceRenderer);
ui->qvtkWidget_4->GetRenderWindow()->Render();
*/
typedef itk::Image<unsigned char, 2> UnsignedCharImageType;
typedef itk::Image<float, 2> FloatImageType;
UnsignedCharImageType::Pointer image = UnsignedCharImageType::New();
typedef unsigned char InputPixelType;
typedef unsigned char OutputPixelType;
typedef itk::Image< InputPixelType, 2 > InputImageType;
typedef itk::Image< OutputPixelType, 2 > OutputImageType;
typedef itk::Image<unsigned char, 2> ImageType;
typedef itk::ImageFileReader<InputImageType> ReaderType;
typedef itk::ImageToVTKImageFilter<FloatImageType> ConnectorType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName((const char*)filename.toStdString().c_str());
reader->Update();
image = reader->GetOutput();
typedef itk::ApproximateSignedDistanceMapImageFilter< UnsignedCharImageType, FloatImageType >
ApproximateSignedDistanceMapImageFilterType;
ApproximateSignedDistanceMapImageFilterType::Pointer approximateSignedDistanceMapImageFilter =
ApproximateSignedDistanceMapImageFilterType::New();
approximateSignedDistanceMapImageFilter->SetInput(image);
approximateSignedDistanceMapImageFilter->SetInsideValue(255);
approximateSignedDistanceMapImageFilter->SetOutsideValue(0);
ConnectorType::Pointer connector = ConnectorType::New();
connector->SetInput(approximateSignedDistanceMapImageFilter->GetOutput());
vtkSmartPointer<vtkImageActor> actor =
vtkSmartPointer<vtkImageActor>::New();
#if VTK_MAJOR_VERSION <= 5
actor->SetInput(connector->GetOutput());
#else
connector->Update();
actor->GetMapper()->SetInputData(connector->GetOutput());
#endif
vtkSmartPointer<vtkRenderer> distanceRenderer =
vtkSmartPointer<vtkRenderer>::New();
distanceRenderer->AddActor(actor);
distanceRenderer->ResetCamera();
ui->qvtkWidget_4->GetRenderWindow()->AddRenderer(distanceRenderer);
//ui->qvtkWidget_4->GetRenderWindow()->AddRenderer(originalRenderer);
ui->qvtkWidget_4->GetRenderWindow()->Render();
}