X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolSegmentation.cxx;h=63ff9b150f6cac958826bb87e83b9473310b9c0a;hb=d55f025b18f68066a52b8f33c2dc6481e82c2580;hp=9bd9365e105eff6babee4b76147a2727be54e4ff;hpb=e34e0e0eb662c6c7fa3681f53aac959fef4b4f73;p=clitk.git diff --git a/vv/vvToolSegmentation.cxx b/vv/vvToolSegmentation.cxx index 9bd9365..63ff9b1 100644 --- a/vv/vvToolSegmentation.cxx +++ b/vv/vvToolSegmentation.cxx @@ -26,12 +26,17 @@ // clitk #include "clitkConnectedComponentLabeling_ggo.h" #include "clitkConnectedComponentLabelingGenericFilter.h" +#include "clitkRegionGrowing_ggo.h" +#include "clitkRegionGrowingGenericFilter.h" // Qt #include #include // vtk +#include +#include +#include #include "vtkImageContinuousErode3D.h" #include "vtkImageContinuousDilate3D.h" #include "vtkRenderWindow.h" @@ -69,6 +74,9 @@ vvToolSegmentation::vvToolSegmentation(vvMainWindowBase * parent, Qt::WindowFlag 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 @@ -96,7 +104,6 @@ bool vvToolSegmentation::close() DD("remo mask"); if (mCurrentMaskActor) mCurrentMaskActor->RemoveActors(); for(int i=0; iRemoveActors(); } DD("wclose"); @@ -200,6 +207,7 @@ void vvToolSegmentation::OpenBinaryImage() // Add a new roi actor for the current mask mCurrentMaskActor = CreateMaskActor(mCurrentMaskImage, 1, 0, false); mCurrentMaskActor->Update(); // default color is red + UpdateMaskSize(mCurrentMaskImage, mCurrentMaskSizeInPixels, mCurrentMaskSizeInCC); // Add a mask actor for the reference mRefMaskActor = CreateMaskActor(mRefMaskImage, 0, 1, true); @@ -208,6 +216,48 @@ void vvToolSegmentation::OpenBinaryImage() mRefMaskActor->SetContourColor(0,1,0); // green contour mRefMaskActor->UpdateColor(); mRefMaskActor->Update(); + UpdateMaskSize(mRefMaskImage, mRefMaskSizeInPixels, mRefMaskSizeInCC); + + // Update GUI + UpdateMaskSizeLabels(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolSegmentation::UpdateMaskSizeLabels() +{ + QString s("%1 pix (%2 cm3)"); + s = s.arg(mRefMaskSizeInPixels).arg(mRefMaskSizeInCC); + mRefMaskSizeLabel->setText(s); + QString s2("%1 pix (%2 cm3)"); + s2 = s2.arg(mCurrentMaskSizeInPixels).arg(mCurrentMaskSizeInCC); + mCurrentMaskSizeLabel->setText(s2); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolSegmentation::UpdateMaskSize(vvImage::Pointer image, long & pix, double & cc) +{ + pix = ComputeNumberOfPixels(image, GetForegroundValue()); + double vol = image->GetSpacing()[0]*image->GetSpacing()[1]*image->GetSpacing()[2]; + cc = pix * vol / (10*10*10); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +long vvToolSegmentation::ComputeNumberOfPixels(vvImage::Pointer image, double value) +{ + int n=0; + vtkImageData * im = image->GetFirstVTKImageData(); + char * pPix = (char*)im->GetScalarPointer(); // FIXME char ? + for(uint i=0; iGetNumberOfPoints(); i++) { + if (pPix[i] == value) n++; + } + DD(n); + return n; } //------------------------------------------------------------------------------ @@ -215,6 +265,9 @@ void vvToolSegmentation::OpenBinaryImage() //------------------------------------------------------------------------------ void vvToolSegmentation::KeyPressed(std::string KeyPress) { + if (KeyPress == "G") { + RegionGrowing(); + } if (KeyPress == "e") { Erode(); } @@ -226,6 +279,7 @@ void vvToolSegmentation::KeyPressed(std::string KeyPress) } if (KeyPress == "m") { Merge(); + UpdateAndRenderNewMask(); } if (KeyPress == "s") { // Supress "Remove" one label if (mCurrentState == State_CCL) RemoveLabel(); @@ -245,6 +299,63 @@ void vvToolSegmentation::KeyPressed(std::string KeyPress) //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +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 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() { @@ -266,7 +377,7 @@ void vvToolSegmentation::Merge() int * pCCL = (int*)ccl->GetScalarPointer(); char * pPix = (char*)mask->GetScalarPointer(); for(uint i=0; iGetNumberOfPoints(); i++) { - if (pCCL[i] == 0) pPix[i] = 0; // copy BG + if (pCCL[i] == 0) pPix[i] = GetBackgroundValue(); // copy BG. In CCL BG is always 0 } // Display new mask and remove ccl @@ -275,7 +386,7 @@ void vvToolSegmentation::Merge() mCurrentMaskActor = CreateMaskActor(mCurrentMaskImage, 1, 0, false); // renew mCurrentMaskActor->Update(); mCurrentMaskActor->SetVisible(true); - mCurrentSlicerManager->Render(); + // mCurrentSlicerManager->Render(); mCurrentState = State_Default; } //------------------------------------------------------------------------------ @@ -291,10 +402,18 @@ void vvToolSegmentation::Erode() 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(); @@ -312,10 +431,18 @@ void vvToolSegmentation::Dilate() 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(); @@ -335,6 +462,8 @@ void vvToolSegmentation::UpdateAndRenderNewMask() mCurrentMaskActor->SetContourVisible(cvisible); mCurrentSlicerManager->Render(); + UpdateMaskSize(mCurrentMaskImage, mCurrentMaskSizeInPixels, mCurrentMaskSizeInCC); + UpdateMaskSizeLabels(); } //------------------------------------------------------------------------------ @@ -352,7 +481,7 @@ void vvToolSegmentation::Labelize() typedef args_info_clitkConnectedComponentLabeling ArgsInfoType; ArgsInfoType a; cmdline_parser_clitkConnectedComponentLabeling_init(&a); - a.inputBG_arg = 0; + a.inputBG_arg = GetBackgroundValue(); a.full_flag = false; // FIXME set by gui a.minSize_arg = 100; // FIXME set by gui typedef clitk::ConnectedComponentLabelingGenericFilter FilterType; @@ -426,34 +555,72 @@ QSharedPointer vvToolSegmentation::CreateMaskActor(vvImage::Pointer //------------------------------------------------------------------------------ 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; + mCurrentLabelUnderMousePointer = 0; // BG is always 0 in CCL } - // DD(mCurrentLabelUnderMousePointer); +#endif } //------------------------------------------------------------------------------ @@ -470,8 +637,14 @@ void vvToolSegmentation::RemoveLabel() { // Set image label vtkImageData * image = mCurrentCCLImage->GetFirstVTKImageData(); int * pPix = (int*)image->GetScalarPointer(); + int n = 0; for(uint i=0; iGetNumberOfPoints(); i++) { if (pPix[i] == mCurrentLabelUnderMousePointer) pPix[i] = 0; + if (pPix[i] != 0) n++; // count the number of pixels in the foreground } + // Update mask size + mCurrentMaskSizeInPixels = n; + mCurrentMaskSizeInCC = mCurrentMaskImage->GetSpacing()[0] * mCurrentMaskImage->GetSpacing()[1] * mCurrentMaskImage->GetSpacing()[2] * n / (10*10*10); + UpdateMaskSizeLabels(); } //------------------------------------------------------------------------------