]> Creatis software - clitk.git/commitdiff
- update vv tool Binarize, now work with float pixel type + display lower contour
authordsarrut <dsarrut>
Fri, 5 Mar 2010 10:32:32 +0000 (10:32 +0000)
committerdsarrut <dsarrut>
Fri, 5 Mar 2010 10:32:32 +0000 (10:32 +0000)
filters/clitkBinarizeImageGenericFilter.txx
vv/qt_ui/vvIntensityValueSlider.ui
vv/vvImageContour.cxx
vv/vvImageContour.h
vv/vvIntensityValueSlider.cxx
vv/vvIntensityValueSlider.h
vv/vvToolBinarize.cxx
vv/vvToolBinarize.h

index fcdb6938314cbd07a6eb14bc1036f7dd01d88a91..747412acde44b85ea32f0b6627a4af3e2c312d45 100644 (file)
@@ -22,9 +22,9 @@ namespace clitk
   template<class args_info_type>
   BinarizeImageGenericFilter<args_info_type>::BinarizeImageGenericFilter():
     ImageToImageGenericFilter<Self>("Binarize") {
-    //    InitializeImageType<2>();
+    InitializeImageType<2>();
     InitializeImageType<3>();
-    //InitializeImageType<4>();
+    InitializeImageType<4>();
   }
   //--------------------------------------------------------------------
 
