]> Creatis software - clitk.git/blob - vv/vvToolBinarize.cxx
- multiple inputs in vv
[clitk.git] / vv / vvToolBinarize.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolBinarize.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/03/24 10:48:18 $
7   Version:   $Revision: 1.13 $
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 #include <vtkImageClip.h>
38
39 //------------------------------------------------------------------------------
40 // Create the tool and automagically (I like this word) insert it in
41 // the main window menu.
42 ADD_TOOL(vvToolBinarize);
43 //------------------------------------------------------------------------------
44
45
46 //------------------------------------------------------------------------------
47 void vvToolBinarize::Initialize() {
48   SetToolName("Binarize");
49   SetToolMenuName("Binarize");
50   SetToolIconFilename(":/new/prefix1/icons/binarize.png");
51   SetToolTip("Image interactive binarization with thresholds.");
52 }
53 //------------------------------------------------------------------------------
54
55
56 //------------------------------------------------------------------------------
57 vvToolBinarize::vvToolBinarize(vvMainWindowBase * parent, Qt::WindowFlags f)
58   :vvToolWidgetBase(parent,f), 
59    vvToolBase<vvToolBinarize>(parent), 
60    Ui::vvToolBinarize() 
61 {
62   // GUI Initialization
63   Ui_vvToolBinarize::setupUi(mToolWidget);
64   mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked();
65
66   // Connect signals & slots  
67   connect(mRadioButtonLowerThan, SIGNAL(toggled(bool)), this, SLOT(enableLowerThan(bool)));
68   connect(mCheckBoxUseFG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
69   connect(mCheckBoxUseBG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
70   connect(mCheckBoxInteractiveDisplay, SIGNAL(toggled(bool)), this, SLOT(InteractiveDisplayToggled(bool)));
71
72   // Initialize some widget
73   mThresholdSlider1->SetText("");
74   mThresholdSlider2->SetText("");
75   mFGSlider->SetText("Foreground value");
76   mBGSlider->SetText("Background value");
77
78   // Main filter 
79   mFilter = new clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>;
80
81   // Set how many inputs are needed for this tool
82   AddInputSelector("Select one image", mFilter);
83 }
84 //------------------------------------------------------------------------------
85
86
87 //------------------------------------------------------------------------------
88 vvToolBinarize::~vvToolBinarize() {
89 }
90 //------------------------------------------------------------------------------
91
92
93 //------------------------------------------------------------------------------
94 void vvToolBinarize::InteractiveDisplayToggled(bool b) {
95   mInteractiveDisplayIsEnabled = b;
96   if (!mInteractiveDisplayIsEnabled) {
97     RemoveVTKObjects();
98   }
99   else {
100     for(unsigned int i=0; i<mImageContour.size(); i++) {
101       mImageContour[i]->showActors();
102       if (mRadioButtonLowerThan->isChecked())
103         mImageContourLower[i]->showActors();
104     }
105     if (mCurrentSlicerManager)
106       mCurrentSlicerManager->Render();
107   }
108 }
109 //------------------------------------------------------------------------------
110
111
112 //------------------------------------------------------------------------------
113 void vvToolBinarize::RemoveVTKObjects() { 
114   for(unsigned int i=0; i<mImageContour.size(); i++) {
115     mImageContour[i]->hideActors();
116     mImageContourLower[i]->hideActors();    
117   }
118   if (mCurrentSlicerManager)
119     mCurrentSlicerManager->Render();
120 }
121 //------------------------------------------------------------------------------
122
123
124 //------------------------------------------------------------------------------
125 bool vvToolBinarize::close() { 
126   RemoveVTKObjects();
127   return vvToolWidgetBase::close(); 
128 }
129 //------------------------------------------------------------------------------
130
131
132 //------------------------------------------------------------------------------
133 void vvToolBinarize::reject() { 
134   // DD("vvToolBinarize::reject");
135   RemoveVTKObjects();
136   return vvToolWidgetBase::reject(); 
137 }
138 //------------------------------------------------------------------------------
139
140
141 //------------------------------------------------------------------------------
142 void vvToolBinarize::enableLowerThan(bool b) {
143   if (!b) {
144     mThresholdSlider1->resetMaximum();
145     for(unsigned int i=0; i<mImageContour.size(); i++) {
146       mImageContourLower[i]->hideActors();    
147     }
148     mCurrentSlicerManager->Render();
149   }
150   else {
151     valueChangedT1(mThresholdSlider1->GetValue());
152     valueChangedT2(mThresholdSlider2->GetValue());
153     for(unsigned int i=0; i<mImageContour.size(); i++) {
154       mImageContourLower[i]->showActors();    
155     }
156     mCurrentSlicerManager->Render();
157   }
158 }
159 //------------------------------------------------------------------------------
160
161
162 //------------------------------------------------------------------------------
163 void vvToolBinarize::useFGBGtoggled(bool) {
164   if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked()) 
165     mCheckBoxUseBG->toggle();
166 }
167 //------------------------------------------------------------------------------
168
169
170 //------------------------------------------------------------------------------
171 // void vvToolBinarize::InputIsSelected(std::vector<vvSlicerManager *> & m) {
172 //   DD("vvToolBinarize::InputIsSelected vector in binarize");
173 //   DD(m.size());
174 // }
175 void vvToolBinarize::InputIsSelected(vvSlicerManager * m) {
176   mCurrentSlicerManager = m;
177
178   // Specific for this gui
179   mThresholdSlider1->SetValue(0);
180   mThresholdSlider2->SetValue(0);
181   mThresholdSlider1->SetImage(mCurrentImage);
182   mThresholdSlider2->SetImage(mCurrentImage);
183   mFGSlider->SetImage(mCurrentImage);
184   mBGSlider->SetImage(mCurrentImage);
185   //  DD(mCurrentSlicerManager->GetFileName().c_str());
186   mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
187   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
188   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
189   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
190   mFGSlider->SetValue(1);
191   mBGSlider->SetValue(0);
192   mFGSlider->SetSingleStep(1);
193   mBGSlider->SetSingleStep(1);
194   
195   // VTK objects for interactive display
196   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
197     mImageContour.push_back(new vvImageContour);
198     mImageContour[i]->setSlicer(mCurrentSlicerManager->GetSlicer(i));
199     mImageContour[i]->setColor(1.0, 0.0, 0.0);
200     mImageContourLower.push_back(new vvImageContour);
201     mImageContourLower[i]->setSlicer(mCurrentSlicerManager->GetSlicer(i));
202     mImageContourLower[i]->setColor(0.0, 0.0, 1.0);
203   }
204   valueChangedT1(mThresholdSlider1->GetValue());
205
206   connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
207   connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
208
209   connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
210   connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
211
212 }
213 //------------------------------------------------------------------------------
214
215
216 //------------------------------------------------------------------------------
217 void vvToolBinarize::UpdateSlice(int slicer,int slices) {
218   if (!mInteractiveDisplayIsEnabled) return;
219   if (!mCurrentSlicerManager) close();
220   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
221     mImageContour[i]->update(mThresholdSlider1->GetValue());
222     if (mRadioButtonLowerThan->isChecked()) 
223       mImageContourLower[i]->update(mThresholdSlider2->GetValue());
224
225   }
226   mCurrentSlicerManager->Render(); 
227 }
228 //------------------------------------------------------------------------------
229
230 //------------------------------------------------------------------------------
231 void vvToolBinarize::GetArgsInfoFromGUI() {
232
233   /* //KEEP THIS FOR READING GGO FROM FILE
234     int argc=1;
235     std::string a = "toto";
236     char * const* argv = new char*;
237     //a.c_str();
238     struct cmdline_parser_params p;
239     p.check_required = 0;
240     int good = cmdline_parser_ext(argc, argv, &args_info, &p);
241   DD(good);
242   */
243
244   mArgsInfo.imagetypes_flag = 0;
245   mArgsInfo.upper_given = 0;
246   mArgsInfo.lower_given = 0;
247   bool inverseBGandFG = false;
248
249   mArgsInfo.lower_given = 1;
250   mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
251   // DD(mArgsInfo.lower_arg);
252   if (mRadioButtonLowerThan->isChecked()) {
253     mArgsInfo.upper_given = 1;
254     mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
255     if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
256       mArgsInfo.upper_given = 0;
257       DD("TODO : lower thres greater than greater thres ! Ignoring ");
258     }
259   }
260
261   mArgsInfo.fg_arg = mFGSlider->GetValue();
262   mArgsInfo.bg_arg = mBGSlider->GetValue();
263
264   if (inverseBGandFG) {
265     mArgsInfo.fg_arg = mFGSlider->GetValue();
266     mArgsInfo.bg_arg = mBGSlider->GetValue();
267   }
268   mArgsInfo.fg_given = 1;
269   mArgsInfo.bg_given = 1;
270
271   if (mCheckBoxUseBG->isChecked()) {
272     if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
273     else mArgsInfo.mode_arg = (char*)"BG";
274   }
275   else mArgsInfo.mode_arg = (char*)"FG";
276
277   mArgsInfo.verbose_flag = false;
278
279   // Required (even if not used)
280   mArgsInfo.input_given = 0;
281   mArgsInfo.output_given = 0;
282   
283   mArgsInfo.input_arg = new char;
284   mArgsInfo.output_arg = new char;
285 }
286 //------------------------------------------------------------------------------
287
288
289 //------------------------------------------------------------------------------
290 void vvToolBinarize::apply() {
291   if (!mCurrentSlicerManager) close();
292   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
293   GetArgsInfoFromGUI();
294
295   // Main filter
296   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter = 
297      clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
298   filter->SetInputVVImage(mCurrentImage);
299   filter->SetArgsInfo(mArgsInfo);
300   filter->EnableReadOnDisk(false);
301   filter->Update();
302
303   // Output
304   vvImage::Pointer output = filter->GetOutputVVImage();
305   std::ostringstream osstream;
306   osstream << "Binarized_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
307   AddImage(output,osstream.str()); 
308   QApplication::restoreOverrideCursor();
309   close();
310 }
311 //------------------------------------------------------------------------------
312
313
314 //------------------------------------------------------------------------------
315 void vvToolBinarize::valueChangedT2(double v) {
316   //  DD("valueChangedT2");
317   if (mRadioButtonLowerThan->isChecked()) {
318     mThresholdSlider1->SetMaximum(v);
319     if (!mInteractiveDisplayIsEnabled) return;
320     for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
321       mImageContourLower[i]->update(v);
322     }
323     mCurrentSlicerManager->Render();
324   }
325 }
326 //------------------------------------------------------------------------------
327
328
329 //------------------------------------------------------------------------------
330 void vvToolBinarize::valueChangedT1(double v) {
331   //  DD("valueChangedT1");
332   if (!mCurrentSlicerManager) close();
333   mThresholdSlider2->SetMinimum(v);
334   //  int m1 = (int)lrint(v);  
335   if (!mInteractiveDisplayIsEnabled) return;
336   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
337     mImageContour[i]->update(v);
338   }
339   mCurrentSlicerManager->Render();
340 }
341 //------------------------------------------------------------------------------