]> 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/06 15:38:14 $
7   Version:   $Revision: 1.5 $
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   mClipper = vtkImageClip::New();
70   mSquares1 = vtkMarchingSquares::New();
71   mSquaresMapper1 = vtkPolyDataMapper::New();
72   mSquaresActor1 = vtkActor::New();
73
74   // Initialize some widget
75   mThresholdSlider1->SetText("");
76   mThresholdSlider2->SetText("");
77   mFGSlider->SetText("Foreground value");
78   mBGSlider->SetText("Background value");
79
80
81   // Disable main widget while input image is not selected
82   toolMainWidget->setEnabled(false);
83
84   // Main filter 
85   mFilter = new clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>; //DS PUT IN BASECLASS ?
86
87   // Initialize the input selection (mFilter should be create before !)
88   InitializeListOfInputImages(mToolInputSelectionWidget, mFilter);
89 }
90 //------------------------------------------------------------------------------
91
92
93 //------------------------------------------------------------------------------
94 vvToolBinarize::~vvToolBinarize() {
95 }
96 //------------------------------------------------------------------------------
97
98
99 //------------------------------------------------------------------------------
100 void vvToolBinarize::enableLowerThan(bool b) {
101   if (!b) {
102     mThresholdSlider1->resetMaximum();
103   }
104   else {
105     valueChangedT1(mThresholdSlider1->GetValue());
106   }
107 }
108 //------------------------------------------------------------------------------
109
110
111 //------------------------------------------------------------------------------
112 void vvToolBinarize::useFGBGtoggled(bool) {
113   DD("ici");
114   if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked()) 
115     mCheckBoxUseBG->toggle();
116 }
117 //------------------------------------------------------------------------------
118
119
120 //------------------------------------------------------------------------------
121 void vvToolBinarize::InputIsSelected() {
122
123   // Common
124   int index = mToolInputSelectionWidget->GetSelectedInputIndex();
125   mCurrentSliceManager = mSlicerManagersCompatible[index];
126   mCurrentImage = mCurrentSliceManager->GetImage();
127   toolMainWidget->setEnabled(true);
128
129   // Specific for this gui
130   mThresholdSlider1->SetImage(mCurrentImage);
131   mThresholdSlider2->SetImage(mCurrentImage);
132   mFGSlider->SetImage(mCurrentImage);
133   mBGSlider->SetImage(mCurrentImage);
134   DD(mCurrentSliceManager->GetFileName().c_str());
135   mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
136   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
137   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
138   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
139   mFGSlider->SetValue(1);
140   mBGSlider->SetValue(0);
141   
142   DD("VTK");
143   DD(mCurrentSliceManager->NumberOfSlicers());
144   //    mClipper->SetInput(mCurrentSliceManager->GetSlicer(0)->GetInput());
145   DD(mCurrentImage->GetFirstVTKImageData());
146   DD(mClipper);
147   DD(mCurrentSliceManager->GetSlicer(0));
148   mClipper->SetInput(mCurrentImage->GetFirstVTKImageData());
149   
150   mSquares1->SetInput(mClipper->GetOutput());
151   mSquaresMapper1->SetInput(mSquares1->GetOutput());
152   mSquaresActor1->SetMapper(mSquaresMapper1);
153   mSquaresActor1->GetProperty()->SetColor(1.0,0,0);
154   mSquaresActor1->SetPickable(0);
155   mCurrentSliceManager->GetSlicer(0)->GetRenderer()->AddActor(mSquaresActor1);
156   mSquares1->Update();
157   
158   
159   DD("VTK end");
160   
161   //    connect(mCurrentSliceManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
162   connect(mCurrentSliceManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
163   //connect(mCurrentSliceManager,SIGNAL(UpdateSliceRange(int,int,int,int,int)),this,SLOT(UpdateSlice(int, int)));
164   //    connect(mCurrentSliceManager,SIGNAL(LandmarkAdded()),this,SLOT(InsertSeed()));
165   
166 }
167 //------------------------------------------------------------------------------
168
169
170 //------------------------------------------------------------------------------
171 void vvToolBinarize::UpdateSlice(int slicer,int slices) {
172  
173   // A METTRE SUR TOUT LES SLICES ! PAS QUE 0
174
175   // !! signal update slice pas tjs quand move slicer ???
176
177
178    int slice = mCurrentSliceManager->GetSlicer(0)->GetSlice();
179     //int tslice = mCurrentSliceManager->GetSlicer(0)->GetTSlice();
180     mClipper->SetInput(mCurrentSliceManager->GetSlicer(0)->GetInput());
181     int* extent = mCurrentSliceManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
182     mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
183     int i;
184     for (i = 0; i < 6;i = i+2)
185     {
186         if (extent[i] == extent[i+1])
187         {
188             break;
189         }
190     }
191
192     switch (i)
193     {
194     case 0:
195         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
196         {
197             mSquaresActor1->SetPosition(1,0,0);
198             // mSquaresActor2->SetPosition(1,0,0);
199         }
200         else
201         {
202             mSquaresActor1->SetPosition(-1,0,0);
203             // mSquaresActor2->SetPosition(-1,0,0);
204         }
205         break;
206     case 2:
207         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
208         {
209             mSquaresActor1->SetPosition(0,1,0);
210           //   mSquaresActor2->SetPosition(0,1,0);
211         }
212         else
213         {
214             mSquaresActor1->SetPosition(0,-1,0);
215             // mSquaresActor2->SetPosition(0,-1,0);
216         }
217         break;
218     case 4:
219         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
220         {
221             mSquaresActor1->SetPosition(0,0,1);
222             // mSquaresActor2->SetPosition(0,0,1);
223         }
224         else
225         {
226             mSquaresActor1->SetPosition(0,0,-1);
227             // mSquaresActor2->SetPosition(0,0,-1);
228         }
229         break;
230     }
231     mSquares1->Update();
232    //  mSquares2->Update();
233
234     mCurrentSliceManager->Render(); 
235 }
236 //------------------------------------------------------------------------------
237
238 //------------------------------------------------------------------------------
239 void vvToolBinarize::GetArgsInfoFromGUI() {
240
241   /* //KEEP THIS FOR READING GGO FROM FILE
242     int argc=1;
243     std::string a = "toto";
244     char * const* argv = new char*;
245     //a.c_str();
246     struct cmdline_parser_params p;
247     p.check_required = 0;
248     int good = cmdline_parser_ext(argc, argv, &args_info, &p);
249   DD(good);
250   */
251
252   mArgsInfo.upper_given = 0;
253   mArgsInfo.lower_given = 0;
254   bool inverseBGandFG = false;
255
256   // if (mRadioButtonGreaterThan->isChecked()) { // Greater Than (and Lower Than)
257     mArgsInfo.lower_given = 1;
258     mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
259     DD(mArgsInfo.lower_arg);
260     if (mRadioButtonLowerThan->isChecked()) {
261       mArgsInfo.upper_given = 1;
262       mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
263       if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
264         mArgsInfo.upper_given = 0;
265         DD("TODO : lower thres greater than greater thres ! Ignoring ");
266       }
267     }
268   // }
269   // else {
270   //   if (mRadioButtonEqualThan->isChecked()) {
271   //     mArgsInfo.lower_given = 1;
272   //     mArgsInfo.upper_given = 1;
273   //     mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
274   //     mArgsInfo.upper_arg = mThresholdSlider1->GetValue();
275   //   }
276   //   else {
277   //     mArgsInfo.lower_given = 1;
278   //     mArgsInfo.upper_given = 1;
279   //     mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
280   //     mArgsInfo.upper_arg = mThresholdSlider1->GetValue();
281   //     inverseBGandFG = true;
282   //   }
283   // }
284
285   mArgsInfo.fg_arg = mFGSlider->GetValue();
286   mArgsInfo.bg_arg = mBGSlider->GetValue();
287
288   DD(inverseBGandFG);
289   if (inverseBGandFG) {
290     mArgsInfo.fg_arg = mFGSlider->GetValue();
291     mArgsInfo.bg_arg = mBGSlider->GetValue();
292   }
293   mArgsInfo.fg_given = 1;
294   mArgsInfo.bg_given = 1;
295
296   if (mCheckBoxUseBG->isChecked()) {
297     if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
298     else mArgsInfo.mode_arg = (char*)"BG";
299   }
300   else mArgsInfo.mode_arg = (char*)"FG";
301
302   // DD(mArgsInfo.useBG_flag);
303   // DD(mArgsInfo.useFG_flag);
304
305   mArgsInfo.verbose_flag = true;
306
307   // Required (even if not used)
308   mArgsInfo.input_given = 0;
309   mArgsInfo.output_given = 0;
310   
311   mArgsInfo.input_arg = new char;
312   mArgsInfo.output_arg = new char;
313 }
314 //------------------------------------------------------------------------------
315
316
317 //------------------------------------------------------------------------------
318 void vvToolBinarize::apply() {
319   DD("Apply");
320
321   GetArgsInfoFromGUI();
322
323   DD(mArgsInfo.lower_arg);
324   // cmdline_parser2(argc, argv, &args_info, 1, 1, 0);                  
325   //   if (args_info.config_given)      
326   // cmdline_parser_configfile ("toto.config", &args_info, 0, 0, 1);
327   //   else cmdline_parser(argc, argv, &args_info);
328
329   // Main filter
330   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter = 
331     clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
332   filter->SetArgsInfo(mArgsInfo);
333   filter->SetInputVVImage(mCurrentImage);
334   filter->Update();
335
336   // Output ???
337   vvImage::Pointer output = filter->GetOutputVVImage();
338   DD(output->GetScalarTypeAsString());
339   CREATOR(vvToolBinarize)->mMainWindow->AddImage(output,"toto.mhd"); 
340   close();
341 }
342 //------------------------------------------------------------------------------
343
344
345 //------------------------------------------------------------------------------
346 void vvToolBinarize::valueChangedT2(double v) {
347   if (mRadioButtonLowerThan->isChecked()) mThresholdSlider1->SetMaximum(v);
348 }
349 //------------------------------------------------------------------------------
350
351
352 //------------------------------------------------------------------------------
353 void vvToolBinarize::valueChangedT1(double v) {
354   mThresholdSlider2->SetMinimum(v);
355   DD(v);
356   int m1 = (int)lrint(v);
357   DD(m1);  
358   int* extent = mCurrentSliceManager->GetSlicer(0)->GetImageActor()->GetDisplayExtent();
359   mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],extent[4],extent[5]);
360
361
362 int slice = mCurrentSliceManager->GetSlicer(0)->GetSlice();
363
364  int i;
365 for (i = 0; i < 6;i = i+2)
366     {
367         if (extent[i] == extent[i+1])
368         {
369             break;
370         }
371     }
372
373     switch (i)
374     {
375     case 0:
376         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
377         {
378             mSquaresActor1->SetPosition(1,0,0);
379             // mSquaresActor2->SetPosition(1,0,0);
380         }
381         else
382         {
383             mSquaresActor1->SetPosition(-1,0,0);
384             // mSquaresActor2->SetPosition(-1,0,0);
385         }
386         break;
387     case 2:
388         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
389         {
390             mSquaresActor1->SetPosition(0,1,0);
391            //  mSquaresActor2->SetPosition(0,1,0);
392         }
393         else
394         {
395             mSquaresActor1->SetPosition(0,-1,0);
396             // mSquaresActor2->SetPosition(0,-1,0);
397         }
398         break;
399     case 4:
400         if (mCurrentSliceManager->GetSlicer(0)->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
401         {
402             mSquaresActor1->SetPosition(0,0,1);
403             // mSquaresActor2->SetPosition(0,0,1);
404         }
405         else
406         {
407             mSquaresActor1->SetPosition(0,0,-1);
408             // mSquaresActor2->SetPosition(0,0,-1);
409         }
410         break;
411     }
412
413
414
415
416   mSquares1->SetValue(0,m1);
417   mSquares1->Update();
418   mCurrentSliceManager->Render();
419 }
420 //------------------------------------------------------------------------------