14#include "ui_QmitkUSNavigationStepCtUsRegistration.h"
24#include <mitkNodePredicateNot.h>
25#include <mitkNodePredicateProperty.h>
26#include <mitkLabelSetImage.h>
27#include "mitkProperties.h"
29#include <mitkImageCast.h>
31#include <mitkRenderingManager.h>
34#include <vtkLandmarkTransform.h>
37#include <itkImageRegionIterator.h>
38#include <itkGeometryUtilities.h>
39#include <mitkImagePixelReadAccessor.h>
41#include <itkZeroCrossingImageFilter.h>
42#include <itkSimpleContourExtractorImageFilter.h>
43#include <itkCannyEdgeDetectionImageFilter.h>
45static const int NUMBER_FIDUCIALS_NEEDED = 8;
50 m_PerformingGroundTruthProtocolEvaluation(false),
51 m_FloatingImageToUltrasoundRegistrationFilter(nullptr),
52 m_FreezeCombinedModality(false)
67 MITK_INFO <<
"OnStartStep()";
73 MITK_INFO <<
"OnStopStep()";
79 MITK_INFO <<
"OnFinishStep()";
85 MITK_INFO <<
"OnActivateStep()";
87 ui->ctImagesToChooseComboBox->SetDataStorage(this->
GetDataStorage());
89 ui->selectedSurfaceComboBox->SetDataStorage(this->
GetDataStorage());
91 m_FloatingImageToUltrasoundRegistrationFilter =
92 mitk::FloatingImageToUltrasoundRegistrationFilter::New();
98 MITK_INFO <<
"OnDeactivateStep()";
104 if (m_NavigationDataSource.IsNull()) {
return; }
106 m_NavigationDataSource->Update();
107 m_FloatingImageToUltrasoundRegistrationFilter->Update();
112 Q_UNUSED(settingsNode);
117 return "CT-to-US registration";
127 mitk::AbstractUltrasoundTrackerDevice::Pointer combinedModality = this->
GetCombinedModality(
false);
128 if (combinedModality.IsNotNull())
130 m_NavigationDataSource = combinedModality->GetNavigationDataSource();
137 m_ImageDimension[0] = 0;
138 m_ImageDimension[1] = 0;
139 m_ImageDimension[2] = 0;
141 m_ImageSpacing[0] = 1;
142 m_ImageSpacing[1] = 1;
143 m_ImageSpacing[2] = 1;
148 m_ImageDimension[0] = image->GetDimension(0);
149 m_ImageDimension[1] = image->GetDimension(1);
150 m_ImageDimension[2] = image->GetDimension(2);
152 m_ImageSpacing[0] = image->GetGeometry()->GetSpacing()[0];
153 m_ImageSpacing[1] = image->GetGeometry()->GetSpacing()[1];
154 m_ImageSpacing[2] = image->GetGeometry()->GetSpacing()[2];
159 if (m_FloatingImage.IsNull())
164 MITK_INFO <<
"ImageSpacing = " << m_ImageSpacing;
165 return m_ImageSpacing[0] * m_ImageSpacing[1] * m_ImageSpacing[2];
170 return 1.333333333 * 3.141592 * (radius * radius * radius);
175 if (m_FloatingImage.IsNull())
180 ImageType::Pointer itkImage1 = ImageType::New();
181 mitk::CastToItkImage(m_FloatingImage, itkImage1);
185 m_ThresholdFilter->SetInput(itkImage1);
186 m_LaplacianFilter1->SetInput(m_ThresholdFilter->GetOutput());
187 m_LaplacianFilter2->SetInput(m_LaplacianFilter1->GetOutput());
188 m_BinaryThresholdFilter->SetInput(m_LaplacianFilter2->GetOutput());
189 m_HoleFillingFilter->SetInput(m_BinaryThresholdFilter->GetOutput());
190 m_BinaryImageToShapeLabelMapFilter->SetInput(m_HoleFillingFilter->GetOutput());
191 m_BinaryImageToShapeLabelMapFilter->Update();
193 ImageType::Pointer binaryImage = ImageType::New();
194 binaryImage = m_HoleFillingFilter->GetOutput();
204 m_ThresholdFilter = itk::ThresholdImageFilter<ImageType>::New();
205 m_ThresholdFilter->SetOutsideValue(0);
206 m_ThresholdFilter->SetLower(500);
207 m_ThresholdFilter->SetUpper(3200);
210 m_BinaryThresholdFilter = BinaryThresholdImageFilterType::New();
211 m_BinaryThresholdFilter->SetOutsideValue(0);
212 m_BinaryThresholdFilter->SetInsideValue(1);
213 m_BinaryThresholdFilter->SetLowerThreshold(350);
214 m_BinaryThresholdFilter->SetUpperThreshold(10000);
217 m_LaplacianFilter1 = LaplacianRecursiveGaussianImageFilterType::New();
218 m_LaplacianFilter2 = LaplacianRecursiveGaussianImageFilterType::New();
221 m_HoleFillingFilter = VotingBinaryIterativeHoleFillingImageFilterType::New();
222 VotingBinaryIterativeHoleFillingImageFilterType::InputSizeType radius;
224 m_HoleFillingFilter->SetRadius(radius);
225 m_HoleFillingFilter->SetBackgroundValue(0);
226 m_HoleFillingFilter->SetForegroundValue(1);
227 m_HoleFillingFilter->SetMaximumNumberOfIterations(5);
230 m_BinaryImageToShapeLabelMapFilter = BinaryImageToShapeLabelMapFilterType::New();
231 m_BinaryImageToShapeLabelMapFilter->SetInputForegroundValue(1);
236 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
255 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
274 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
293 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
312 if (m_MarkerModelCoordinateSystemPointSet.IsNull())
314 m_MarkerModelCoordinateSystemPointSet = mitk::PointSet::New();
318 m_MarkerModelCoordinateSystemPointSet->Clear();
321 mitk::Point3D fiducial1;
322 mitk::Point3D fiducial2;
323 mitk::Point3D fiducial3;
324 mitk::Point3D fiducial4;
325 mitk::Point3D fiducial5;
326 mitk::Point3D fiducial6;
327 mitk::Point3D fiducial7;
328 mitk::Point3D fiducial8;
332 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
438 m_MarkerModelCoordinateSystemPointSet->InsertPoint(0, fiducial1);
439 m_MarkerModelCoordinateSystemPointSet->InsertPoint(1, fiducial2);
440 m_MarkerModelCoordinateSystemPointSet->InsertPoint(2, fiducial3);
441 m_MarkerModelCoordinateSystemPointSet->InsertPoint(3, fiducial4);
442 m_MarkerModelCoordinateSystemPointSet->InsertPoint(4, fiducial5);
443 m_MarkerModelCoordinateSystemPointSet->InsertPoint(5, fiducial6);
444 m_MarkerModelCoordinateSystemPointSet->InsertPoint(6, fiducial7);
445 m_MarkerModelCoordinateSystemPointSet->InsertPoint(7, fiducial8);
465 m_PointsToTransformGroundTruthProtocol.clear();
467 mitk::Point3D point0mm;
468 mitk::Point3D point20mm;
469 mitk::Point3D point40mm;
470 mitk::Point3D point60mm;
471 mitk::Point3D point80mm;
472 mitk::Point3D point100mm;
498 m_PointsToTransformGroundTruthProtocol.insert(std::pair<int, mitk::Point3D>(0, point0mm));
499 m_PointsToTransformGroundTruthProtocol.insert(std::pair<int, mitk::Point3D>(20, point20mm));
500 m_PointsToTransformGroundTruthProtocol.insert(std::pair<int, mitk::Point3D>(40, point40mm));
501 m_PointsToTransformGroundTruthProtocol.insert(std::pair<int, mitk::Point3D>(60, point60mm));
502 m_PointsToTransformGroundTruthProtocol.insert(std::pair<int, mitk::Point3D>(80, point80mm));
503 m_PointsToTransformGroundTruthProtocol.insert(std::pair<int, mitk::Point3D>(100, point100mm));
510 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
514 MITK_WARN <<
"For this marker configuration (10mm) there does not exist a point to transform.";
518 m_PointsToTransformGroundTruthProtocol.at(0)[0] = 130;
519 m_PointsToTransformGroundTruthProtocol.at(0)[1] = 15;
520 m_PointsToTransformGroundTruthProtocol.at(0)[2] = -7;
522 m_PointsToTransformGroundTruthProtocol.at(20)[0] = 130;
523 m_PointsToTransformGroundTruthProtocol.at(20)[1] = 15;
524 m_PointsToTransformGroundTruthProtocol.at(20)[2] = -27;
526 m_PointsToTransformGroundTruthProtocol.at(40)[0] = 130;
527 m_PointsToTransformGroundTruthProtocol.at(40)[1] = 15;
528 m_PointsToTransformGroundTruthProtocol.at(40)[2] = -47;
530 m_PointsToTransformGroundTruthProtocol.at(60)[0] = 130;
531 m_PointsToTransformGroundTruthProtocol.at(60)[1] = 15;
532 m_PointsToTransformGroundTruthProtocol.at(60)[2] = -67;
534 m_PointsToTransformGroundTruthProtocol.at(80)[0] = 130;
535 m_PointsToTransformGroundTruthProtocol.at(80)[1] = 15;
536 m_PointsToTransformGroundTruthProtocol.at(80)[2] = -87;
538 m_PointsToTransformGroundTruthProtocol.at(100)[0] = 130;
539 m_PointsToTransformGroundTruthProtocol.at(100)[1] = 15;
540 m_PointsToTransformGroundTruthProtocol.at(100)[2] = -107;
545 m_PointsToTransformGroundTruthProtocol.at(0)[0] = 135;
546 m_PointsToTransformGroundTruthProtocol.at(0)[1] = 20;
547 m_PointsToTransformGroundTruthProtocol.at(0)[2] = -9;
549 m_PointsToTransformGroundTruthProtocol.at(20)[0] = 135;
550 m_PointsToTransformGroundTruthProtocol.at(20)[1] = 20;
551 m_PointsToTransformGroundTruthProtocol.at(20)[2] = -29;
553 m_PointsToTransformGroundTruthProtocol.at(40)[0] = 135;
554 m_PointsToTransformGroundTruthProtocol.at(40)[1] = 20;
555 m_PointsToTransformGroundTruthProtocol.at(40)[2] = -49;
557 m_PointsToTransformGroundTruthProtocol.at(60)[0] = 135;
558 m_PointsToTransformGroundTruthProtocol.at(60)[1] = 20;
559 m_PointsToTransformGroundTruthProtocol.at(60)[2] = -69;
561 m_PointsToTransformGroundTruthProtocol.at(80)[0] = 135;
562 m_PointsToTransformGroundTruthProtocol.at(80)[1] = 20;
563 m_PointsToTransformGroundTruthProtocol.at(80)[2] = -89;
565 m_PointsToTransformGroundTruthProtocol.at(100)[0] = 135;
566 m_PointsToTransformGroundTruthProtocol.at(100)[1] = 20;
567 m_PointsToTransformGroundTruthProtocol.at(100)[2] = -109;
574 if (m_GroundTruthProtocolTransformedPoints.find(0) == m_GroundTruthProtocolTransformedPoints.end())
576 mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
577 pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(0)));
578 m_GroundTruthProtocolTransformedPoints.insert(std::pair<int, mitk::PointSet::Pointer>(0, pointSet));
582 m_GroundTruthProtocolTransformedPoints.at(0)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(0)));
585 if (m_GroundTruthProtocolTransformedPoints.find(20) == m_GroundTruthProtocolTransformedPoints.end())
587 mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
588 pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(20)));
589 m_GroundTruthProtocolTransformedPoints.insert(std::pair<int, mitk::PointSet::Pointer>(20, pointSet));
593 m_GroundTruthProtocolTransformedPoints.at(20)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(20)));
596 if (m_GroundTruthProtocolTransformedPoints.find(40) == m_GroundTruthProtocolTransformedPoints.end())
598 mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
599 pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(40)));
600 m_GroundTruthProtocolTransformedPoints.insert(std::pair<int, mitk::PointSet::Pointer>(40, pointSet));
604 m_GroundTruthProtocolTransformedPoints.at(40)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(40)));
607 if (m_GroundTruthProtocolTransformedPoints.find(60) == m_GroundTruthProtocolTransformedPoints.end())
609 mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
610 pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(60)));
611 m_GroundTruthProtocolTransformedPoints.insert(std::pair<int, mitk::PointSet::Pointer>(60, pointSet));
615 m_GroundTruthProtocolTransformedPoints.at(60)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(60)));
618 if (m_GroundTruthProtocolTransformedPoints.find(80) == m_GroundTruthProtocolTransformedPoints.end())
620 mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
621 pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(80)));
622 m_GroundTruthProtocolTransformedPoints.insert(std::pair<int, mitk::PointSet::Pointer>(80, pointSet));
626 m_GroundTruthProtocolTransformedPoints.at(80)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(80)));
629 if (m_GroundTruthProtocolTransformedPoints.find(100) == m_GroundTruthProtocolTransformedPoints.end())
631 mitk::PointSet::Pointer pointSet = mitk::PointSet::New();
632 pointSet->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(100)));
633 m_GroundTruthProtocolTransformedPoints.insert(std::pair<int, mitk::PointSet::Pointer>(100, pointSet));
637 m_GroundTruthProtocolTransformedPoints.at(100)->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(m_PointsToTransformGroundTruthProtocol.at(100)));
644 if (m_GroundTruthProtocolTransformedPoints.find(0) == m_GroundTruthProtocolTransformedPoints.end() ||
645 m_GroundTruthProtocolTransformedPoints.find(20) == m_GroundTruthProtocolTransformedPoints.end() ||
646 m_GroundTruthProtocolTransformedPoints.find(40) == m_GroundTruthProtocolTransformedPoints.end() ||
647 m_GroundTruthProtocolTransformedPoints.find(60) == m_GroundTruthProtocolTransformedPoints.end() ||
648 m_GroundTruthProtocolTransformedPoints.find(80) == m_GroundTruthProtocolTransformedPoints.end() ||
649 m_GroundTruthProtocolTransformedPoints.find(100) == m_GroundTruthProtocolTransformedPoints.end())
652 msgBox.setText(
"Cannot add transformed Points to DataStorage because they do not exist.\
653 Stopping evaluation the protocol.");
658 std::string nameNode0mm =
"GroundTruthProt-Depth0mm";
659 std::string nameNode20mm =
"GroundTruthProt-Depth20mm";
660 std::string nameNode40mm =
"GroundTruthProt-Depth40mm";
661 std::string nameNode60mm =
"GroundTruthProt-Depth60mm";
662 std::string nameNode80mm =
"GroundTruthProt-Depth80mm";
663 std::string nameNode100mm =
"GroundTruthProt-Depth100mm";
666 mitk::DataNode::Pointer node0mm = this->
GetDataStorage()->GetNamedNode(nameNode0mm);
667 if (node0mm.IsNull())
669 node0mm = mitk::DataNode::New();
670 node0mm->SetName(nameNode0mm);
671 node0mm->SetData(m_GroundTruthProtocolTransformedPoints.at(0));
676 node0mm->SetData(m_GroundTruthProtocolTransformedPoints.at(0));
680 if(ui->protocolEvaluationTypeComboBox->currentText().compare(
"PLANE") == 0 )
683 mitk::DataNode::Pointer node20mm = this->
GetDataStorage()->GetNamedNode(nameNode20mm);
684 if (node20mm.IsNull())
686 node20mm = mitk::DataNode::New();
687 node20mm->SetName(nameNode20mm);
688 node20mm->SetData(m_GroundTruthProtocolTransformedPoints.at(20));
693 node20mm->SetData(m_GroundTruthProtocolTransformedPoints.at(20));
698 mitk::DataNode::Pointer node40mm = this->
GetDataStorage()->GetNamedNode(nameNode40mm);
699 if (node40mm.IsNull())
701 node40mm = mitk::DataNode::New();
702 node40mm->SetName(nameNode40mm);
703 node40mm->SetData(m_GroundTruthProtocolTransformedPoints.at(40));
708 node40mm->SetData(m_GroundTruthProtocolTransformedPoints.at(40));
713 mitk::DataNode::Pointer node60mm = this->
GetDataStorage()->GetNamedNode(nameNode60mm);
714 if (node60mm.IsNull())
716 node60mm = mitk::DataNode::New();
717 node60mm->SetName(nameNode60mm);
718 node60mm->SetData(m_GroundTruthProtocolTransformedPoints.at(60));
723 node60mm->SetData(m_GroundTruthProtocolTransformedPoints.at(60));
728 mitk::DataNode::Pointer node80mm = this->
GetDataStorage()->GetNamedNode(nameNode80mm);
729 if (node80mm.IsNull())
731 node80mm = mitk::DataNode::New();
732 node80mm->SetName(nameNode80mm);
733 node80mm->SetData(m_GroundTruthProtocolTransformedPoints.at(80));
738 node80mm->SetData(m_GroundTruthProtocolTransformedPoints.at(80));
743 mitk::DataNode::Pointer node100mm = this->
GetDataStorage()->GetNamedNode(nameNode100mm);
744 if (node100mm.IsNull())
746 node100mm = mitk::DataNode::New();
747 node100mm->SetName(nameNode100mm);
748 node100mm->SetData(m_GroundTruthProtocolTransformedPoints.at(100));
753 node100mm->SetData(m_GroundTruthProtocolTransformedPoints.at(100));
758 mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(this->
GetDataStorage());
763 double meanFRE = 0.0;
764 for (
unsigned int counter = 0; counter < m_GroundTruthProtocolFRE.size(); ++counter)
766 meanFRE += m_GroundTruthProtocolFRE[counter];
769 return meanFRE / m_GroundTruthProtocolFRE.size();
774 double variance = 0.0;
776 for (
unsigned int counter = 0; counter < m_GroundTruthProtocolFRE.size(); ++counter)
778 variance += ((meanFRE - m_GroundTruthProtocolFRE[counter]) * (meanFRE - m_GroundTruthProtocolFRE[counter]));
780 variance /= m_GroundTruthProtocolFRE.size();
782 return sqrt(variance);
787 if (m_GroundTruthProtocolTransformedPoints.find(0) == m_GroundTruthProtocolTransformedPoints.end() ||
788 m_GroundTruthProtocolTransformedPoints.find(20) == m_GroundTruthProtocolTransformedPoints.end() ||
789 m_GroundTruthProtocolTransformedPoints.find(40) == m_GroundTruthProtocolTransformedPoints.end() ||
790 m_GroundTruthProtocolTransformedPoints.find(60) == m_GroundTruthProtocolTransformedPoints.end() ||
791 m_GroundTruthProtocolTransformedPoints.find(80) == m_GroundTruthProtocolTransformedPoints.end() ||
792 m_GroundTruthProtocolTransformedPoints.find(100) == m_GroundTruthProtocolTransformedPoints.end())
795 msgBox.setText(
"Cannot calculate TRE of Ground-Truth-Protocol because points were not transformed.");
801 m_GroundTruthProtocolTRE.clear();
803 for (
int counter = 0;
804 m_GroundTruthProtocolTransformedPoints.find(counter) != m_GroundTruthProtocolTransformedPoints.end();
808 mitk::PointSet::Pointer pointSet = m_GroundTruthProtocolTransformedPoints.at(counter);
809 mitk::Point3D middlePoint;
810 middlePoint[0] = 0.0;
811 middlePoint[1] = 0.0;
812 middlePoint[2] = 0.0;
814 for (
int position = 0; position < pointSet->GetSize(); ++position)
816 middlePoint[0] += pointSet->GetPoint(position)[0];
817 middlePoint[1] += pointSet->GetPoint(position)[1];
818 middlePoint[2] += pointSet->GetPoint(position)[2];
820 middlePoint[0] /= pointSet->GetSize();
821 middlePoint[1] /= pointSet->GetSize();
822 middlePoint[2] /= pointSet->GetSize();
823 MITK_INFO <<
"Calculated MiddlePoint: " << middlePoint;
826 double meanDistance = 0.0;
827 for (
int position = 0; position < pointSet->GetSize(); ++position)
829 meanDistance += middlePoint.SquaredEuclideanDistanceTo(pointSet->GetPoint(position));
830 MITK_INFO <<
"SquaredEuclideanDistance: " << middlePoint.SquaredEuclideanDistanceTo(pointSet->GetPoint(position));
833 meanDistance /= pointSet->GetSize();
835 m_GroundTruthProtocolTRE.insert(std::pair<int, double>(counter, sqrt(meanDistance)));
836 MITK_INFO <<
"Ground-Truth-Protocol TRE: " << sqrt(meanDistance);
842 ImageType::Pointer binaryImage)
844 BinaryImageToShapeLabelMapFilterType::OutputImageType::Pointer labelMap =
845 m_BinaryImageToShapeLabelMapFilter->GetOutput();
847 double fiducialVolume;
848 unsigned int numberOfPixels;
850 if (ui->fiducialDiameter3mmRadioButton->isChecked())
853 numberOfPixels = ceil(fiducialVolume / voxelVolume);
858 numberOfPixels = ceil(fiducialVolume / voxelVolume);
861 MITK_INFO <<
"Voxel Volume = " << voxelVolume <<
"; Fiducial Volume = " << fiducialVolume;
862 MITK_INFO <<
"Number of pixels = " << numberOfPixels;
864 labelMap = m_BinaryImageToShapeLabelMapFilter->GetOutput();
866 MITK_INFO <<
"There are " << labelMap->GetNumberOfLabelObjects() <<
" objects.";
869 for (
int i = labelMap->GetNumberOfLabelObjects() - 1; i >= 0; --i)
872 BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = labelMap->GetNthLabelObject(i);
873 MITK_INFO <<
"Object " << i <<
" contains " << labelObject->Size() <<
" pixel";
877 if (labelObject->Size() < numberOfPixels * 0.8)
879 for (
unsigned int pixelId = 0; pixelId < labelObject->Size(); pixelId++)
881 binaryImage->SetPixel(labelObject->GetIndex(pixelId), 0);
883 labelMap->RemoveLabelObject(labelObject);
890 if (m_CentroidsOfFiducialCandidates.size() < NUMBER_FIDUCIALS_NEEDED)
895 for (
unsigned int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
897 int amountOfAcceptedFiducials = 0;
898 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
906 for (
unsigned int position = 0; position < m_CentroidsOfFiducialCandidates.size(); ++position)
908 if (position == counter)
912 mitk::Point3D otherCentroid(m_CentroidsOfFiducialCandidates.at(position));
913 double distance = fiducialCentroid.EuclideanDistanceTo(otherCentroid);
915 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
919 if (distance > 7.93 && distance < 31.0)
921 ++amountOfAcceptedFiducials;
926 if (distance > 11.895 && distance < 45.0)
928 ++amountOfAcceptedFiducials;
933 if (distance > 15.86 && distance < 59.0)
935 ++amountOfAcceptedFiducials;
942 if (amountOfAcceptedFiducials < NUMBER_FIDUCIALS_NEEDED - 1)
944 MITK_INFO <<
"Deleting fiducial candidate at position: " <<
945 m_CentroidsOfFiducialCandidates.at(counter);
946 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
947 if (m_CentroidsOfFiducialCandidates.size() < NUMBER_FIDUCIALS_NEEDED )
963 MITK_INFO <<
"ClassifyFiducialCandidates()";
964 std::vector<int> fiducialCandidatesToBeRemoved;
965 std::vector<std::vector<double>> distanceVectorsFiducials;
968 for (
unsigned int counter = 0; counter < distanceVectorsFiducials.size(); ++counter)
977 std::vector<double> &distances = distanceVectorsFiducials.at(counter);
978 for (
unsigned int number = 0; number < distances.size(); ++number)
980 double &distance = distances.at(number);
981 switch (ui->fiducialMarkerConfigurationComboBox->currentIndex())
985 if (distance > 7.93 && distance <= 12.07)
989 else if (distance > 12.07 && distance <= 15.73)
993 else if (distance > 15.73 && distance <= 19.84)
997 else if (distance > 19.84 && distance <= 23.425)
1001 else if (distance > 23.425 && distance <= 26.385)
1005 else if (distance > 26.385 && distance <= 31.00)
1013 if (distance > 11.895 && distance <= 18.105)
1017 else if (distance > 18.105 && distance <= 23.595)
1021 else if (distance > 23.595 && distance <= 29.76)
1025 else if (distance > 29.76 && distance <= 35.1375)
1028 if (distance > 33.54)
1033 else if (distance > 35.1375 && distance <= 39.5775)
1036 if (distance < 36.735)
1041 else if (distance > 39.5775 && distance <= 45.00)
1049 if (distance > 15.86 && distance <= 24.14)
1053 else if (distance > 24.14 && distance <= 31.46)
1057 else if (distance > 31.46 && distance <= 39.68)
1061 else if (distance > 39.68 && distance <= 46.85)
1065 else if (distance > 46.85 && distance <= 52.77)
1069 else if (distance > 52.77 && distance <= 59.00)
1082 if (((distanceA >= 2 && distanceD >= 2 && distanceE >= 2 && distanceF >= 1) ||
1083 (distanceA >= 1 && distanceB >= 2 && distanceC >= 1 && distanceD >= 2 && distanceE >= 1) ||
1084 (distanceB >= 2 && distanceD >= 4 && distanceF >= 1) ||
1085 (distanceA >= 1 && distanceB >= 1 && distanceD >= 3 && distanceE >= 1 && distanceF >= 1)) ==
false)
1087 MITK_INFO <<
"Detected fiducial candidate with unknown distance configuration.";
1088 fiducialCandidatesToBeRemoved.push_back(counter);
1091 for (
int count = fiducialCandidatesToBeRemoved.size() - 1; count >= 0; --count)
1093 MITK_INFO <<
"Removing fiducial candidate " << fiducialCandidatesToBeRemoved.at(count);
1094 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin()
1095 + fiducialCandidatesToBeRemoved.at(count));
1101 MITK_INFO <<
"GetCentroidsOfLabeledObjects()";
1102 BinaryImageToShapeLabelMapFilterType::OutputImageType::Pointer labelMap =
1103 m_BinaryImageToShapeLabelMapFilter->GetOutput();
1104 for (
int i = labelMap->GetNumberOfLabelObjects() - 1; i >= 0; --i)
1107 BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = labelMap->GetNthLabelObject(i);
1108 MITK_INFO <<
"Object " << i <<
" contains " << labelObject->Size() <<
" pixel";
1110 mitk::Vector3D centroid;
1111 centroid[0] = labelObject->GetCentroid()[0];
1112 centroid[1] = labelObject->GetCentroid()[1];
1113 centroid[2] = labelObject->GetCentroid()[2];
1114 m_CentroidsOfFiducialCandidates.push_back(centroid);
1121 MITK_INFO <<
"NumerateFiducialMarks()";
1122 bool successFiducialNo1;
1123 bool successFiducialNo4;
1124 bool successFiducialNo2And3;
1125 bool successFiducialNo5;
1126 bool successFiducialNo8;
1127 bool successFiducialNo6;
1128 bool successFiducialNo7;
1130 std::vector<std::vector<double>> distanceVectorsFiducials;
1140 if (!successFiducialNo1 || !successFiducialNo4 || !successFiducialNo2And3 ||
1141 !successFiducialNo5 || !successFiducialNo8 || !successFiducialNo6 || !successFiducialNo7)
1144 msgBox.setText(
"Cannot numerate/localize all fiducials successfully.");
1149 if (m_MarkerFloatingImageCoordinateSystemPointSet.IsNull())
1151 m_MarkerFloatingImageCoordinateSystemPointSet = mitk::PointSet::New();
1153 else if (m_MarkerFloatingImageCoordinateSystemPointSet->GetSize() != 0)
1155 m_MarkerFloatingImageCoordinateSystemPointSet->Clear();
1158 for (
unsigned int counter = 1; counter <= m_FiducialMarkerCentroids.size(); ++counter)
1160 m_MarkerFloatingImageCoordinateSystemPointSet->InsertPoint(counter - 1, mitk::Point3D(m_FiducialMarkerCentroids.at(counter)));
1162 if( !m_PerformingGroundTruthProtocolEvaluation )
1164 mitk::DataNode::Pointer node = mitk::DataNode::New();
1165 node->SetData(m_MarkerFloatingImageCoordinateSystemPointSet);
1166 node->SetName(
"MarkerFloatingImageCSPointSet");
1174 std::vector<double> distancesBetweenFiducials;
1176 for (
unsigned int i = 0; i < m_CentroidsOfFiducialCandidates.size(); ++i)
1178 distancesBetweenFiducials.clear();
1179 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(i));
1180 for (
unsigned int n = 0; n < m_CentroidsOfFiducialCandidates.size(); ++n)
1182 mitk::Point3D otherCentroid(m_CentroidsOfFiducialCandidates.at(n));
1183 distancesBetweenFiducials.push_back(fiducialCentroid.EuclideanDistanceTo(otherCentroid));
1186 std::sort(distancesBetweenFiducials.begin(), distancesBetweenFiducials.end());
1188 if (distancesBetweenFiducials.at(0) == 0.0)
1190 distancesBetweenFiducials.erase(distancesBetweenFiducials.begin());
1193 distanceVectorsFiducials.push_back(distancesBetweenFiducials);
1196 for (
unsigned int i = 0; i < distanceVectorsFiducials.size(); ++i)
1198 MITK_INFO <<
"Vector " << i <<
":";
1199 for (
unsigned int k = 0; k < distanceVectorsFiducials.at(i).size(); ++k)
1201 MITK_INFO << distanceVectorsFiducials.at(i).at(k);
1208 for (
unsigned int i = 0; i < distanceVectorsFiducials.size(); ++i)
1210 std::vector<double> &distances = distanceVectorsFiducials.at(i);
1211 if (distances.size() < NUMBER_FIDUCIALS_NEEDED - 1 )
1213 MITK_WARN <<
"Cannot find fiducial 1, there aren't found enough fiducial candidates.";
1218 if (distances.at(0) <= characteristicDistanceAWithUpperMargin &&
1219 distances.at(1) <= characteristicDistanceAWithUpperMargin)
1221 MITK_INFO <<
"Found Fiducial 1 (PointSet number " << i <<
")";
1222 m_FiducialMarkerCentroids.insert( std::pair<int,mitk::Vector3D>(1, m_CentroidsOfFiducialCandidates.at(i)));
1223 distanceVectorsFiducials.erase(distanceVectorsFiducials.begin() + i);
1224 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
1233 if (m_FiducialMarkerCentroids.find(1) == m_FiducialMarkerCentroids.end() )
1235 MITK_WARN <<
"Cannot find fiducial No 2 and 3. Before must be found fiducial No 1.";
1239 mitk::Point3D fiducialNo1(m_FiducialMarkerCentroids.at(1));
1240 mitk::Vector3D fiducialVectorA;
1241 mitk::Vector3D fiducialVectorB;
1242 mitk::Point3D fiducialPointA;
1243 mitk::Point3D fiducialPointB;
1244 bool foundFiducialA =
false;
1245 bool foundFiducialB =
false;
1246 mitk::Vector3D vectorFiducial1ToFiducialA;
1247 mitk::Vector3D vectorFiducial1ToFiducialB;
1249 for (
unsigned int i = 0; i < m_CentroidsOfFiducialCandidates.size(); ++i)
1251 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(i));
1252 double distance = fiducialNo1.EuclideanDistanceTo(fiducialCentroid);
1255 fiducialVectorA = m_CentroidsOfFiducialCandidates.at(i);
1256 fiducialPointA = fiducialCentroid;
1257 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
1258 foundFiducialA =
true;
1263 for (
unsigned int i = 0; i < m_CentroidsOfFiducialCandidates.size(); ++i)
1265 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(i));
1266 double distance = fiducialNo1.EuclideanDistanceTo(fiducialCentroid);
1269 fiducialVectorB = m_CentroidsOfFiducialCandidates.at(i);
1270 fiducialPointB = fiducialCentroid;
1271 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
1272 foundFiducialB =
true;
1277 if (!foundFiducialA || !foundFiducialB)
1279 MITK_WARN <<
"Cannot identify fiducial candidates 2 and 3";
1282 else if (m_CentroidsOfFiducialCandidates.size() == 0)
1284 MITK_WARN <<
"Too less fiducials detected. Cannot identify fiducial candidates 2 and 3";
1288 vectorFiducial1ToFiducialA = fiducialVectorA - m_FiducialMarkerCentroids.at(1);
1289 vectorFiducial1ToFiducialB = fiducialVectorB - m_FiducialMarkerCentroids.at(1);
1291 vnl_vector<double> crossProductVnl = vnl_cross_3d(vectorFiducial1ToFiducialA.GetVnlVector(), vectorFiducial1ToFiducialB.GetVnlVector());
1292 mitk::Vector3D crossProduct;
1293 crossProduct.SetVnlVector(crossProductVnl);
1295 mitk::Vector3D vectorFiducial1ToRandomLeftFiducial = m_CentroidsOfFiducialCandidates.at(0) - m_FiducialMarkerCentroids.at(1);
1297 double scalarProduct = (crossProduct * vectorFiducial1ToRandomLeftFiducial) /
1298 (crossProduct.GetNorm() * vectorFiducial1ToRandomLeftFiducial.GetNorm());
1300 double alpha = acos(scalarProduct) * 57.29578;
1301 MITK_INFO <<
"Scalar Product = " << alpha;
1305 m_FiducialMarkerCentroids[3] = fiducialVectorA;
1306 m_FiducialMarkerCentroids[2] = fiducialVectorB;
1310 m_FiducialMarkerCentroids[2] = fiducialVectorA;
1311 m_FiducialMarkerCentroids[3] = fiducialVectorB;
1314 MITK_INFO <<
"Found Fiducial 2, PointSet: " << m_FiducialMarkerCentroids.at(2);
1315 MITK_INFO <<
"Found Fiducial 3, PointSet: " << m_FiducialMarkerCentroids.at(3);
1325 for (
unsigned int i = 0; i < distanceVectorsFiducials.size(); ++i)
1327 std::vector<double> &distances = distanceVectorsFiducials.at(i);
1328 if (distances.size() < NUMBER_FIDUCIALS_NEEDED - 1)
1330 MITK_WARN <<
"Cannot find fiducial 4, there aren't found enough fiducial candidates.";
1334 if (distances.at(0) > characteristicDistanceBWithLowerMargin &&
1335 distances.at(0) <= characteristicDistanceBWithUpperMargin &&
1336 distances.at(1) > characteristicDistanceBWithLowerMargin &&
1337 distances.at(1) <= characteristicDistanceBWithUpperMargin)
1339 MITK_INFO <<
"Found Fiducial 4 (PointSet number " << i <<
")";
1340 m_FiducialMarkerCentroids.insert(std::pair<int, mitk::Vector3D>(4, m_CentroidsOfFiducialCandidates.at(i)));
1341 distanceVectorsFiducials.erase(distanceVectorsFiducials.begin() + i);
1342 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + i);
1351 if (m_FiducialMarkerCentroids.find(2) == m_FiducialMarkerCentroids.end())
1353 MITK_WARN <<
"To find fiducial No 5, fiducial No 2 has to be found before.";
1359 mitk::Point3D fiducialNo2(m_FiducialMarkerCentroids.at(2));
1361 for (
unsigned int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
1363 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
1364 double distance = fiducialNo2.EuclideanDistanceTo(fiducialCentroid);
1365 if (distance <= characteristicDistanceBWithUpperMargin)
1367 m_FiducialMarkerCentroids[5] = m_CentroidsOfFiducialCandidates.at(counter);
1368 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
1369 MITK_INFO <<
"Found Fiducial No 5, PointSet: " << m_FiducialMarkerCentroids[5];
1374 MITK_WARN <<
"Cannot find fiducial No 5.";
1380 if (m_FiducialMarkerCentroids.find(5) == m_FiducialMarkerCentroids.end())
1382 MITK_WARN <<
"To find fiducial No 6, fiducial No 5 has to be found before.";
1388 mitk::Point3D fiducialNo5(m_FiducialMarkerCentroids.at(5));
1390 for (
unsigned int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
1392 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
1393 double distance = fiducialNo5.EuclideanDistanceTo(fiducialCentroid);
1394 if (distance <= characteristicDistanceAWithUpperMargin)
1396 m_FiducialMarkerCentroids[6] = m_CentroidsOfFiducialCandidates.at(counter);
1397 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
1398 MITK_INFO <<
"Found Fiducial No 6, PointSet: " << m_FiducialMarkerCentroids[6];
1403 MITK_WARN <<
"Cannot find fiducial No 6.";
1409 if (m_FiducialMarkerCentroids.find(8) == m_FiducialMarkerCentroids.end())
1411 MITK_WARN <<
"To find fiducial No 7, fiducial No 8 has to be found before.";
1417 mitk::Point3D fiducialNo8(m_FiducialMarkerCentroids.at(8));
1419 for (
unsigned int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
1421 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
1422 double distance = fiducialNo8.EuclideanDistanceTo(fiducialCentroid);
1423 if (distance <= characteristicDistanceAWithUpperMargin)
1425 m_FiducialMarkerCentroids[7] = m_CentroidsOfFiducialCandidates.at(counter);
1426 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
1427 MITK_INFO <<
"Found Fiducial No 7, PointSet: " << m_FiducialMarkerCentroids[7];
1432 MITK_WARN <<
"Cannot find fiducial No 7.";
1438 if (m_FiducialMarkerCentroids.find(3) == m_FiducialMarkerCentroids.end())
1440 MITK_WARN <<
"To find fiducial No 8, fiducial No 3 has to be found before.";
1446 mitk::Point3D fiducialNo3(m_FiducialMarkerCentroids.at(3));
1448 for (
unsigned int counter = 0; counter < m_CentroidsOfFiducialCandidates.size(); ++counter)
1450 mitk::Point3D fiducialCentroid(m_CentroidsOfFiducialCandidates.at(counter));
1451 double distance = fiducialNo3.EuclideanDistanceTo(fiducialCentroid);
1452 if (distance <= characteristicDistanceBWithUpperMargin)
1454 m_FiducialMarkerCentroids[8] = m_CentroidsOfFiducialCandidates.at(counter);
1455 m_CentroidsOfFiducialCandidates.erase(m_CentroidsOfFiducialCandidates.begin() + counter);
1456 MITK_INFO <<
"Found Fiducial No 8, PointSet: " << m_FiducialMarkerCentroids[8];
1461 MITK_WARN <<
"Cannot find fiducial No 8.";
1467 m_IsAPointSetPredicate = mitk::TNodePredicateDataType<mitk::PointSet>::New();
1468 mitk::TNodePredicateDataType<mitk::Image>::Pointer isImage = mitk::TNodePredicateDataType<mitk::Image>::New();
1470 auto isSegmentation = mitk::NodePredicateDataType::New(
"Segment");
1471 m_IsASurfacePredicate = mitk::NodePredicateDataType::New(
"Surface");
1473 mitk::NodePredicateOr::Pointer validImages = mitk::NodePredicateOr::New();
1474 validImages->AddPredicate(mitk::NodePredicateAnd::New(isImage, mitk::NodePredicateNot::New(isSegmentation)));
1476 mitk::NodePredicateNot::Pointer isNotAHelperObject = mitk::NodePredicateNot::New(mitk::NodePredicateProperty::New(
"helper object", mitk::BoolProperty::New(
true)));
1478 m_IsOfTypeImagePredicate = mitk::NodePredicateAnd::New(validImages, isNotAHelperObject);
1480 mitk::NodePredicateProperty::Pointer isBinaryPredicate = mitk::NodePredicateProperty::New(
"binary", mitk::BoolProperty::New(
true));
1481 mitk::NodePredicateNot::Pointer isNotBinaryPredicate = mitk::NodePredicateNot::New(isBinaryPredicate);
1483 mitk::NodePredicateAnd::Pointer isABinaryImagePredicate = mitk::NodePredicateAnd::New(m_IsOfTypeImagePredicate, isBinaryPredicate);
1484 mitk::NodePredicateAnd::Pointer isNotABinaryImagePredicate = mitk::NodePredicateAnd::New(m_IsOfTypeImagePredicate, isNotBinaryPredicate);
1486 m_IsASegmentationImagePredicate = mitk::NodePredicateOr::New(isABinaryImagePredicate, mitk::TNodePredicateDataType<mitk::LabelSetImage>::New());
1487 m_IsAPatientImagePredicate = mitk::NodePredicateAnd::New(isNotABinaryImagePredicate, mitk::NodePredicateNot::New(mitk::TNodePredicateDataType<mitk::LabelSetImage>::New()));
1492 ui->setupUi(parent);
1493 ui->floatingImageComboBox->SetPredicate(m_IsAPatientImagePredicate);
1494 ui->ctImagesToChooseComboBox->SetPredicate(m_IsAPatientImagePredicate);
1495 ui->segmentationComboBox->SetPredicate(m_IsASegmentationImagePredicate);
1496 ui->selectedSurfaceComboBox->SetPredicate(m_IsASurfacePredicate);
1497 ui->pointSetComboBox->SetPredicate(m_IsAPointSetPredicate);
1500 connect(ui->floatingImageComboBox, SIGNAL(OnSelectionChanged(
const mitk::DataNode*)),
1502 connect(ui->doRegistrationMarkerToImagePushButton, SIGNAL(clicked()),
1504 connect(ui->localizeFiducialMarkerPushButton, SIGNAL(clicked()),
1506 connect(ui->visualizeCTtoUSregistrationPushButton, SIGNAL(clicked()),
1508 connect(ui->freezeUnfreezePushButton, SIGNAL(clicked()),
1510 connect(ui->addCtImagePushButton, SIGNAL(clicked()),
1512 connect(ui->removeCtImagePushButton, SIGNAL(clicked()),
1514 connect(ui->evaluateProtocolPushButton, SIGNAL(clicked()),
1516 connect(ui->actualizeSegmentationSurfacePSetDataPushButton, SIGNAL(clicked()),
1518 connect(ui->calculateTREPushButton, SIGNAL(clicked()),
1520 connect(ui->calculateCenterPushButton, SIGNAL(clicked()),
1526 MITK_INFO <<
"OnFloatingImageComboBoxSelectionChanged()";
1528 if (m_FloatingImage.IsNotNull())
1533 if (node ==
nullptr)
1536 m_FloatingImage =
nullptr;
1540 mitk::DataNode* selectedFloatingImage = ui->floatingImageComboBox->GetSelectedNode();
1541 if (selectedFloatingImage ==
nullptr)
1544 m_FloatingImage =
nullptr;
1548 mitk::Image::Pointer floatingImage =
dynamic_cast<mitk::Image*
>(selectedFloatingImage->GetData());
1549 if (floatingImage.IsNull())
1551 MITK_WARN <<
"Failed to cast selected segmentation node to mitk::Image*";
1553 m_FloatingImage =
nullptr;
1557 m_FloatingImage = floatingImage;
1566 if( m_MarkerModelCoordinateSystemPointSet.IsNull() ||
1567 m_MarkerFloatingImageCoordinateSystemPointSet.IsNull() )
1569 MITK_WARN <<
"Fiducial Landmarks are not initialized yet, cannot register";
1574 if (m_MarkerFloatingImageCoordinateSystemPointSet->GetSize() != m_MarkerModelCoordinateSystemPointSet->GetSize())
1576 MITK_WARN <<
"Not the same number of fiducials, cannot register";
1579 else if (m_MarkerFloatingImageCoordinateSystemPointSet->GetSize() < 3)
1581 MITK_WARN <<
"Need at least 3 fiducials, cannot register";
1589 for (
int i = 0; i<m_MarkerModelCoordinateSystemPointSet->GetSize(); i++)
1591 double point[3] = { m_MarkerModelCoordinateSystemPointSet->GetPoint(i)[0],
1592 m_MarkerModelCoordinateSystemPointSet->GetPoint(i)[1],
1593 m_MarkerModelCoordinateSystemPointSet->GetPoint(i)[2] };
1594 sourcePoints->InsertNextPoint(point);
1596 double point_targets[3] = { m_MarkerFloatingImageCoordinateSystemPointSet->GetPoint(i)[0],
1597 m_MarkerFloatingImageCoordinateSystemPointSet->GetPoint(i)[1],
1598 m_MarkerFloatingImageCoordinateSystemPointSet->GetPoint(i)[2] };
1599 targetPoints->InsertNextPoint(point_targets);
1605 transform->SetSourceLandmarks(sourcePoints);
1606 transform->SetTargetLandmarks(targetPoints);
1607 transform->SetModeToRigidBody();
1608 transform->Modified();
1609 transform->Update();
1613 MITK_INFO <<
"FRE: " << FRE <<
" mm";
1614 if (m_PerformingGroundTruthProtocolEvaluation)
1616 m_GroundTruthProtocolFRE.push_back(FRE);
1622 itk::Matrix<float, 3, 3> rotationFloat = itk::Matrix<float, 3, 3>();
1623 itk::Vector<float, 3> translationFloat = itk::Vector<float, 3>();
1624 itk::Matrix<double, 3, 3> rotationDouble = itk::Matrix<double, 3, 3>();
1625 itk::Vector<double, 3> translationDouble = itk::Vector<double, 3>();
1628 for (
int k = 0; k<3; k++)
for (
int l = 0; l<3; l++)
1630 rotationFloat[k][l] = m->GetElement(k, l);
1631 rotationDouble[k][l] = m->GetElement(k, l);
1634 for (
int k = 0; k<3; k++)
1636 translationFloat[k] = m->GetElement(k, 3);
1637 translationDouble[k] = m->GetElement(k, 3);
1640 m_TransformMarkerCSToFloatingImageCS = mitk::AffineTransform3D::New();
1641 m_TransformMarkerCSToFloatingImageCS->SetMatrix(rotationDouble);
1642 m_TransformMarkerCSToFloatingImageCS->SetOffset(translationDouble);
1643 MITK_INFO << m_TransformMarkerCSToFloatingImageCS;
1665 if( !m_PerformingGroundTruthProtocolEvaluation )
1667 mitk::PointSet* pointSet_orig = m_MarkerModelCoordinateSystemPointSet;
1668 mitk::PointSet::Pointer pointSet_moved = mitk::PointSet::New();
1670 for (
int i = 0; i < pointSet_orig->GetSize(); i++)
1672 pointSet_moved->InsertPoint(m_TransformMarkerCSToFloatingImageCS->TransformPoint(pointSet_orig->GetPoint(i)));
1675 pointSet_orig->Clear();
1676 for (
int i = 0; i < pointSet_moved->GetSize(); i++)
1677 pointSet_orig->InsertPoint(pointSet_moved->GetPoint(i));
1680 mitk::RenderingManager::GetInstance()->InitializeViewsByBoundingObjects(this->
GetDataStorage());
1687 m_FiducialMarkerCentroids.clear();
1688 m_CentroidsOfFiducialCandidates.clear();
1689 if (m_MarkerFloatingImageCoordinateSystemPointSet.IsNotNull())
1691 m_MarkerFloatingImageCoordinateSystemPointSet->Clear();
1697 msgBox.setText(
"Cannot perform filtering of the image. The floating image = nullptr.");
1701 mitk::AffineTransform3D::Pointer transform = m_FloatingImage->GetGeometry()->GetIndexToWorldTransform();
1702 MITK_WARN <<
"IndexToWorldTransform_CTimage = " << transform;
1707 m_CentroidsOfFiducialCandidates.size() != NUMBER_FIDUCIALS_NEEDED)
1710 QString text = QString(
"Have found %1 instead of 8 fiducial candidates.\
1711 Cannot perform fiducial localization procedure.").arg(m_CentroidsOfFiducialCandidates.size());
1712 msgBox.setText(text);
1726 mitk::DataNode* segmentationNode = ui->segmentationComboBox->GetSelectedNode();
1727 if (segmentationNode ==
nullptr)
1730 msgBox.setText(
"Cannot visualize CT-to-US registration. There is no segmentation selected.");
1734 mitk::AffineTransform3D::Pointer transform = segmentationNode->GetData()->GetGeometry()->GetIndexToWorldTransform();
1735 MITK_WARN <<
"IndexToWorldTransform_segmentation = " << transform;
1737 mitk::DataNode* surfaceNode = ui->selectedSurfaceComboBox->GetSelectedNode();
1738 if (surfaceNode ==
nullptr)
1741 msgBox.setText(
"Cannot visualize CT-to-US registration. There is no surface selected.");
1746 mitk::DataNode* pointSetNode = ui->pointSetComboBox->GetSelectedNode();
1747 if (pointSetNode ==
nullptr)
1750 msgBox.setText(
"Cannot visualize CT-to-US registration. There is no pointSet selected.");
1758 msgBox.setText(
"CombinedModality not yet set.\nPlease try again and click on the button.");
1763 if (m_FloatingImageToUltrasoundRegistrationFilter.IsNull())
1766 msgBox.setText(
"Cannot visualize CT-to-US registration.\
1767 The FloatingImageToUltrasoundRegistrationFilter is not initialized.");
1772 m_FloatingImageToUltrasoundRegistrationFilter
1773 ->InitializeTransformationMarkerCSToSensorCS(ui->useNdiTrackerCheckBox->isChecked());
1774 m_FloatingImageToUltrasoundRegistrationFilter->SetPointSet(pointSetNode);
1775 m_FloatingImageToUltrasoundRegistrationFilter->SetSegmentation(segmentationNode, m_FloatingImage);
1776 m_FloatingImageToUltrasoundRegistrationFilter->SetSurface(surfaceNode);
1777 m_FloatingImageToUltrasoundRegistrationFilter
1778 ->SetTransformMarkerCSToFloatingImageCS(m_TransformMarkerCSToFloatingImageCS);
1779 m_FloatingImageToUltrasoundRegistrationFilter
1781 m_FloatingImageToUltrasoundRegistrationFilter
1792 if (!m_FreezeCombinedModality)
1794 m_FreezeCombinedModality =
true;
1795 ui->freezeUnfreezePushButton->setText(
"Unfreeze");
1800 m_FreezeCombinedModality =
false;
1801 ui->freezeUnfreezePushButton->setText(
"Freeze");
1808 mitk::DataNode* segmentationNode = ui->segmentationComboBox->GetSelectedNode();
1809 if (segmentationNode ==
nullptr)
1812 msgBox.setText(
"Cannot actualize segmentation + surface + pointset data. There is no segmentation selected.");
1817 mitk::DataNode* surfaceNode = ui->selectedSurfaceComboBox->GetSelectedNode();
1818 if (surfaceNode ==
nullptr)
1821 msgBox.setText(
"Cannot actualize segmentation + surface + pointset data. There is no surface selected.");
1826 mitk::DataNode* pointSetNode = ui->pointSetComboBox->GetSelectedNode();
1827 if (pointSetNode ==
nullptr)
1830 msgBox.setText(
"Cannot actualize segmentation + surface + pointset data. There is no pointSet selected.");
1835 m_FloatingImageToUltrasoundRegistrationFilter->SetPointSet(pointSetNode);
1836 m_FloatingImageToUltrasoundRegistrationFilter->SetSegmentation(segmentationNode, m_FloatingImage);
1837 m_FloatingImageToUltrasoundRegistrationFilter->SetSurface(surfaceNode);
1847 mitk::DataNode::Pointer pointSetNode = ui->pointSetComboBox->GetSelectedNode();
1848 if (pointSetNode.IsNull())
1851 msgBox.setText(
"Cannot calculate TRE. The pointSetComboBox node returned a nullptr.");
1856 mitk::PointSet::Pointer pointSet =
dynamic_cast<mitk::PointSet*
>(pointSetNode->GetData());
1857 if (pointSet.IsNull())
1859 ui->distanceTREValue->setText(QString(
"Unknown"));
1862 double distance = pointSet->GetPoint(0).EuclideanDistanceTo(centroidOfTargetInUSImage);
1863 ui->distanceTREValue->setText(QString(
"%1").arg(distance));
1868 mitk::DataNode::Pointer node = ui->segmentationComboBox->GetSelectedNode();
1872 msgBox.setText(
"Cannot calculate the centroid of the segmentation."\
1873 "The segmentationComboBox node returned a nullptr.");
1878 mitk::LabelSetImage::Pointer image =
dynamic_cast<mitk::LabelSetImage*
>(node->GetData());
1881 MITK_WARN <<
"Cannot CalculateCenter - the segmentation cannot be converted to mitk::Image";
1885 ImageType::Pointer itkImage = ImageType::New();
1886 mitk::CastToItkImage(image, itkImage);
1889 BinaryImageToShapeLabelMapFilterType::Pointer shapeLabelMapFilter = BinaryImageToShapeLabelMapFilterType::New();
1890 shapeLabelMapFilter->SetInputForegroundValue(1);
1892 shapeLabelMapFilter->SetInput(itkImage);
1893 shapeLabelMapFilter->Update();
1895 BinaryImageToShapeLabelMapFilterType::OutputImageType::Pointer labelMap =
1896 shapeLabelMapFilter->GetOutput();
1897 for (
int i = labelMap->GetNumberOfLabelObjects() - 1; i >= 0; --i)
1900 BinaryImageToShapeLabelMapFilterType::OutputImageType::LabelObjectType* labelObject = labelMap->GetNthLabelObject(i);
1902 mitk::Vector3D centroid;
1903 centroid[0] = labelObject->GetCentroid()[0];
1904 centroid[1] = labelObject->GetCentroid()[1];
1905 centroid[2] = labelObject->GetCentroid()[2];
1906 MITK_INFO <<
"Centroid of segmentation = " << centroid;
1912 mitk::DataNode* selectedCtImage = ui->ctImagesToChooseComboBox->GetSelectedNode();
1913 if (selectedCtImage ==
nullptr)
1918 mitk::Image::Pointer ctImage =
dynamic_cast<mitk::Image*
>(selectedCtImage->GetData());
1919 if (ctImage.IsNull())
1921 MITK_WARN <<
"Failed to cast selected segmentation node to mitk::Image*";
1924 QString name = QString::fromStdString(selectedCtImage->GetName());
1926 for(
int counter = 0; counter < ui->chosenCtImagesListWidget->count(); ++counter)
1928 MITK_INFO << ui->chosenCtImagesListWidget->item(counter)->text() <<
" - " << counter;
1929 MITK_INFO << m_ImagesGroundTruthProtocol.at(counter).GetPointer();
1930 if (ui->chosenCtImagesListWidget->item(counter)->text().compare(name) == 0)
1932 MITK_INFO <<
"CT image already exist in list of chosen CT images. Do not add the image.";
1937 ui->chosenCtImagesListWidget->addItem(name);
1938 m_ImagesGroundTruthProtocol.push_back(ctImage);
1943 int position = ui->chosenCtImagesListWidget->currentRow();
1944 if (ui->chosenCtImagesListWidget->count() == 0 || position < 0)
1949 m_ImagesGroundTruthProtocol.erase(m_ImagesGroundTruthProtocol.begin() + position);
1950 QListWidgetItem *item = ui->chosenCtImagesListWidget->currentItem();
1951 ui->chosenCtImagesListWidget->removeItemWidget(item);
1957 m_GroundTruthProtocolFRE.clear();
1958 if (m_ImagesGroundTruthProtocol.size() != 6)
1961 msgBox.setText(
"For evaluating the Ground-Truth-Fiducial-Localization-Protocol there must be loaded 6 different CT images.");
1966 m_PerformingGroundTruthProtocolEvaluation =
true;
1968 m_GroundTruthProtocolTransformedPoints.clear();
1970 for (
unsigned int cycleNo = 0; cycleNo < m_ImagesGroundTruthProtocol.size(); ++cycleNo)
1972 m_FloatingImage = m_ImagesGroundTruthProtocol.at(cycleNo);
1984 ui->meanFREValue->setText(QString(
"%1").arg(meanFRE));
1985 ui->sdFREValue->setText(QString(
"%1").arg(sdOfFRE));
1986 if (ui->protocolEvaluationTypeComboBox->currentText().compare(
"ANGLE") == 0)
1988 if (m_GroundTruthProtocolTRE.find(0) != m_GroundTruthProtocolTRE.end())
1990 ui->TREValue->setText(QString(
"%1").arg(m_GroundTruthProtocolTRE.at(0)));
1993 else if (ui->protocolEvaluationTypeComboBox->currentText().compare(
"PLANE") == 0)
1995 if (m_GroundTruthProtocolTRE.find(0) != m_GroundTruthProtocolTRE.end() &&
1996 m_GroundTruthProtocolTRE.find(20) != m_GroundTruthProtocolTRE.end() &&
1997 m_GroundTruthProtocolTRE.find(40) != m_GroundTruthProtocolTRE.end() &&
1998 m_GroundTruthProtocolTRE.find(60) != m_GroundTruthProtocolTRE.end() &&
1999 m_GroundTruthProtocolTRE.find(80) != m_GroundTruthProtocolTRE.end() &&
2000 m_GroundTruthProtocolTRE.find(100) != m_GroundTruthProtocolTRE.end())
2002 ui->TREValue->setText(QString(
"Depth 0mm: %1\nDepth 20mm: %2\nDepth 40mm: %3\
2003 \nDepth 60mm: %4\nDepth 80mm: %5\nDepth 100mm: %6")
2004 .arg(m_GroundTruthProtocolTRE.at(0))
2005 .arg(m_GroundTruthProtocolTRE.at(20))
2006 .arg(m_GroundTruthProtocolTRE.at(40))
2007 .arg(m_GroundTruthProtocolTRE.at(60))
2008 .arg(m_GroundTruthProtocolTRE.at(80))
2009 .arg(m_GroundTruthProtocolTRE.at(100)));
2013 m_PerformingGroundTruthProtocolEvaluation =
false;
Abstract base class for navigation step widgets.
itk::SmartPointer< mitk::DataStorage > GetDataStorage(bool throwNull=true)
Returns the data storage set for the navigation step.
itk::SmartPointer< mitk::AbstractUltrasoundTrackerDevice > GetCombinedModality(bool throwNull=true)
Returns the combined modality set for the navigation step.
std::vector< itk::SmartPointer< mitk::NavigationDataToNavigationDataFilter > > FilterVector
Navigation step for marking risk structures. The user can add risk structures by interacting with the...
double GetCharacteristicDistanceAWithUpperMargin()
void OnCalculateTRE(mitk::Point3D centroidOfTargetInUSImage)
void OnVisualizeCTtoUSregistration()
void OnLocalizeFiducials()
FilterVector GetFilter() override
void InitializeImageFilters()
void InitializePointsToTransformForGroundTruthProtocol()
void OnSetCombinedModality() override
Called every time SetCombinedModality() was called. This method may be implemented by a concrete subc...
bool FindFiducialNo4(std::vector< std::vector< double > > &distanceVectorsFiducials)
bool FilterFloatingImage()
double GetCharacteristicDistanceBWithLowerMargin()
void OnActualizeSegmentationSurfacePointSetData()
void CreatePointsToTransformForGroundTruthProtocol()
void AddTransformedPointsToDataStorage()
void OnEvaluateGroundTruthFiducialLocalizationProtocol()
double GetFiducialVolume(double radius)
void NumerateFiducialMarks()
void EliminateTooSmallLabeledObjects(ImageType::Pointer binaryImage)
bool OnStartStep() override
Initialization of the data storage nodes.
bool EliminateFiducialCandidatesByEuclideanDistances()
void CalculateDistancesBetweenFiducials(std::vector< std::vector< double > > &distanceVectorsFiducials)
void OnFloatingImageComboBoxSelectionChanged(const mitk::DataNode *node)
void OnRemoveCtImageClicked()
void OnGetCursorPosition()
QString GetTitle() override
Getter for the title of the navigation step. This title should be human readable and can be used to d...
double GetCharacteristicDistanceBWithUpperMargin()
bool FindFiducialNo1(std::vector< std::vector< double > > &distanceVectorsFiducials)
bool FindFiducialNo2And3()
double CalculateStandardDeviationOfFRE(double meanFRE)
void OnSettingsChanged(const itk::SmartPointer< mitk::DataNode > settingsNode) override
void DefineDataStorageImageFilter()
void TransformPointsGroundTruthProtocol()
void ClassifyFiducialCandidates()
bool OnFinishStep() override
There is nothing to be done.
void CreateQtPartControl(QWidget *parent)
void OnAddCtImageClicked()
bool OnActivateStep() override
Selects input for the node displacement filter and emits "ReadyForNextStep" signal....
double CalculateMeanFRE()
void CreateMarkerModelCoordinateSystemPointSet()
QmitkUSNavigationStepCtUsRegistration(QWidget *parent=nullptr)
bool OnDeactivateStep() override
Called when the navigation step gets deactivated (-> state started). This method may be implemented b...
void OnRegisterMarkerToFloatingImageCS()
void CalculateGroundTruthProtocolTRE()
void ActualizeCtToUsRegistrationWidget()
double GetMinimalFiducialConfigurationDistance()
void SetFloatingImageGeometryInformation(mitk::Image *image)
bool OnStopStep() override
Resets widget and filter and removes nodes from the data storage.
~QmitkUSNavigationStepCtUsRegistration() override
void OnUpdate() override
Updates the tracking validity status and the combined modality.
void GetCentroidsOfLabeledObjects()
void UnsetFloatingImageGeometry()
MITKIGTBASE_EXPORT double ComputeFRE(mitk::PointSet::Pointer imageFiducials, mitk::PointSet::Pointer realWorldFiducials, vtkSmartPointer< vtkLandmarkTransform > transform=nullptr)
Computes the fiducial registration error out of two sets of fiducials. The two sets must have the sam...