// clitk
#include "clitkConnectedComponentLabeling_ggo.h"
#include "clitkConnectedComponentLabelingGenericFilter.h"
+#include "clitkRegionGrowing_ggo.h"
+#include "clitkRegionGrowingGenericFilter.h"
// Qt
#include <QFileDialog>
#include <QMessageBox>
// vtk
+#include <vtkVersion.h>
+#include <vtkStreamingDemandDrivenPipeline.h>
+#include <vtkInformation.h>
#include "vtkImageContinuousErode3D.h"
#include "vtkImageContinuousDilate3D.h"
#include "vtkRenderWindow.h"
AddInputSelector("Select one image");
// Init
+ mCurrentLabelUnderMousePointer = 0.0;
+ mCurrentMousePositionInMM.resize(3);
+ // mCurrentMousePositionInPixel.resize(3);
mRefMaskImage = NULL;
mCurrentState = State_Default;
mKernelValue = 3; // FIXME must be odd. If even -> not symmetrical
//------------------------------------------------------------------------------
void vvToolSegmentation::KeyPressed(std::string KeyPress)
{
+ if (KeyPress == "G") {
+ RegionGrowing();
+ }
if (KeyPress == "e") {
Erode();
}
//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+void vvToolSegmentation::RegionGrowing()
+{
+ DD("RegionGrowing");
+ QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+ // Merge labels if needed
+ Merge();
+ // Get mouse location
+ DD(mCurrentLabelUnderMousePointer);
+ DDV(mCurrentMousePositionInMM, 3);
+ // DDV(mCurrentMousePositionInPixel, 3);
+
+ // Build RG filter parameters
+ typedef args_info_clitkRegionGrowing ArgsInfoType;
+ ArgsInfoType a;
+ cmdline_parser_clitkRegionGrowing_init(&a);
+ // FIXME parameters
+ a.type_arg = 4; // FIXME set by gui
+ DD(a.lower_arg);
+ a.lower_arg = 200;
+ a.upper_arg = 3000;
+ a.seed_given = 3;
+ a.seed_arg = new int[3];
+
+ DDV(mCurrentMousePositionInMM, 3);
+ vtkImageData * image = mCurrentImage->GetFirstVTKImageData();
+ double x = (mCurrentMousePositionInMM[0] - image->GetOrigin()[0]) / image->GetSpacing()[0];
+ double y = (mCurrentMousePositionInMM[1] - image->GetOrigin()[1]) / image->GetSpacing()[1];
+ double z = (mCurrentMousePositionInMM[2] - image->GetOrigin()[2]) / image->GetSpacing()[2];
+ a.seed_arg[0] = x;
+ a.seed_arg[1] = y;
+ a.seed_arg[2] = z;
+ a.verbose_flag = 1;
+
+ // Build RG filter parameters
+ typedef clitk::RegionGrowingGenericFilter<args_info_clitkRegionGrowing> FilterType;
+ FilterType::Pointer filter = FilterType::New();
+ filter->SetArgsInfo(a);
+ filter->SetInputVVImage(mCurrentImage);
+ filter->SetIOVerbose(true);
+ filter->Update();
+ mCurrentMaskImage = filter->GetOutputVVImage();
+ DD("filter done");
+
+ mCurrentMaskActor->RemoveActors();
+ mCurrentMaskActor = CreateMaskActor(mCurrentMaskImage, 1, 0, false);
+ mCurrentMaskActor->Update(); // default color is red
+ UpdateAndRenderNewMask();
+ UpdateMaskSizeLabels();
+ DD("end");
+
+ // mouse pointer
+ QApplication::restoreOverrideCursor();
+}
+//------------------------------------------------------------------------------
+
+
//------------------------------------------------------------------------------
void vvToolSegmentation::Merge()
{
vtkImageContinuousErode3D* erode = vtkImageContinuousErode3D::New();
erode->SetKernelSize(mKernelValue,mKernelValue,mKernelValue);
vtkImageData* image = mCurrentMaskImage->GetVTKImages()[0];
+#if VTK_MAJOR_VERSION <= 5
erode->SetInput(image);
+#else
+ erode->SetInputData(image);
+#endif
erode->Update();
image->DeepCopy(erode->GetOutput());
+#if VTK_MAJOR_VERSION <= 5
image->Update();
+#else
+ //image->Update();
+#endif
UpdateAndRenderNewMask();
erode->Delete();
QApplication::restoreOverrideCursor();
vtkImageContinuousDilate3D* dilate = vtkImageContinuousDilate3D::New();
dilate->SetKernelSize(mKernelValue,mKernelValue,mKernelValue);
vtkImageData* image = mCurrentMaskImage->GetVTKImages()[0];
+#if VTK_MAJOR_VERSION <= 5
dilate->SetInput(image);
+#else
+ dilate->SetInputData(image);
+#endif
dilate->Update();
image->DeepCopy(dilate->GetOutput());
+#if VTK_MAJOR_VERSION <= 5
image->Update();
+#else
+ //image->Update();
+#endif
UpdateAndRenderNewMask();
dilate->Delete();
QApplication::restoreOverrideCursor();
//------------------------------------------------------------------------------
void vvToolSegmentation::MousePositionChanged(int slicer)
{
- if (mCurrentState == State_Default) return; // Do nothing in this case
-
+ // DD("MousePositionChanged ");
+ // DD(slicer);
double x = mCurrentSlicerManager->GetSlicer(slicer)->GetCurrentPosition()[0];
double y = mCurrentSlicerManager->GetSlicer(slicer)->GetCurrentPosition()[1];
double z = mCurrentSlicerManager->GetSlicer(slicer)->GetCurrentPosition()[2];
- vtkImageData * image = mCurrentCCLImage->GetFirstVTKImageData();
+ mCurrentMousePositionInMM[0] = x;
+ mCurrentMousePositionInMM[1] = y;
+ mCurrentMousePositionInMM[2] = z;
+ // DDV(mCurrentMousePositionInMM, 3);
+
+ // vtkImageData * image = mCurrentCCLImage->GetFirstVTKImageData();
+ vtkImageData * image = mCurrentMaskImage->GetFirstVTKImageData();
double Xover = (x - image->GetOrigin()[0]) / image->GetSpacing()[0];
double Yover = (y - image->GetOrigin()[1]) / image->GetSpacing()[1];
double Zover = (z - image->GetOrigin()[2]) / image->GetSpacing()[2];
int ix, iy, iz;
+ // mCurrentMousePositionInPixel[0] = Xover;
+ // mCurrentMousePositionInPixel[1] = Yover;
+ // mCurrentMousePositionInPixel[2] = Zover;
+ // DDV(mCurrentMousePositionInPixel, 3);
+#if VTK_MAJOR_VERSION <= 5
if (Xover >= image->GetWholeExtent()[0] &&
Xover <= image->GetWholeExtent()[1] &&
Yover >= image->GetWholeExtent()[2] &&
Yover <= image->GetWholeExtent()[3] &&
Zover >= image->GetWholeExtent()[4] &&
Zover <= image->GetWholeExtent()[5]) {
- mCurrentLabelUnderMousePointer =
- mCurrentSlicerManager->GetSlicer(0)->GetScalarComponentAsDouble(image, Xover, Yover, Zover, ix, iy, iz, 0);
- // DD(Xover); DD(Yover); DD(Zover);
- // DD(ix); DD(iy); DD(iz);
- // DD(valueOver);
+ if (mCurrentState == State_Default) { // inside the mask
+ mCurrentLabelUnderMousePointer = 1;
+ return;
+ }
+ else { // inside the label image
+ vtkImageData * image = mCurrentCCLImage->GetFirstVTKImageData();
+ mCurrentLabelUnderMousePointer =
+ mCurrentSlicerManager->GetSlicer(0)->GetScalarComponentAsDouble(image, Xover, Yover, Zover, ix, iy, iz, 0);
+ return;
+ }
+ }
+ else {
+ // DD("out of mask");
+ mCurrentLabelUnderMousePointer = 0; // BG is always 0 in CCL
+ }
+#else
+ if (Xover >= image->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[0] &&
+ Xover <= image->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[1] &&
+ Yover >= image->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[2] &&
+ Yover <= image->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[3] &&
+ Zover >= image->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[4] &&
+ Zover <= image->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[5]) {
+ if (mCurrentState == State_Default) { // inside the mask
+ mCurrentLabelUnderMousePointer = 1;
+ return;
+ }
+ else { // inside the label image
+ vtkImageData * image = mCurrentCCLImage->GetFirstVTKImageData();
+ mCurrentLabelUnderMousePointer =
+ mCurrentSlicerManager->GetSlicer(0)->GetScalarComponentAsDouble(image, Xover, Yover, Zover, ix, iy, iz, 0);
+ return;
+ }
}
else {
// DD("out of mask");
mCurrentLabelUnderMousePointer = 0; // BG is always 0 in CCL
}
- // DD(mCurrentLabelUnderMousePointer);
+#endif
}
//------------------------------------------------------------------------------