Skip to content

Commit b854576

Browse files
author
Jose Alonso Solis-Lemus
committed
common_utils_merge
1 parent 63de858 commit b854576

File tree

2 files changed

+173
-2
lines changed

2 files changed

+173
-2
lines changed

CemrgApp/Modules/CemrgAppModule/include/CemrgCommonUtils.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,17 @@ class MITKCEMRGAPPMODULE_EXPORT CemrgCommonUtils {
5858

5959
// Image Analysis Utils
6060
static void SetSegmentationEdgesToZero(mitk::Image::Pointer image, QString outPath="");
61+
static mitk::Image::Pointer ImageThreshold(mitk::Image::Pointer image, short threshold, short foreground, short background);
6162
static void Binarise(mitk::Image::Pointer image, float background=0);
6263
static mitk::Image::Pointer ReturnBinarised(mitk::Image::Pointer image, float background=0);
6364
static QString ConvertToInr(mitk::Image::Pointer image, bool convert2uint, QString dir, QString output_name);
6465
static QString ConvertToInr(QString dir, QString filename, bool convert2uint, QString output_name = "");
6566
static mitk::Image::Pointer SwapAxes(mitk::Image::Pointer image, const std::vector<int> &orderDimensions = {0, 1, 2});
6667

68+
static mitk::Image::Pointer Zeros(int sx, int sy, int sz, int ox = 0, int oy = 0, int oz = 0);
69+
static mitk::Image::Pointer Zeros(mitk::Image::Pointer image);
70+
static mitk::Image::Pointer AddImage(mitk::Image::Pointer im1, mitk::Image::Pointer im2);
71+
6772
//Nifti Conversion Utils
6873
static bool ConvertToNifti(mitk::BaseData::Pointer oneNode, QString path2file, bool resample=false, bool reorient=false);
6974
static void RoundPixelValues(QString pathToImage, QString outputPath="");
@@ -88,11 +93,14 @@ class MITKCEMRGAPPMODULE_EXPORT CemrgCommonUtils {
8893
static mitk::Image::Pointer ImageFromSurfaceMesh(mitk::Surface::Pointer surf, double origin[3], double spacing[3]);
8994
static void SaveImageFromSurfaceMesh(QString surfPath, double origin[3], double spacing[3], QString outputPath="");
9095
static double GetSphereParametersFromLandmarks(mitk::PointSet::Pointer landmarks, double * centre);
96+
static void ClipWithPolydata(mitk::Surface::Pointer surface, mitk::Surface::Pointer clipper, QString saveToPath);
97+
static void GetMinMaxScalars(mitk::Surface::Pointer surf, double &min_val, double &max_val, bool fromCellData = false);
9198

9299
//Tracking Utils
93100
static void MotionTrackingReport(QString directory, int timePoints);
94101

95102
//Generic
103+
static QString GetFilePath(QString dir, QString nameSubstring, QString extension);
96104
static mitk::DataNode::Pointer AddToStorage(mitk::BaseData* data, std::string nodeName, mitk::DataStorage::Pointer ds, bool init = true);
97105
static mitk::DataNode::Pointer UpdateFromStorage(mitk::BaseData *data, std::string nodeName, mitk::DataStorage::Pointer ds);
98106
static QJsonObject CreateJSONObject(QStringList keys_list, QStringList values_list, QStringList types_list);

CemrgApp/Modules/CemrgAppModule/src/CemrgCommonUtils.cpp

Lines changed: 165 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
171189
mitk::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
13271490
void CemrgCommonUtils::OriginalCoordinates(QString imagePath, QString pointPath, QString outputPath, double scaling) {
13281491
if (QFileInfo::exists(imagePath) && QFileInfo::exists(pointPath)) {

0 commit comments

Comments
 (0)