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