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