17 #include <vtkDoubleArray.h> 18 #include <vtkKdTree.h> 19 #include <vtkPointData.h> 20 #include <vtkPoints.h> 21 #include <vtkPolyVertex.h> 22 #include <vtkSmartPointer.h> 23 #include <vtkUnstructuredGrid.h> 27 this->SetNumberOfIndexedOutputs(1);
36 if (UnstructuredGridToUnstructuredGridFilter::GetNumberOfInputs() != 2)
38 MITK_ERROR <<
"Not enough input arguments for PointCloudScoringFilter" << std::endl;
42 DataObjectPointerArray inputs = UnstructuredGridToUnstructuredGridFilter::GetInputs();
46 if (edgeGrid->IsEmpty() || segmGrid->IsEmpty())
48 if (edgeGrid->IsEmpty())
49 MITK_ERROR <<
"edgeGrid is empty" << std::endl;
50 if (segmGrid->IsEmpty())
51 MITK_ERROR <<
"segmGrid is empty" << std::endl;
54 if (m_FilteredScores.size() > 0)
55 m_FilteredScores.clear();
57 vtkSmartPointer<vtkUnstructuredGrid> edgevtkGrid = edgeGrid->GetVtkUnstructuredGrid();
58 vtkSmartPointer<vtkUnstructuredGrid> segmvtkGrid = segmGrid->GetVtkUnstructuredGrid();
61 vtkSmartPointer<vtkPoints> kdPoints = vtkSmartPointer<vtkPoints>::New();
62 vtkSmartPointer<vtkKdTree> kdTree = vtkSmartPointer<vtkKdTree>::New();
64 for (
int i = 0; i < edgevtkGrid->GetNumberOfPoints(); i++)
66 kdPoints->InsertNextPoint(edgevtkGrid->GetPoint(i));
69 kdTree->BuildLocatorFromPoints(kdPoints);
72 vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
74 for (
int i = 0; i < segmvtkGrid->GetNumberOfPoints(); i++)
76 points->InsertNextPoint(segmvtkGrid->GetPoint(i));
79 std::vector<ScorePair> score;
80 std::vector<double> distances;
82 double dist_glob = 0.0;
85 for (
int i = 0; i < points->GetNumberOfPoints(); i++)
88 points->GetPoint(i, point);
89 kdTree->FindClosestPoint(point[0], point[1], point[2], dist);
91 distances.push_back(dist);
92 score.push_back(std::make_pair(i, dist));
95 double avg = dist_glob / points->GetNumberOfPoints();
100 for (
unsigned int i = 0; i < distances.size(); i++)
102 tmpVar = tmpVar + ((distances.at(i) - avg) * (distances.at(i) - avg));
103 if (distances.at(i) > highest)
104 highest = distances.at(i);
108 double cubicAll = 0.0;
109 for (
unsigned i = 0; i < score.size(); i++)
111 cubicAll = cubicAll + score.at(i).second * score.at(i).second * score.at(i).second;
113 double root2 = cubicAll /
static_cast<double>(score.size());
114 double cubic = pow(root2, 1.0 / 3.0);
117 double metricValue = cubic;
119 for (
unsigned int i = 0; i < score.size(); i++)
121 if (score.at(i).second > metricValue)
123 m_FilteredScores.push_back(std::make_pair(score.at(i).first, score.at(i).second));
127 m_NumberOfOutpPoints = m_FilteredScores.size();
129 vtkSmartPointer<vtkPoints> filteredPoints = vtkSmartPointer<vtkPoints>::New();
132 vtkSmartPointer<vtkDoubleArray> pointDataDistances = vtkSmartPointer<vtkDoubleArray>::New();
133 pointDataDistances->SetNumberOfComponents(1);
134 pointDataDistances->SetNumberOfTuples(m_FilteredScores.size());
135 pointDataDistances->SetName(
"Distances");
137 for (
unsigned int i = 0; i < m_FilteredScores.size(); i++)
140 point = segmvtkGrid->GetPoint(m_FilteredScores.at(i).first);
141 filteredPoints->InsertNextPoint(point[0], point[1], point[2]);
142 if (score.at(i).second > 0.001)
144 double dist[1] = {score.at(i).second};
145 pointDataDistances->InsertTuple(i, dist);
149 double dist[1] = {0.0};
150 pointDataDistances->InsertTuple(i, dist);
154 unsigned int numPoints = filteredPoints->GetNumberOfPoints();
156 vtkSmartPointer<vtkPolyVertex> verts = vtkSmartPointer<vtkPolyVertex>::New();
158 verts->GetPointIds()->SetNumberOfIds(numPoints);
159 for (
unsigned int i = 0; i < numPoints; i++)
161 verts->GetPointIds()->SetId(i, i);
164 vtkSmartPointer<vtkUnstructuredGrid> uGrid = vtkSmartPointer<vtkUnstructuredGrid>::New();
167 uGrid->InsertNextCell(verts->GetCellType(), verts->GetPointIds());
168 uGrid->SetPoints(filteredPoints);
169 uGrid->GetPointData()->AddArray(pointDataDistances);
172 outputGrid->SetVtkUnstructuredGrid(uGrid);
173 this->SetNthOutput(0, outputGrid);
181 Superclass::GenerateOutputInformation();
PointCloudScoringFilter()
void GenerateOutputInformation() override
~PointCloudScoringFilter() override
Class for storing unstructured grids (vtkUnstructuredGrid)
void GenerateData() override