]> Creatis software - clitk.git/blob - vv/vvToolBinarize.cxx
- autotool
[clitk.git] / vv / vvToolBinarize.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolBinarize.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/03/01 15:38:09 $
7   Version:   $Revision: 1.10 $
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(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
68   connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
69   connect(mRadioButtonLowerThan, SIGNAL(toggled(bool)), this, SLOT(enableLowerThan(bool)));
70   connect(mCheckBoxUseFG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
71   connect(mCheckBoxUseBG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
72   connect(mCheckBoxInteractiveDisplay, SIGNAL(toggled(bool)), this, SLOT(InteractiveDisplayToggled(bool)));
73
74   // Initialize some widget
75   mThresholdSlider1->SetText("");
76   mThresholdSlider2->SetText("");
77   mFGSlider->SetText("Foreground value");
78   mBGSlider->SetText("Background value");
79
80   // Main filter 
81   mFilter = new clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>; //DS PUT IN BASECLASS ?
82 }
83 //------------------------------------------------------------------------------
84
85
86 //------------------------------------------------------------------------------
87 vvToolBinarize::~vvToolBinarize() {
88 }
89 //------------------------------------------------------------------------------
90
91
92 //------------------------------------------------------------------------------
93 void vvToolBinarize::InteractiveDisplayToggled(bool b) {
94   mInteractiveDisplayIsEnabled = b;
95   if (!mInteractiveDisplayIsEnabled) {
96     RemoveVTKObjects();
97   }
98   else {
99     for(unsigned int i=0; i<mImageContour.size(); i++)
100       mImageContour[i]->showActors();
101     if (mCurrentSlicerManager)
102       mCurrentSlicerManager->Render();
103   }
104 }
105 //------------------------------------------------------------------------------
106
107
108 //------------------------------------------------------------------------------
109 void vvToolBinarize::RemoveVTKObjects() { 
110   for(unsigned int i=0; i<mImageContour.size(); i++)
111     mImageContour[i]->hideActors();
112   if (mCurrentSlicerManager)
113     mCurrentSlicerManager->Render();
114 }
115 //------------------------------------------------------------------------------
116
117
118 //------------------------------------------------------------------------------
119 bool vvToolBinarize::close() { 
120   RemoveVTKObjects();
121   return vvToolWidgetBase::close(); 
122 }
123 //------------------------------------------------------------------------------
124
125
126 //------------------------------------------------------------------------------
127 void vvToolBinarize::reject() { 
128   RemoveVTKObjects();
129   return vvToolWidgetBase::reject(); 
130 }
131 //------------------------------------------------------------------------------
132
133
134 //------------------------------------------------------------------------------
135 void vvToolBinarize::enableLowerThan(bool b) {
136   if (!b) {
137     mThresholdSlider1->resetMaximum();
138   }
139   else {
140     valueChangedT1(mThresholdSlider1->GetValue());
141   }
142 }
143 //------------------------------------------------------------------------------
144
145
146 //------------------------------------------------------------------------------
147 void vvToolBinarize::useFGBGtoggled(bool) {
148   if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked()) 
149     mCheckBoxUseBG->toggle();
150 }
151 //------------------------------------------------------------------------------
152
153
154 //------------------------------------------------------------------------------
155 void vvToolBinarize::InputIsSelected(vvSlicerManager * m) {
156   mCurrentSlicerManager = m;
157
158   // Specific for this gui
159   mThresholdSlider1->SetValue(0);
160   mThresholdSlider2->SetValue(0);
161   mThresholdSlider1->SetImage(mCurrentImage);
162   mThresholdSlider2->SetImage(mCurrentImage);
163   mFGSlider->SetImage(mCurrentImage);
164   mBGSlider->SetImage(mCurrentImage);
165   //  DD(mCurrentSlicerManager->GetFileName().c_str());
166   mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
167   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
168   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
169   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
170   mFGSlider->SetValue(1);
171   mBGSlider->SetValue(0);
172   
173   // VTK objects for interactive display
174   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
175     mImageContour.push_back(new vvImageContour);
176     mImageContour[i]->setSlicer(mCurrentSlicerManager->GetSlicer(i));
177   }
178   valueChangedT1(mThresholdSlider1->GetValue());
179   connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
180   connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
181
182 }
183 //------------------------------------------------------------------------------
184
185
186 //------------------------------------------------------------------------------
187 void vvToolBinarize::UpdateSlice(int slicer,int slices) {
188   if (!mInteractiveDisplayIsEnabled) return;
189   if (!mCurrentSlicerManager) close();
190   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
191     mImageContour[i]->update(mThresholdSlider1->GetValue());
192   }
193   mCurrentSlicerManager->Render(); 
194 }
195 //------------------------------------------------------------------------------
196
197 //------------------------------------------------------------------------------
198 void vvToolBinarize::GetArgsInfoFromGUI() {
199
200   /* //KEEP THIS FOR READING GGO FROM FILE
201     int argc=1;
202     std::string a = "toto";
203     char * const* argv = new char*;
204     //a.c_str();
205     struct cmdline_parser_params p;
206     p.check_required = 0;
207     int good = cmdline_parser_ext(argc, argv, &args_info, &p);
208   DD(good);
209   */
210
211   mArgsInfo.imagetypes_flag = 0;
212   mArgsInfo.upper_given = 0;
213   mArgsInfo.lower_given = 0;
214   bool inverseBGandFG = false;
215
216   mArgsInfo.lower_given = 1;
217   mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
218   // DD(mArgsInfo.lower_arg);
219   if (mRadioButtonLowerThan->isChecked()) {
220     mArgsInfo.upper_given = 1;
221     mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
222     if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
223       mArgsInfo.upper_given = 0;
224       DD("TODO : lower thres greater than greater thres ! Ignoring ");
225     }
226   }
227
228   mArgsInfo.fg_arg = mFGSlider->GetValue();
229   mArgsInfo.bg_arg = mBGSlider->GetValue();
230
231   if (inverseBGandFG) {
232     mArgsInfo.fg_arg = mFGSlider->GetValue();
233     mArgsInfo.bg_arg = mBGSlider->GetValue();
234   }
235   mArgsInfo.fg_given = 1;
236   mArgsInfo.bg_given = 1;
237
238   if (mCheckBoxUseBG->isChecked()) {
239     if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
240     else mArgsInfo.mode_arg = (char*)"BG";
241   }
242   else mArgsInfo.mode_arg = (char*)"FG";
243
244   mArgsInfo.verbose_flag = false;
245
246   // Required (even if not used)
247   mArgsInfo.input_given = 0;
248   mArgsInfo.output_given = 0;
249   
250   mArgsInfo.input_arg = new char;
251   mArgsInfo.output_arg = new char;
252 }
253 //------------------------------------------------------------------------------
254
255
256 //------------------------------------------------------------------------------
257 void vvToolBinarize::apply() {
258   if (!mCurrentSlicerManager) close();
259   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
260   GetArgsInfoFromGUI();
261
262   // Main filter
263   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter = 
264      clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
265   filter->SetArgsInfo(mArgsInfo);
266   filter->SetInputVVImage(mCurrentImage);
267   filter->Update();
268
269   // Output
270   vvImage::Pointer output = filter->GetOutputVVImage();
271   std::ostringstream osstream;
272   osstream << "Binarized_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
273   AddImage(output,osstream.str()); 
274   QApplication::restoreOverrideCursor();
275   close();
276 }
277 //------------------------------------------------------------------------------
278
279
280 //------------------------------------------------------------------------------
281 void vvToolBinarize::valueChangedT2(double v) {
282   if (mRadioButtonLowerThan->isChecked()) mThresholdSlider1->SetMaximum(v);
283 }
284 //------------------------------------------------------------------------------
285
286
287 //------------------------------------------------------------------------------
288 void vvToolBinarize::valueChangedT1(double v) {
289   if (!mCurrentSlicerManager) close();
290   mThresholdSlider2->SetMinimum(v);
291   int m1 = (int)lrint(v);  
292   if (!mInteractiveDisplayIsEnabled) return;
293   for(int i=0;i<mCurrentSlicerManager->NumberOfSlicers(); i++) {
294     mImageContour[i]->update(m1);
295   }
296   mCurrentSlicerManager->Render();
297 }
298 //------------------------------------------------------------------------------