]> Creatis software - clitk.git/blob - vv/vvToolBinarize.cxx
- update function name (with Uppercase)
[clitk.git] / vv / vvToolBinarize.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ======================================================================-====*/
18
19 #include "vvToolBinarize.h"
20 #include "vvSlicerManager.h"
21 #include "vvSlicer.h"
22 #include "vvToolInputSelectorWidget.h"
23
24 #include "clitkBinarizeImageGenericFilter.h"
25
26 #include <vtkImageActor.h>
27 #include <vtkCamera.h>
28 #include <vtkImageClip.h>
29 #include <vtkRenderWindow.h>
30
31 //------------------------------------------------------------------------------
32 // Create the tool and automagically (I like this word) insert it in
33 // the main window menu.
34 ADD_TOOL(vvToolBinarize);
35 //------------------------------------------------------------------------------
36
37
38 //------------------------------------------------------------------------------
39 void vvToolBinarize::Initialize()
40 {
41   SetToolName("Binarize");
42   SetToolMenuName("Binarize");
43   SetToolIconFilename(":/common/icons/binarize.png");
44   SetToolTip("Image interactive binarization with thresholds.");
45 }
46 //------------------------------------------------------------------------------
47
48
49 //------------------------------------------------------------------------------
50 vvToolBinarize::vvToolBinarize(vvMainWindowBase * parent, Qt::WindowFlags f)
51   :vvToolWidgetBase(parent,f),
52    vvToolBase<vvToolBinarize>(parent),
53    Ui::vvToolBinarize()
54 {
55   // GUI Initialization
56   Ui_vvToolBinarize::setupUi(mToolWidget);
57   mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked();
58
59   // Connect signals & slots
60   connect(mRadioButtonLowerThan, SIGNAL(toggled(bool)), this, SLOT(enableLowerThan(bool)));
61   connect(mCheckBoxUseFG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
62   connect(mCheckBoxUseBG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
63   connect(mCheckBoxInteractiveDisplay, SIGNAL(toggled(bool)), this, SLOT(InteractiveDisplayToggled(bool)));
64
65   // Initialize some widget
66   mThresholdSlider1->SetText("");
67   mThresholdSlider2->SetText("");
68   mFGSlider->SetText("Foreground value");
69   mBGSlider->SetText("Background value");
70
71   // Main filter
72   mFilter = new clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>;
73
74   // Set how many inputs are needed for this tool
75   AddInputSelector("Select one image", mFilter);
76 }
77 //------------------------------------------------------------------------------
78
79
80 //------------------------------------------------------------------------------
81 vvToolBinarize::~vvToolBinarize()
82 {
83 }
84 //------------------------------------------------------------------------------
85
86
87 //------------------------------------------------------------------------------
88 void vvToolBinarize::InteractiveDisplayToggled(bool b)
89 {
90   mInteractiveDisplayIsEnabled = b;
91   if (!mInteractiveDisplayIsEnabled) {
92     RemoveVTKObjects();
93   } else {
94     for(unsigned int i=0; i<mImageContour.size(); i++) {
95       mImageContour[i]->ShowActors();
96       if (mRadioButtonLowerThan->isChecked())
97         mImageContourLower[i]->ShowActors();
98     }
99     if (mCurrentSlicerManager)
100       mCurrentSlicerManager->Render();
101   }
102 }
103 //------------------------------------------------------------------------------
104
105
106 //------------------------------------------------------------------------------
107 void vvToolBinarize::RemoveVTKObjects()
108 {
109   for(unsigned int i=0; i<mImageContour.size(); i++) {
110     mImageContour[i]->HideActors();
111     mImageContourLower[i]->HideActors();    
112   }
113   if (mCurrentSlicerManager)
114     mCurrentSlicerManager->Render();
115 }
116 //------------------------------------------------------------------------------
117
118
119 //------------------------------------------------------------------------------
120 bool vvToolBinarize::close()
121 {
122   RemoveVTKObjects();
123   return vvToolWidgetBase::close();
124 }
125 //------------------------------------------------------------------------------
126
127
128 //------------------------------------------------------------------------------
129 void vvToolBinarize::reject()
130 {
131   // DD("vvToolBinarize::reject");
132   RemoveVTKObjects();
133   return vvToolWidgetBase::reject();
134 }
135 //------------------------------------------------------------------------------
136
137
138 //------------------------------------------------------------------------------
139 void vvToolBinarize::enableLowerThan(bool b)
140 {
141   if (!b) {
142     mThresholdSlider1->resetMaximum();
143     for(unsigned int i=0; i<mImageContour.size(); i++) {
144       mImageContourLower[i]->HideActors();    
145     }
146     mCurrentSlicerManager->Render();
147   } else {
148     valueChangedT1(mThresholdSlider1->GetValue());
149     valueChangedT2(mThresholdSlider2->GetValue());
150     for(unsigned int i=0; i<mImageContour.size(); i++) {
151       mImageContourLower[i]->ShowActors();    
152     }
153     mCurrentSlicerManager->Render();
154   }
155 }
156 //------------------------------------------------------------------------------
157
158
159 //------------------------------------------------------------------------------
160 void vvToolBinarize::useFGBGtoggled(bool)
161 {
162   if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked())
163     mCheckBoxUseBG->toggle();
164 }
165 //------------------------------------------------------------------------------
166
167
168 //------------------------------------------------------------------------------
169 // void vvToolBinarize::InputIsSelected(std::vector<vvSlicerManager *> & m) {
170 //   DD("vvToolBinarize::InputIsSelected vector in binarize");
171 //   DD(m.size());
172 // }
173 void vvToolBinarize::InputIsSelected(vvSlicerManager * m)
174 {
175   mCurrentSlicerManager = m;
176
177   // Specific for this gui
178   mThresholdSlider1->SetValue(0);
179   mThresholdSlider2->SetValue(0);
180   mThresholdSlider1->SetImage(mCurrentImage);
181   mThresholdSlider2->SetImage(mCurrentImage);
182   mFGSlider->SetImage(mCurrentImage);
183   mBGSlider->SetImage(mCurrentImage);
184   //  DD(mCurrentSlicerManager->GetFileName().c_str());
185   //  mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
186   //   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
187   //   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
188   //   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
189
190   // Output is uchar ...
191   mFGSlider->SetMaximum(255);
192   mFGSlider->SetMinimum(0);
193   mBGSlider->SetMaximum(255);
194   mBGSlider->SetMinimum(0);
195
196   mFGSlider->SetValue(1);
197   mBGSlider->SetValue(0);
198   mFGSlider->SetSingleStep(1);
199   mBGSlider->SetSingleStep(1);
200
201   // VTK objects for interactive display
202   for(int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
203     mImageContour.push_back(new vvImageContour);
204     mImageContour[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
205     mImageContour[i]->SetColor(1.0, 0.0, 0.0);
206     mImageContourLower.push_back(new vvImageContour);
207     mImageContourLower[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
208     mImageContourLower[i]->SetColor(0.0, 0.0, 1.0);
209   }
210   valueChangedT1(mThresholdSlider1->GetValue());
211
212   connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
213   connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
214
215   connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
216   connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
217
218   //  connect(mCurrentSlicerManager, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int)));
219 }
220 //------------------------------------------------------------------------------
221
222
223 //------------------------------------------------------------------------------
224 // void vvToolBinarize::LeftButtonReleaseEvent(int slicer) {
225 //   DD("LeftButtonReleaseEvent");
226 //   for(int i=0; i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
227 //     if (i == slicer);
228 //     mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render();
229 //   }
230 // }
231 //------------------------------------------------------------------------------
232
233
234 //------------------------------------------------------------------------------
235 void vvToolBinarize::UpdateSlice(int slicer,int slices)
236 {
237   if (!mInteractiveDisplayIsEnabled) return;
238   if (!mCurrentSlicerManager) close();
239   mImageContour[slicer]->Update(mThresholdSlider1->GetValue());
240   if (mRadioButtonLowerThan->isChecked()) 
241     mImageContourLower[slicer]->Update(mThresholdSlider2->GetValue());
242   //  mCurrentSlicerManager->GetSlicer(slicer)->Render(); 
243 }
244 //------------------------------------------------------------------------------
245
246
247 //------------------------------------------------------------------------------
248 void vvToolBinarize::GetArgsInfoFromGUI()
249 {
250
251   /* //KEEP THIS FOR READING GGO FROM FILE
252      int argc=1;
253      std::string a = "toto";
254      char * const* argv = new char*;
255      //a.c_str();
256      struct cmdline_parser_params p;
257      p.check_required = 0;
258      int good = cmdline_parser_ext(argc, argv, &args_info, &p);
259      DD(good);
260   */
261
262   mArgsInfo.imagetypes_flag = 0;
263   mArgsInfo.upper_given = 0;
264   mArgsInfo.lower_given = 0;
265   bool inverseBGandFG = false;
266
267   mArgsInfo.lower_given = 1;
268   mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
269   // DD(mArgsInfo.lower_arg);
270   if (mRadioButtonLowerThan->isChecked()) {
271     mArgsInfo.upper_given = 1;
272     mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
273     if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
274       mArgsInfo.upper_given = 0;
275       DD("TODO : lower thres greater than greater thres ! Ignoring ");
276     }
277   }
278
279   mArgsInfo.fg_arg = mFGSlider->GetValue();
280   mArgsInfo.bg_arg = mBGSlider->GetValue();
281
282   if (inverseBGandFG) {
283     mArgsInfo.fg_arg = mFGSlider->GetValue();
284     mArgsInfo.bg_arg = mBGSlider->GetValue();
285   }
286   mArgsInfo.fg_given = 1;
287   mArgsInfo.bg_given = 1;
288
289   if (mCheckBoxUseBG->isChecked()) {
290     if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
291     else mArgsInfo.mode_arg = (char*)"BG";
292   } else mArgsInfo.mode_arg = (char*)"FG";
293
294   mArgsInfo.verbose_flag = false;
295
296   // Required (even if not used)
297   mArgsInfo.input_given = 0;
298   mArgsInfo.output_given = 0;
299
300   mArgsInfo.input_arg = new char;
301   mArgsInfo.output_arg = new char;
302 }
303 //------------------------------------------------------------------------------
304
305
306 //------------------------------------------------------------------------------
307 void vvToolBinarize::apply()
308 {
309   if (!mCurrentSlicerManager) close();
310   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
311   GetArgsInfoFromGUI();
312
313   // Main filter
314   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter =
315     clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
316   filter->SetInputVVImage(mCurrentImage);
317   filter->SetArgsInfo(mArgsInfo);
318   filter->EnableReadOnDisk(false);
319   filter->Update();
320
321   // Output
322   vvImage::Pointer output = filter->GetOutputVVImage();
323   std::ostringstream osstream;
324   osstream << "Binarized_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
325   AddImage(output,osstream.str());
326   QApplication::restoreOverrideCursor();
327   close();
328 }
329 //------------------------------------------------------------------------------
330
331
332 //------------------------------------------------------------------------------
333 void vvToolBinarize::valueChangedT2(double v)
334 {
335   //  DD("valueChangedT2");
336   if (mRadioButtonLowerThan->isChecked()) {
337     mThresholdSlider1->SetMaximum(v);
338     if (!mInteractiveDisplayIsEnabled) return;
339     for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
340       mImageContourLower[i]->Update(v);
341     }
342     // mCurrentSlicerManager->Render();
343   }
344 }
345 //------------------------------------------------------------------------------
346
347
348 //------------------------------------------------------------------------------
349 void vvToolBinarize::valueChangedT1(double v)
350 {
351   //  DD("valueChangedT1");
352   if (!mCurrentSlicerManager) close();
353   mThresholdSlider2->SetMinimum(v);
354   //  int m1 = (int)lrint(v);
355   if (!mInteractiveDisplayIsEnabled) return;
356   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
357     mImageContour[i]->Update(v);
358   }
359   // mCurrentSlicerManager->Render();
360 }
361 //------------------------------------------------------------------------------