@@ -33,7 +33,7 @@ namespace clitk
   template<class args_info_type>
   template<unsigned int Dim>
   void BinarizeImageGenericFilter<args_info_type>::InitializeImageType() {      
-    //ADD_IMAGE_TYPE(Dim, char);
+    ADD_IMAGE_TYPE(Dim, char);
     ADD_IMAGE_TYPE(Dim, short);
     ADD_IMAGE_TYPE(Dim, int);
     ADD_IMAGE_TYPE(Dim, float);
index ae0c4598d75bcad87bedf14a335ecffd739ea94c..e0e1e1ddacf2d842cf0a11871ad1bf9c775b5b3b 100644 (file)
@@ -6,25 +6,19 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>222</width>
-    <height>39</height>
+    <width>324</width>
+    <height>29</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Form</string>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <property name="leftMargin">
-    <number>2</number>
-   </property>
-   <property name="topMargin">
-    <number>2</number>
-   </property>
-   <property name="rightMargin">
+   <property name="margin">
     <number>2</number>
    </property>
    <item row="0" column="0">
-    <layout class="QHBoxLayout" name="horizontalLayout">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
       <widget class="QLabel" name="mLabel">
        <property name="text">
      </item>
      <item>
       <widget class="QDoubleSpinBox" name="mSpinBox">
-       <property name="minimumSize">
-        <size>
-         <width>0</width>
-         <height>0</height>
-        </size>
-       </property>
        <property name="decimals">
-        <number>2</number>
+        <number>1</number>
        </property>
        <property name="minimum">
         <double>-9999.000000000000000</double>
        </property>
       </widget>
      </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QPushButton" name="mButtonMinus">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>15</width>
+           <height>15</height>
+          </size>
+         </property>
+         <property name="font">
+          <font>
+           <pointsize>18</pointsize>
+          </font>
+         </property>
+         <property name="text">
+          <string>-</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="mButtonPlus">
+         <property name="maximumSize">
+          <size>
+           <width>15</width>
+           <height>15</height>
+          </size>
+         </property>
+         <property name="font">
+          <font>
+           <pointsize>18</pointsize>
+          </font>
+         </property>
+         <property name="text">
+          <string>+</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
     </layout>
    </item>
   </layout>
index 88924c1895d5c27cd247a603419508e77f398d8f..7318640f78d287209c4533c20605786ea33391f3 100644 (file)
@@ -3,8 +3,8 @@
   Program:   vv
   Module:    $RCSfile: vvImageContour.cxx,v $
   Language:  C++
-  Date:      $Date: 2010/03/01 07:37:25 $
-  Version:   $Revision: 1.4 $
+  Date:      $Date: 2010/03/05 10:32:33 $
+  Version:   $Revision: 1.5 $
   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
 
   Copyright (C) 2010
@@ -83,6 +83,15 @@ void vvImageContour::setSlicer(vvSlicer * slicer) {
 //------------------------------------------------------------------------------
 
 
+//------------------------------------------------------------------------------
+void vvImageContour::setColor(double r, double g, double b) {
+  for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
+    mSquaresActorList[i]->GetProperty()->SetColor(r,g,b);
+  }
+}
+//------------------------------------------------------------------------------
+
+
 //------------------------------------------------------------------------------
 void vvImageContour::hideActors() {
   if (!mSlicer) return;
@@ -108,7 +117,7 @@ void vvImageContour::showActors() {
 
   
 //------------------------------------------------------------------------------
-void vvImageContour::update(int value) {
+void vvImageContour::update(double value) {
   mValue= value;
   if (!mSlicer) return;
 
index 3bf4a6e3c07203ca4177d615e615f2aaf24c6803..4228b7021732c6cab89553a7568ebf815dfc3713 100644 (file)
@@ -3,8 +3,8 @@
   Program:   vv
   Module:    $RCSfile: vvImageContour.h,v $
   Language:  C++
-  Date:      $Date: 2010/03/01 07:37:25 $
-  Version:   $Revision: 1.4 $
+  Date:      $Date: 2010/03/05 10:32:33 $
+  Version:   $Revision: 1.5 $
   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
 
   Copyright (C) 2010
@@ -43,15 +43,16 @@ class vvImageContour
   ~vvImageContour();
 
   void setSlicer(vvSlicer * slicer);
-  void update(int value);
+  void update(double value);
   void hideActors();
   void showActors();
+  void setColor(double r, double g, double b);
 
  protected:
   vvSlicer * mSlicer;
   int mSlice;
   int mTSlice;
-  int mValue;
+  double mValue;
 
   std::vector<vtkImageClip*> mClipperList;
   std::vector<vtkMarchingSquares*> mSquaresList;
index c1973aff97ccbb04ba6020e1cfa433134c78503e..ce2c6f8278029b61f3a50573a6e23ce94c684f6f 100644 (file)
@@ -3,8 +3,8 @@
   Program:   vv
   Module:    $RCSfile: vvIntensityValueSlider.cxx,v $
   Language:  C++
-  Date:      $Date: 2010/03/01 07:37:25 $
-  Version:   $Revision: 1.4 $
+  Date:      $Date: 2010/03/05 10:32:33 $
+  Version:   $Revision: 1.5 $
   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
 
   Copyright (C) 2008
@@ -33,13 +33,15 @@ vvIntensityValueSlider::vvIntensityValueSlider(QWidget * parent, Qt::WindowFlags
 {
   // GUI Initialization
   setupUi(this);  
-  mValue = 0;
-  SetMaximum(1000);
-  SetMinimum(-1000);
+  mIsInteger = true;
+  mButtonPlus->setHidden(true);
+  mButtonMinus->setHidden(true);
   
   // Connect signals & slots
   connect(mSpinBox, SIGNAL(valueChanged(double)), this, SLOT(valueChangedFromSpinBox(double)));
   connect(mSlider, SIGNAL(valueChanged(int)), this, SLOT(valueChangedFromSlider(int)));
+  connect(mButtonPlus, SIGNAL(clicked()), this, SLOT(SingleStepPlusClicked()));
+  connect(mButtonMinus, SIGNAL(clicked()), this, SLOT(SingleStepMinusClicked()));
 }
 //------------------------------------------------------------------------------
 
@@ -50,9 +52,40 @@ vvIntensityValueSlider::~vvIntensityValueSlider() {
 //------------------------------------------------------------------------------
 
 
+//------------------------------------------------------------------------------
+void vvIntensityValueSlider::SingleStepMinusClicked() {
+  mSpinBox->setSingleStep(mSpinBox->singleStep()*10);
+  mSpinBox->setDecimals(mSpinBox->decimals()-1);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvIntensityValueSlider::SetSingleStep(double step) {
+  mSpinBox->setSingleStep(step);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvIntensityValueSlider::SingleStepPlusClicked() {
+  mSpinBox->setSingleStep(mSpinBox->singleStep()/10);
+  mSpinBox->setDecimals(mSpinBox->decimals()+1);
+}
+//------------------------------------------------------------------------------
+
+
 //------------------------------------------------------------------------------
 void vvIntensityValueSlider::valueChangedFromSpinBox(double v) {
-  mSlider->setValue(v);
+  if (v == mValue) return;
+  mSpinBox->setValue(v);
+  v = mSpinBox->value(); // this is needed to 'round' value according to spinBox precision
+  double vv;
+  if (!mIsInteger) {
+    vv = ((v-mMin)/mWidth)/mSliderFactor;
+  }
+  else vv = v;
+  mSlider->setValue(vv);
   mValue = v;
   emit valueChanged(v);
 }
@@ -60,8 +93,18 @@ void vvIntensityValueSlider::valueChangedFromSpinBox(double v) {
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::valueChangedFromSlider(int v) {
-  mSpinBox->setValue(v*mSliderFactor);
+void vvIntensityValueSlider::valueChangedFromSlider(int vv) {
+  double v;
+  if (!mIsInteger) {
+    v = ((double)vv*mSliderFactor)*mWidth+mMin;
+  }
+  else v= vv;
+
+  // arrondir ! ?
+
+  if (mValue == v) return;
+  mSpinBox->setValue(v);
+  mValue = v;
 }
 //------------------------------------------------------------------------------
 
@@ -82,16 +125,27 @@ void vvIntensityValueSlider::SetImage(vvImage * im) {
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::SetValue(double d) { 
-  mSpinBox->setValue(d);
+void vvIntensityValueSlider::SetValue(double v) { 
+  mValue = v;
+  mSpinBox->setValue(v);
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
 void vvIntensityValueSlider::SetMaximum(double max) {
-  mSlider->setMaximum(max);
+  mMax = max;
   mSpinBox->setMaximum(max);
+  
+  // If integer values : update slider max
+  if (mIsInteger == 1) {
+    mSlider->setMaximum(max);
+  }
+  else {
+    double step = mWidth/1000.0;
+    mSpinBox->setSingleStep(step);
+    mWidth = mMax-mMin;
+  }
   if (mValue > max) { SetValue(max); }
   QString tip = QString("Min = %1    Max = %2").arg(mSpinBox->minimum()).arg(max);
   setToolTip(tip);
@@ -101,8 +155,18 @@ void vvIntensityValueSlider::SetMaximum(double max) {
 
 //------------------------------------------------------------------------------
 void vvIntensityValueSlider::SetMinimum(double min) {
-  mSlider->setMinimum(min);
+  mMin = min;
   mSpinBox->setMinimum(min);
+
+  if (mIsInteger == 1) {
+    mSlider->setMinimum(min);
+  }
+  else {
+    double step = mWidth/1000.0;
+    mSpinBox->setSingleStep(step);
+    mWidth = mMax-mMin;
+  }
+
   if (mValue < min) { SetValue(min); }
   QString tip = QString("Min = %1    Max = %2").arg(min).arg(mSpinBox->maximum());
   setToolTip(tip);
@@ -112,28 +176,43 @@ void vvIntensityValueSlider::SetMinimum(double min) {
 
 //------------------------------------------------------------------------------
 void vvIntensityValueSlider::Update() {
+  double range[2];
+  mImage->GetFirstVTKImageData()->GetScalarRange(range);
+  mMin = range[0];
+  mMax = range[1];
+  double step = (mMax-mMin)/1000.0;
+  
   if (mImage->IsScalarTypeInteger()) {
-
+    mIsInteger = true;
     mSpinBox->setSingleStep(1.0);
     mSpinBox->setDecimals(0);
-    mSliderFactor = 1.0;
-
-    double range[2];
-    mImage->GetFirstVTKImageData()->GetScalarRange(range);
-    mMin = range[0];
-    mMax = range[1];
     mSlider->setMaximum(mMax);
     mSlider->setMinimum(mMin);
-    mSpinBox->setMaximum(mMax);
-    mSpinBox->setMinimum(mMin);
-
-    QString tip = QString("Min = %1    Max = %2").arg(mMin).arg(mMax);
-    setToolTip(tip);
+    mSlider->setSingleStep(1);
+    mSliderFactor = 1.0;
+    mWidth = 1.0;
   }
   else {
-    std::cerr << "NO floating point image yet !!" << std::endl;
-    exit(0);
+    mIsInteger = false;
+    mButtonPlus->setHidden(false);
+    mButtonMinus->setHidden(false);
+    mSpinBox->sizePolicy().setHorizontalPolicy(QSizePolicy::Expanding);
+    mSpinBox->setSingleStep(step);
+    mSpinBox->setDecimals(4);
+    mSlider->setMaximum(1000);
+    mSlider->setMinimum(0);
+    mSlider->setSingleStep(1);
+    mSliderFactor = 1.0/1000.0;
+    mWidth = mMax-mMin;
   }
+  
+  mSpinBox->setMaximum(mMax);
+  mSpinBox->setMinimum(mMin);
+  mSpinBox->setValue((mMax-mMin)/2.0+mMin);
+  
+  QString tip = QString("Min = %1    Max = %2").arg(mMin).arg(mMax);
+  setToolTip(tip);
 }
-
 //------------------------------------------------------------------------------
+
+
index 4050de4ded33ef7dadcb06cfbf6a7b2307822376..be6e7138ed816f2c4f1938efd21e55a6a3c24771 100644 (file)
@@ -3,8 +3,8 @@
   Program:   vv
   Module:    $RCSfile: vvIntensityValueSlider.h,v $
   Language:  C++
-  Date:      $Date: 2010/02/05 09:06:46 $
-  Version:   $Revision: 1.2 $
+  Date:      $Date: 2010/03/05 10:32:33 $
+  Version:   $Revision: 1.3 $
   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
 
   Copyright (C) 2008
@@ -50,13 +50,16 @@ class vvIntensityValueSlider:
   double GetValue() const { return mValue; }
   void SetValue(double d);
   void SetMaximum(double max);
-  void SetMinimum(double min);                         
+  void SetMinimum(double min);
+  void SetSingleStep(double step);                         
   void resetMinimum() { SetMinimum(mMin); }
   void resetMaximum() { SetMaximum(mMax); }
 
  public slots:
   void valueChangedFromSpinBox(double v);
   void valueChangedFromSlider(int v);
+  void SingleStepPlusClicked();
+  void SingleStepMinusClicked();
 
  signals:
   void valueChanged(double);
@@ -64,10 +67,12 @@ class vvIntensityValueSlider:
  protected:
   Ui::vvIntensityValueSlider ui;
   vvImage * mImage;
+  double mMin;
+  double mMax;
+  double mWidth;
   double mSliderFactor;
   double mValue;
-  double mMax;
-  double mMin;
+  bool mIsInteger;
 
 }; // end class vvIntensityValueSlider
 //------------------------------------------------------------------------------
index 4f91d19d2c20165c87bd0e1c7acfa23ac26f33de..09016f080e8d045f4e272c75bac2fc97c882b2a6 100644 (file)
@@ -3,8 +3,8 @@
   Program:   vv
   Module:    $RCSfile: vvToolBinarize.cxx,v $
   Language:  C++
-  Date:      $Date: 2010/03/01 15:38:09 $
-  Version:   $Revision: 1.10 $
+  Date:      $Date: 2010/03/05 10:32:33 $
+  Version:   $Revision: 1.11 $
   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
 
   Copyright (C) 2008
@@ -64,8 +64,6 @@ vvToolBinarize::vvToolBinarize(vvMainWindowBase * parent, Qt::WindowFlags f)
   mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked();
 
   // Connect signals & slots  
-  connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
-  connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
   connect(mRadioButtonLowerThan, SIGNAL(toggled(bool)), this, SLOT(enableLowerThan(bool)));
   connect(mCheckBoxUseFG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
   connect(mCheckBoxUseBG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
@@ -96,8 +94,10 @@ void vvToolBinarize::InteractiveDisplayToggled(bool b) {
     RemoveVTKObjects();
   }
   else {
-    for(unsigned int i=0; i<mImageContour.size(); i++)
+    for(unsigned int i=0; i<mImageContour.size(); i++) {
       mImageContour[i]->showActors();
+      mImageContourLower[i]->showActors();
+    }
     if (mCurrentSlicerManager)
       mCurrentSlicerManager->Render();
   }
@@ -107,8 +107,10 @@ void vvToolBinarize::InteractiveDisplayToggled(bool b) {
 
 //------------------------------------------------------------------------------
 void vvToolBinarize::RemoveVTKObjects() { 
-  for(unsigned int i=0; i<mImageContour.size(); i++)
+  for(unsigned int i=0; i<mImageContour.size(); i++) {
     mImageContour[i]->hideActors();
+    mImageContourLower[i]->hideActors();    
+  }
   if (mCurrentSlicerManager)
     mCurrentSlicerManager->Render();
 }
@@ -135,9 +137,18 @@ void vvToolBinarize::reject() {
 void vvToolBinarize::enableLowerThan(bool b) {
   if (!b) {
     mThresholdSlider1->resetMaximum();
+    for(unsigned int i=0; i<mImageContour.size(); i++) {
+      mImageContourLower[i]->hideActors();    
+    }
+    mCurrentSlicerManager->Render();
   }
   else {
     valueChangedT1(mThresholdSlider1->GetValue());
+    valueChangedT2(mThresholdSlider2->GetValue());
+    for(unsigned int i=0; i<mImageContour.size(); i++) {
+      mImageContourLower[i]->showActors();    
+    }
+    mCurrentSlicerManager->Render();
   }
 }
 //------------------------------------------------------------------------------
@@ -169,13 +180,23 @@ void vvToolBinarize::InputIsSelected(vvSlicerManager * m) {
   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
   mFGSlider->SetValue(1);
   mBGSlider->SetValue(0);
+  mFGSlider->SetSingleStep(1);
+  mBGSlider->SetSingleStep(1);
   
   // VTK objects for interactive display
   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
     mImageContour.push_back(new vvImageContour);
     mImageContour[i]->setSlicer(mCurrentSlicerManager->GetSlicer(i));
+    mImageContour[i]->setColor(1.0, 0.0, 0.0);
+    mImageContourLower.push_back(new vvImageContour);
+    mImageContourLower[i]->setSlicer(mCurrentSlicerManager->GetSlicer(i));
+    mImageContourLower[i]->setColor(0.0, 0.0, 1.0);
   }
   valueChangedT1(mThresholdSlider1->GetValue());
+
+  connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
+  connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
+
   connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
   connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
 
@@ -189,6 +210,9 @@ void vvToolBinarize::UpdateSlice(int slicer,int slices) {
   if (!mCurrentSlicerManager) close();
   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
     mImageContour[i]->update(mThresholdSlider1->GetValue());
+    if (mRadioButtonLowerThan->isChecked()) 
+      mImageContourLower[i]->update(mThresholdSlider2->GetValue());
+
   }
   mCurrentSlicerManager->Render(); 
 }
@@ -279,19 +303,28 @@ void vvToolBinarize::apply() {
 
 //------------------------------------------------------------------------------
 void vvToolBinarize::valueChangedT2(double v) {
-  if (mRadioButtonLowerThan->isChecked()) mThresholdSlider1->SetMaximum(v);
+  //  DD("valueChangedT2");
+  if (mRadioButtonLowerThan->isChecked()) {
+    mThresholdSlider1->SetMaximum(v);
+    if (!mInteractiveDisplayIsEnabled) return;
+    for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
+      mImageContourLower[i]->update(v);
+    }
+    mCurrentSlicerManager->Render();
+  }
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
 void vvToolBinarize::valueChangedT1(double v) {
+  //  DD("valueChangedT1");
   if (!mCurrentSlicerManager) close();
   mThresholdSlider2->SetMinimum(v);
-  int m1 = (int)lrint(v);  
+  //  int m1 = (int)lrint(v);  
   if (!mInteractiveDisplayIsEnabled) return;
   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
-    mImageContour[i]->update(m1);
+    mImageContour[i]->update(v);
   }
   mCurrentSlicerManager->Render();
 }
index 0453ad1ee019febfe0487b8b43f312649d02f5ed..4b0721f1e8b5bf64280695b7e3a46e1922182f4b 100644 (file)
@@ -3,8 +3,8 @@
   Program:   vv
   Module:    $RCSfile: vvToolBinarize.h,v $
   Language:  C++
-  Date:      $Date: 2010/03/01 07:37:25 $
-  Version:   $Revision: 1.7 $
+  Date:      $Date: 2010/03/05 10:32:33 $
+  Version:   $Revision: 1.8 $
   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
 
   Copyright (C) 2010
@@ -70,6 +70,7 @@ class vvToolBinarize:
   Ui::vvToolBinarize ui;
   args_info_clitkBinarizeImage mArgsInfo;
   std::vector<vvImageContour*> mImageContour;
+  std::vector<vvImageContour*> mImageContourLower;
   bool mInteractiveDisplayIsEnabled;
 
 }; // end class vvToolBinarize