]> Creatis software - clitk.git/blob - vv/vvToolBinarize.cxx
binarize
[clitk.git] / vv / vvToolBinarize.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolBinarize.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/02/07 08:49:42 $
7   Version:   $Revision: 1.6 $
8   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
9
10   Copyright (C) 2008
11   Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
12   CREATIS-LRMN http://www.creatis.insa-lyon.fr
13
14   This program is free software: you can redistribute it and/or modify
15   it under the terms of the GNU General Public License as published by
16   the Free Software Foundation, version 3 of the License.
17
18   This program is distributed in the hope that it will be useful,
19   but WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21   GNU General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with this program.  If not, see <http://www.gnu.org/licenses/>.
25
26   =========================================================================*/
27
28 #include "vvToolBinarize.h"
29 #include "vvSlicerManager.h"
30 #include "vvSlicer.h"
31 #include "vvToolInputSelectorWidget.h"
32
33 #include "clitkBinarizeImageGenericFilter.h"
34
35 #include "vtkImageActor.h"
36 #include "vtkCamera.h"
37
38 //------------------------------------------------------------------------------
39 // Create the tool and automagically (I like this word) insert it in
40 // the main window menu.
41 ADD_TOOL(vvToolBinarize);
42 //------------------------------------------------------------------------------
43
44
45 //------------------------------------------------------------------------------
46 vvToolBinarize::vvToolBinarize(QWidget * parent, Qt::WindowFlags f)
47   :QDialog(parent,f), vvToolBase<vvToolBinarize>(), Ui::vvToolBinarize() 
48 {
49   // Set Modality : dialog is not modal but stay always on top because
50   // parent is set at construction
51   setModal(false);
52   setAttribute(Qt::WA_DeleteOnClose);
53
54   // GUI Initialization
55   setupUi(this);
56
57   // Connect signals & slots  
58   connect(mToolInputSelectionWidget, SIGNAL(accepted()), this, SLOT(InputIsSelected()));
59   connect(mToolInputSelectionWidget, SIGNAL(rejected()), this, SLOT(close()));
60   connect(buttonBox, SIGNAL(accepted()), this, SLOT(apply()));
61   connect(buttonBox, SIGNAL(rejected()), this, SLOT(close()));
62   connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
63   connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
64   connect(mRadioButtonLowerThan, SIGNAL(toggled(bool)), this, SLOT(enableLowerThan(bool)));
65   connect(mCheckBoxUseFG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
66   connect(mCheckBoxUseBG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
67
68   // VTK objects
69   /*
70   mClipper = vtkImageClip::New();
71   mSquares1 = vtkMarchingSquares::New();
72   mSquaresMapper1 = vtkPolyDataMapper::New();
73   mSquaresActor1 = vtkActor::New();
74   */
75   mImageContour = new vvImageContour;
76
77   //new vector of contours
78
79   // Initialize some widget
80   mThresholdSlider1->SetText("");
81   mThresholdSlider2->SetText("");
82   mFGSlider->SetText("Foreground value");
83   mBGSlider->SetText("Background value");
84
85   // Disable main widget while input image is not selected
86   toolMainWidget->setEnabled(false);
87
88   // Main filter 
89   mFilter = new clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>; //DS PUT IN BASECLASS ?
90
91   // Initialize the input selection (mFilter should be create before !)
92   InitializeListOfInputImages(mToolInputSelectionWidget, mFilter);
93 }
94 //------------------------------------------------------------------------------
95
96
97 //------------------------------------------------------------------------------
98 vvToolBinarize::~vvToolBinarize() {
99 }
100 //------------------------------------------------------------------------------
101
102
103 //------------------------------------------------------------------------------
104 void vvToolBinarize::enableLowerThan(bool b) {
105   if (!b) {
106     mThresholdSlider1->resetMaximum();
107   }
108   else {
109     valueChangedT1(mThresholdSlider1->GetValue());
110   }
111 }
112 //------------------------------------------------------------------------------
113
114
115 //------------------------------------------------------------------------------
116 void vvToolBinarize::useFGBGtoggled(bool) {
117   DD("ici");
118   if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked()) 
119     mCheckBoxUseBG->toggle();
120 }
121 //------------------------------------------------------------------------------
122
123
124 //------------------------------------------------------------------------------
125 void vvToolBinarize::InputIsSelected() {
126
127   // Common
128   int index = mToolInputSelectionWidget->GetSelectedInputIndex();
129   mCurrentSliceManager = mSlicerManagersCompatible[index];
130   mCurrentImage = mCurrentSliceManager->GetImage();
131   toolMainWidget->setEnabled(true);
132
133   // Specific for this gui
134   mThresholdSlider1->SetImage(mCurrentImage);
135   mThresholdSlider2->SetImage(mCurrentImage);
136   mFGSlider->SetImage(mCurrentImage);
137   mBGSlider->SetImage(mCurrentImage);
138   DD(mCurrentSliceManager->GetFileName().c_str());
139   mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
140   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
141   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
142   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
143   mFGSlider->SetValue(1);
144   mBGSlider->SetValue(0);
145   
146   DD("VTK");
147   DD(mCurrentSliceManager->NumberOfSlicers());
148   //    mClipper->SetInput(mCurrentSliceManager->GetSlicer(0)->GetInput());
149   DD(mCurrentImage->GetFirstVTKImageData());
150   //  DD(mClipper);
151   DD(mCurrentSliceManager->GetSlicer(0));
152   mImageContour->setSlicer(mCurrentSliceManager->GetSlicer(0));
153
154   /*
155   mClipper->SetInput(mCurrentImage->GetFirstVTKImageData());
156   mSquares1->SetInput(mClipper->GetOutput());
157   mSquaresMapper1->SetInput(mSquares1->GetOutput());
158   mSquaresMapper1->ScalarVisibilityOff();
159   mSquaresActor1->SetMapper(mSquaresMapper1);
160   mSquaresActor1->GetProperty()->SetColor(1.0,0,0);
161   mSquaresActor1->SetPickable(0);
162   mCurrentSliceManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor1);
163   mSquares1->Update();
164   */
165   
166   DD("VTK end");
167   
168   //    connect(mCurrentSliceManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
169   connect(mCurrentSliceManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
170   //connect(mCurrentSliceManager,SIGNAL(UpdateSliceRange(int,int,int,int,int)),this,SLOT(UpdateSlice(int, int)));
171   //    connect(mCurrentSliceManager,SIGNAL(LandmarkAdded()),this,SLOT(InsertSeed()));
172   
173 }
174 //------------------------------------------------------------------------------
175
176
177 //------------------------------------------------------------------------------
178 void vvToolBinarize::UpdateSlice(int slicer,int slices) {
179  
180   // A METTRE SUR TOUT LES SLICES ! PAS QUE 0
181
182   // !! signal update slice pas tjs quand move slicer ???
183
184   mImageContour->update();
185
186   // int slice = mCurrentSliceManager->GetSlicer(0)->GetSlice();
187   // //int tslice = mCurrentSliceManager->GetSlicer(0)->GetTSlice();
188   // mClipper->SetInput(mCurrentSliceManager->GetSlicer(0)->GetInput());
189   // int* extent = mCurrentSliceManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
190   // mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
191   // int i;
192   // for (i = 0; i < 6;i = i+2)
193   //   {
194   //       if (extent[i] == extent[i+1])
195   //      {
196   //           break;
197   //      }
198   //   }
199   
200   // switch (i)
201   //   {
202   //   case 0:
203   //     if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
204   //       {
205   //      mSquaresActor1->SetPosition(1,0,0);
206   //      // mSquaresActor2->SetPosition(1,0,0);
207   //       }
208   //       else
209   //       {
210   //           mSquaresActor1->SetPosition(-1,0,0);
211   //           // mSquaresActor2->SetPosition(-1,0,0);
212   //       }
213   //       break;
214   //   case 2:
215   //       if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
216   //       {
217   //           mSquaresActor1->SetPosition(0,1,0);
218   //         //   mSquaresActor2->SetPosition(0,1,0);
219   //       }
220   //       else
221   //       {
222   //           mSquaresActor1->SetPosition(0,-1,0);
223   //           // mSquaresActor2->SetPosition(0,-1,0);
224   //       }
225   //       break;
226   //   case 4:
227   //       if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
228   //       {
229   //           mSquaresActor1->SetPosition(0,0,1);
230   //           // mSquaresActor2->SetPosition(0,0,1);
231   //       }
232   //       else
233   //       {
234   //           mSquaresActor1->SetPosition(0,0,-1);
235   //           // mSquaresActor2->SetPosition(0,0,-1);
236   //       }
237   //       break;
238   //   }
239   //   mSquares1->Update();
240   //  //  mSquares2->Update();
241
242     mCurrentSliceManager->Render(); 
243 }
244 //------------------------------------------------------------------------------
245
246 //------------------------------------------------------------------------------
247 void vvToolBinarize::GetArgsInfoFromGUI() {
248
249   /* //KEEP THIS FOR READING GGO FROM FILE
250     int argc=1;
251     std::string a = "toto";
252     char * const* argv = new char*;
253     //a.c_str();
254     struct cmdline_parser_params p;
255     p.check_required = 0;
256     int good = cmdline_parser_ext(argc, argv, &args_info, &p);
257   DD(good);
258   */
259
260   mArgsInfo.upper_given = 0;
261   mArgsInfo.lower_given = 0;
262   bool inverseBGandFG = false;
263
264   // if (mRadioButtonGreaterThan->isChecked()) { // Greater Than (and Lower Than)
265     mArgsInfo.lower_given = 1;
266     mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
267     DD(mArgsInfo.lower_arg);
268     if (mRadioButtonLowerThan->isChecked()) {
269       mArgsInfo.upper_given = 1;
270       mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
271       if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
272         mArgsInfo.upper_given = 0;
273         DD("TODO : lower thres greater than greater thres ! Ignoring ");
274       }
275     }
276   // }
277   // else {
278   //   if (mRadioButtonEqualThan->isChecked()) {
279   //     mArgsInfo.lower_given = 1;
280   //     mArgsInfo.upper_given = 1;
281   //     mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
282   //     mArgsInfo.upper_arg = mThresholdSlider1->GetValue();
283   //   }
284   //   else {
285   //     mArgsInfo.lower_given = 1;
286   //     mArgsInfo.upper_given = 1;
287   //     mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
288   //     mArgsInfo.upper_arg = mThresholdSlider1->GetValue();
289   //     inverseBGandFG = true;
290   //   }
291   // }
292
293   mArgsInfo.fg_arg = mFGSlider->GetValue();
294   mArgsInfo.bg_arg = mBGSlider->GetValue();
295
296   DD(inverseBGandFG);
297   if (inverseBGandFG) {
298     mArgsInfo.fg_arg = mFGSlider->GetValue();
299     mArgsInfo.bg_arg = mBGSlider->GetValue();
300   }
301   mArgsInfo.fg_given = 1;
302   mArgsInfo.bg_given = 1;
303
304   if (mCheckBoxUseBG->isChecked()) {
305     if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
306     else mArgsInfo.mode_arg = (char*)"BG";
307   }
308   else mArgsInfo.mode_arg = (char*)"FG";
309
310   // DD(mArgsInfo.useBG_flag);
311   // DD(mArgsInfo.useFG_flag);
312
313   mArgsInfo.verbose_flag = true;
314
315   // Required (even if not used)
316   mArgsInfo.input_given = 0;
317   mArgsInfo.output_given = 0;
318   
319   mArgsInfo.input_arg = new char;
320   mArgsInfo.output_arg = new char;
321 }
322 //------------------------------------------------------------------------------
323
324
325 //------------------------------------------------------------------------------
326 void vvToolBinarize::apply() {
327   DD("Apply");
328
329   GetArgsInfoFromGUI();
330
331   DD(mArgsInfo.lower_arg);
332   // cmdline_parser2(argc, argv, &args_info, 1, 1, 0);                  
333   //   if (args_info.config_given)      
334   // cmdline_parser_configfile ("toto.config", &args_info, 0, 0, 1);
335   //   else cmdline_parser(argc, argv, &args_info);
336
337   // Main filter
338   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter = 
339     clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
340   filter->SetArgsInfo(mArgsInfo);
341   filter->SetInputVVImage(mCurrentImage);
342   filter->Update();
343
344   // Output ???
345   vvImage::Pointer output = filter->GetOutputVVImage();
346   DD(output->GetScalarTypeAsString());
347   CREATOR(vvToolBinarize)->mMainWindow->AddImage(output,"toto.mhd"); 
348   close();
349 }
350 //------------------------------------------------------------------------------
351
352
353 //------------------------------------------------------------------------------
354 void vvToolBinarize::valueChangedT2(double v) {
355   if (mRadioButtonLowerThan->isChecked()) mThresholdSlider1->SetMaximum(v);
356 }
357 //------------------------------------------------------------------------------
358
359
360 //------------------------------------------------------------------------------
361 void vvToolBinarize::valueChangedT1(double v) {
362   mThresholdSlider2->SetMinimum(v);
363   DD(v);
364   int m1 = (int)lrint(v);
365   DD(m1);  
366   int* extent = mCurrentSliceManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
367   mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
368
369
370 int slice = mCurrentSliceManager->GetSlicer(0)->GetSlice();
371
372  int i;
373 for (i = 0; i < 6;i = i+2)
374     {
375         if (extent[i] == extent[i+1])
376         {
377             break;
378         }
379     }
380
381     switch (i)
382     {
383     case 0:
384         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
385         {
386             mSquaresActor1->SetPosition(1,0,0);
387             // mSquaresActor2->SetPosition(1,0,0);
388         }
389         else
390         {
391             mSquaresActor1->SetPosition(-1,0,0);
392             // mSquaresActor2->SetPosition(-1,0,0);
393         }
394         break;
395     case 2:
396         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
397         {
398             mSquaresActor1->SetPosition(0,1,0);
399            //  mSquaresActor2->SetPosition(0,1,0);
400         }
401         else
402         {
403             mSquaresActor1->SetPosition(0,-1,0);
404             // mSquaresActor2->SetPosition(0,-1,0);
405         }
406         break;
407     case 4:
408         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
409         {
410             mSquaresActor1->SetPosition(0,0,1);
411             // mSquaresActor2->SetPosition(0,0,1);
412         }
413         else
414         {
415             mSquaresActor1->SetPosition(0,0,-1);
416             // mSquaresActor2->SetPosition(0,0,-1);
417         }
418         break;
419     }
420
421
422
423
424   mSquares1->SetValue(0,m1);
425   mSquares1->Update();
426   mCurrentSliceManager->Render();
427 }
428 //------------------------------------------------------------------------------