@@ -28,6 +28,8 @@ PURPOSE. See the above copyright notices for more information.
2828
2929// ITK
3030#include < itkNearestNeighborInterpolateImageFunction.h>
31+ #include < itkAddImageFilter.h>
32+ #include < itkSubtractImageFilter.h>
3133#include < itkBSplineInterpolateImageFunction.h>
3234#include < itkImageRegionIteratorWithIndex.h>
3335#include < itkResampleImageFilter.h>
@@ -72,6 +74,7 @@ PURPOSE. See the above copyright notices for more information.
7274#include < vtkPolyDataToImageStencil.h>
7375#include < vtkImageStencil.h>
7476#include < vtkFillHolesFilter.h>
77+ #include < vtkImplicitPolyDataDistance.h>
7578
7679// Qmitk
7780#include < mitkBoundingObjectCutter.h>
@@ -89,6 +92,7 @@ PURPOSE. See the above copyright notices for more information.
8992// Qt
9093#include < QMessageBox>
9194#include < QString>
95+ #include < QDirIterator>
9296#include < QFile>
9397#include < QFileInfo>
9498#include < QDir>
@@ -168,6 +172,20 @@ mitk::DataNode::Pointer CemrgCommonUtils::GetCuttingNode() {
168172 return cuttingNode;
169173}
170174
175+ QString CemrgCommonUtils::GetFilePath (QString dir, QString nameSubstring, QString extension){
176+ QString result = " " ;
177+ QDirIterator searchit (dir, QDirIterator::Subdirectories);
178+ while (searchit.hasNext ()) {
179+ QFileInfo searchfinfo (searchit.next ());
180+ if (searchfinfo.fileName ().contains (extension, Qt::CaseSensitive)) {
181+ if (searchfinfo.fileName ().contains ((nameSubstring), Qt::CaseSensitive))
182+ result = searchfinfo.absoluteFilePath ();
183+ }
184+ }// _while
185+
186+ return result;
187+ }
188+
171189mitk::Image::Pointer CemrgCommonUtils::Downsample (mitk::Image::Pointer image, int factor) {
172190
173191 typedef itk::Image<short , 3 > ImageType;
@@ -435,7 +453,96 @@ void CemrgCommonUtils::SetSegmentationEdgesToZero(mitk::Image::Pointer image, QS
435453 }
436454}
437455
438- void CemrgCommonUtils::RoundPixelValues (QString pathToImage, QString outputPath) {
456+ mitk::Image::Pointer CemrgCommonUtils::Zeros (mitk::Image::Pointer image){
457+ using ImageType = itk::Image<short ,3 >;
458+
459+ ImageType::Pointer outputImg = ImageType::New ();
460+ mitk::CastToItkImage (image->Clone (), outputImg);
461+
462+ using IteratorType = itk::ImageRegionIterator<ImageType>;
463+ IteratorType imIter (outputImg, outputImg->GetLargestPossibleRegion ());
464+ imIter.GoToBegin ();
465+ while (!imIter.IsAtEnd ()){
466+ imIter.Set (0 );
467+ ++imIter;
468+ }
469+
470+ mitk::Image::Pointer outim = mitk::Image::New ();
471+ mitk::CastToMitkImage (outputImg, outim);
472+
473+ return outim;
474+ }
475+
476+ mitk::Image::Pointer CemrgCommonUtils::Zeros (int sx, int sy, int sz, int ox, int oy, int oz){
477+ using ImageType = itk::Image<short ,3 >;
478+
479+ ImageType::Pointer outputImg = ImageType::New ();
480+ ImageType::IndexType start;
481+ start[0 ] = ox; start[1 ] = oy; start[2 ] = oz;
482+
483+ ImageType::SizeType size;
484+ size[0 ] = sx; size[1 ] = sy; size[2 ] = sz;
485+
486+ ImageType::RegionType region;
487+ region.SetSize (size);
488+ region.SetIndex (start);
489+
490+ outputImg->SetRegions (region);
491+ outputImg->Allocate ();
492+
493+ using IteratorType = itk::ImageRegionIterator<ImageType>;
494+ IteratorType imIter (outputImg, outputImg->GetLargestPossibleRegion ());
495+ imIter.GoToBegin ();
496+ while (!imIter.IsAtEnd ()){
497+ imIter.Set (0 );
498+ ++imIter;
499+ }
500+
501+ mitk::Image::Pointer outim = mitk::Image::New ();
502+ mitk::CastToMitkImage (outputImg, outim);
503+
504+ return outim;
505+ }
506+
507+ mitk::Image::Pointer CemrgCommonUtils::AddImage (mitk::Image::Pointer im1, mitk::Image::Pointer im2){
508+ using ImageType = itk::Image<short ,3 >;
509+ using AddFilterType = itk::AddImageFilter<ImageType, ImageType, ImageType>;
510+
511+ ImageType::Pointer itk1 = ImageType::New ();
512+ ImageType::Pointer itk2 = ImageType::New ();
513+ CastToItkImage (im1, itk1);
514+ CastToItkImage (im2, itk2);
515+
516+ AddFilterType::Pointer sum = AddFilterType::New ();
517+ sum->SetInput1 (itk1);
518+ sum->SetInput2 (itk2);
519+ sum->Update ();
520+
521+ mitk::Image::Pointer outputIm = mitk::ImportItkImage (sum->GetOutput ())->Clone ();
522+ return outputIm;
523+ }
524+
525+ mitk::Image::Pointer CemrgCommonUtils::ImageThreshold (mitk::Image::Pointer image, short threshold, short foreground, short background){
526+ using ImageType = itk::Image<short , 3 >;
527+ using IteratorType = itk::ImageRegionIteratorWithIndex<ImageType>;
528+
529+ ImageType::Pointer im = ImageType::New ();
530+ mitk::CastToItkImage (image, im);
531+
532+ IteratorType imIter (im, im->GetLargestPossibleRegion ());
533+
534+ imIter.GoToBegin ();
535+ while (!imIter.IsAtEnd ()){
536+ float value = (imIter.Get () > threshold) ? foreground : background;
537+ imIter.Set (value);
538+
539+ ++imIter;
540+ }
541+
542+ return mitk::ImportItkImage (im)->Clone ();
543+ }
544+
545+ void CemrgCommonUtils::RoundPixelValues (QString pathToImage, QString outputPath){
439546 QFileInfo fi (pathToImage);
440547 if (fi.exists ()) {
441548 using ImageType = itk::Image<double , 3 >;
@@ -605,7 +712,39 @@ mitk::Surface::Pointer CemrgCommonUtils::ClipWithSphere(mitk::Surface::Pointer s
605712 return surface;
606713}
607714
608- void CemrgCommonUtils::FlipXYPlane (mitk::Surface::Pointer surf, QString dir, QString vtkname) {
715+ void CemrgCommonUtils::ClipWithPolydata (mitk::Surface::Pointer surface, mitk::Surface::Pointer clipper, QString saveToPath){
716+
717+ vtkSmartPointer<vtkImplicitPolyDataDistance> implicitFn = vtkSmartPointer<vtkImplicitPolyDataDistance>::New ();
718+ implicitFn->SetInput (clipper->GetVtkPolyData ());
719+ vtkMTimeType mtime = implicitFn->GetMTime ();
720+ std::cout << " MTime: " << mtime<< std::endl ;
721+ vtkSmartPointer<vtkClipPolyData> mvclipper = vtkSmartPointer<vtkClipPolyData>::New ();
722+ mvclipper->SetClipFunction (implicitFn);
723+ mvclipper->SetInputData (surface->GetVtkPolyData ());
724+ mvclipper->InsideOutOff ();
725+ mvclipper->Update ();
726+
727+ vtkSmartPointer<vtkDataSetSurfaceFilter> surfer = vtkSmartPointer<vtkDataSetSurfaceFilter>::New ();
728+ surfer->SetInputData (mvclipper->GetOutput ());
729+ surfer->Update ();
730+
731+ vtkSmartPointer<vtkCleanPolyData> clean = vtkSmartPointer<vtkCleanPolyData>::New ();
732+ clean->SetInputConnection (surfer->GetOutputPort ());
733+ clean->Update ();
734+
735+ vtkSmartPointer<vtkPolyDataConnectivityFilter> lrgRegion = vtkSmartPointer<vtkPolyDataConnectivityFilter>::New ();
736+ lrgRegion->SetInputConnection (clean->GetOutputPort ());
737+ lrgRegion->SetExtractionModeToLargestRegion ();
738+ lrgRegion->Update ();
739+ clean = vtkSmartPointer<vtkCleanPolyData>::New ();
740+ clean->SetInputConnection (lrgRegion->GetOutputPort ());
741+ clean->Update ();
742+
743+ surface->SetVtkPolyData (clean->GetOutput ());
744+ mitk::IOUtil::Save (surface, saveToPath.toStdString ());
745+ }
746+
747+ void CemrgCommonUtils::FlipXYPlane (mitk::Surface::Pointer surf, QString dir, QString vtkname){
609748
610749 // Prepare points for MITK visualisation - (CemrgCommonUtils::LoadVTKMesh)
611750 vtkSmartPointer<vtkPolyData> pd = surf->GetVtkPolyData ();
@@ -1323,6 +1462,30 @@ double CemrgCommonUtils::GetSphereParametersFromLandmarks(mitk::PointSet::Pointe
13231462 return radius;
13241463}
13251464
1465+ void CemrgCommonUtils::GetMinMaxScalars (mitk::Surface::Pointer surf, double & min_val, double & max_val, bool fromCellData){
1466+ double max_scalar=-1 , min_scalar=1e9 ;
1467+ vtkIdType total;
1468+ vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New ();
1469+ if (fromCellData){
1470+ scalars = vtkFloatArray::SafeDownCast (surf->GetVtkPolyData ()->GetCellData ()->GetScalars ());
1471+ total=surf->GetVtkPolyData ()->GetNumberOfPoints ();
1472+ } else {
1473+ scalars = vtkFloatArray::SafeDownCast (surf->GetVtkPolyData ()->GetPointData ()->GetScalars ());
1474+ total=surf->GetVtkPolyData ()->GetNumberOfCells ();
1475+ }
1476+
1477+ for (vtkIdType i = 0 ; i < total; i++) {
1478+ double s = scalars->GetTuple1 (i);
1479+ if (s > max_scalar)
1480+ max_scalar = s;
1481+ if (s < min_scalar)
1482+ min_scalar = s;
1483+ }
1484+
1485+ min_val=min_scalar;
1486+ max_val=max_scalar;
1487+ }
1488+
13261489// UTILities for CARP - operations with .elem and .pts files
13271490void CemrgCommonUtils::OriginalCoordinates (QString imagePath, QString pointPath, QString outputPath, double scaling) {
13281491 if (QFileInfo::exists (imagePath) && QFileInfo::exists (pointPath)) {
0 commit comments