]> Creatis software - clitk.git/blob - vv/vvToolBinarize.cxx
binarize
[clitk.git] / vv / vvToolBinarize.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvToolBinarize.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/02/07 12:00:59 $
7   Version:   $Revision: 1.7 $
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 vvToolBinarize::vvToolBinarize(QWidget * parent, Qt::WindowFlags f)
48   :QDialog(parent,f), vvToolBase<vvToolBinarize>(), Ui::vvToolBinarize() 
49 {
50   // Set Modality : dialog is not modal but stay always on top because
51   // parent is set at construction
52   setModal(false);
53   setAttribute(Qt::WA_DeleteOnClose);
54
55   // GUI Initialization
56   setupUi(this);
57
58   // Connect signals & slots  
59   connect(mToolInputSelectionWidget, SIGNAL(accepted()), this, SLOT(InputIsSelected()));
60   connect(mToolInputSelectionWidget, SIGNAL(rejected()), this, SLOT(close()));
61   connect(buttonBox, SIGNAL(accepted()), this, SLOT(apply()));
62   connect(buttonBox, SIGNAL(rejected()), this, SLOT(close()));
63   connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
64   connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
65   connect(mRadioButtonLowerThan, SIGNAL(toggled(bool)), this, SLOT(enableLowerThan(bool)));
66   connect(mCheckBoxUseFG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
67   connect(mCheckBoxUseBG, SIGNAL(toggled(bool)), this, SLOT(useFGBGtoggled(bool)));
68
69   // VTK objects
70   //mImageContour = new vvImageContour;
71
72   //new vector of contours
73
74   // Initialize some widget
75   mThresholdSlider1->SetText("");
76   mThresholdSlider2->SetText("");
77   mFGSlider->SetText("Foreground value");
78   mBGSlider->SetText("Background value");
79
80   // Disable main widget while input image is not selected
81   toolMainWidget->setEnabled(false);
82
83   // Main filter 
84   mFilter = new clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>; //DS PUT IN BASECLASS ?
85
86   // Initialize the input selection (mFilter should be create before !)
87   InitializeListOfInputImages(mToolInputSelectionWidget, mFilter);
88 }
89 //------------------------------------------------------------------------------
90
91
92 //------------------------------------------------------------------------------
93 vvToolBinarize::~vvToolBinarize() {
94   //delete mImageContour;
95 }
96 //------------------------------------------------------------------------------
97
98
99 //------------------------------------------------------------------------------
100 void vvToolBinarize::enableLowerThan(bool b) {
101   if (!b) {
102     mThresholdSlider1->resetMaximum();
103   }
104   else {
105     valueChangedT1(mThresholdSlider1->GetValue());
106   }
107 }
108 //------------------------------------------------------------------------------
109
110
111 //------------------------------------------------------------------------------
112 void vvToolBinarize::useFGBGtoggled(bool) {
113   if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked()) 
114     mCheckBoxUseBG->toggle();
115 }
116 //------------------------------------------------------------------------------
117
118
119 //------------------------------------------------------------------------------
120 void vvToolBinarize::InputIsSelected() {
121
122   // Common
123   int index = mToolInputSelectionWidget->GetSelectedInputIndex();
124   mCurrentSliceManager = mSlicerManagersCompatible[index];
125   mCurrentImage = mCurrentSliceManager->GetImage();
126   toolMainWidget->setEnabled(true);
127
128   // Specific for this gui
129   mThresholdSlider1->SetValue(0);
130   mThresholdSlider2->SetValue(0);
131   mThresholdSlider1->SetImage(mCurrentImage);
132   mThresholdSlider2->SetImage(mCurrentImage);
133   mFGSlider->SetImage(mCurrentImage);
134   mBGSlider->SetImage(mCurrentImage);
135   DD(mCurrentSliceManager->GetFileName().c_str());
136   mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
137   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
138   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
139   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
140   mFGSlider->SetValue(1);
141   mBGSlider->SetValue(0);
142   
143   // VTK objects for interactive display
144   for(int i=0;i<mCurrentSliceManager->NumberOfSlicers(); i++) {
145     mImageContour.push_back(new vvImageContour);
146     mImageContour[i]->setSlicer(mCurrentSliceManager->GetSlicer(i));
147   }
148   valueChangedT1(mThresholdSlider1->GetValue());
149   connect(mCurrentSliceManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
150   connect(mCurrentSliceManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
151
152 }
153 //------------------------------------------------------------------------------
154
155
156 //------------------------------------------------------------------------------
157 void vvToolBinarize::UpdateSlice(int slicer,int slices) {
158   DD(slicer);
159   for(int i=0;i<mCurrentSliceManager->NumberOfSlicers(); i++) {
160     mImageContour[i]->update(mThresholdSlider1->GetValue());
161   }
162   mCurrentSliceManager->Render(); 
163 }
164 //------------------------------------------------------------------------------
165
166 //------------------------------------------------------------------------------
167 void vvToolBinarize::GetArgsInfoFromGUI() {
168
169   /* //KEEP THIS FOR READING GGO FROM FILE
170     int argc=1;
171     std::string a = "toto";
172     char * const* argv = new char*;
173     //a.c_str();
174     struct cmdline_parser_params p;
175     p.check_required = 0;
176     int good = cmdline_parser_ext(argc, argv, &args_info, &p);
177   DD(good);
178   */
179
180   mArgsInfo.upper_given = 0;
181   mArgsInfo.lower_given = 0;
182   bool inverseBGandFG = false;
183
184   mArgsInfo.lower_given = 1;
185   mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
186   DD(mArgsInfo.lower_arg);
187   if (mRadioButtonLowerThan->isChecked()) {
188     mArgsInfo.upper_given = 1;
189     mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
190     if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
191       mArgsInfo.upper_given = 0;
192       DD("TODO : lower thres greater than greater thres ! Ignoring ");
193     }
194   }
195
196   mArgsInfo.fg_arg = mFGSlider->GetValue();
197   mArgsInfo.bg_arg = mBGSlider->GetValue();
198
199   DD(inverseBGandFG);
200   if (inverseBGandFG) {
201     mArgsInfo.fg_arg = mFGSlider->GetValue();
202     mArgsInfo.bg_arg = mBGSlider->GetValue();
203   }
204   mArgsInfo.fg_given = 1;
205   mArgsInfo.bg_given = 1;
206
207   if (mCheckBoxUseBG->isChecked()) {
208     if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
209     else mArgsInfo.mode_arg = (char*)"BG";
210   }
211   else mArgsInfo.mode_arg = (char*)"FG";
212
213   mArgsInfo.verbose_flag = true;
214
215   // Required (even if not used)
216   mArgsInfo.input_given = 0;
217   mArgsInfo.output_given = 0;
218   
219   mArgsInfo.input_arg = new char;
220   mArgsInfo.output_arg = new char;
221 }
222 //------------------------------------------------------------------------------
223
224
225 //------------------------------------------------------------------------------
226 void vvToolBinarize::apply() {
227   GetArgsInfoFromGUI();
228
229   // Main filter
230   clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::Pointer filter = 
231     clitk::BinarizeImageGenericFilter<args_info_clitkBinarizeImage>::New();
232   filter->SetArgsInfo(mArgsInfo);
233   filter->SetInputVVImage(mCurrentImage);
234   filter->Update();
235
236   // Output ???
237   vvImage::Pointer output = filter->GetOutputVVImage();
238   std::ostringstream osstream;
239   osstream << "Binarized_" << mCurrentSliceManager->GetSlicer(0)->GetFileName();
240   CREATOR(vvToolBinarize)->mMainWindow->AddImage(output,osstream.str()); 
241   close();
242 }
243 //------------------------------------------------------------------------------
244
245
246 //------------------------------------------------------------------------------
247 void vvToolBinarize::valueChangedT2(double v) {
248   if (mRadioButtonLowerThan->isChecked()) mThresholdSlider1->SetMaximum(v);
249 }
250 //------------------------------------------------------------------------------
251
252
253 //------------------------------------------------------------------------------
254 void vvToolBinarize::valueChangedT1(double v) {
255   mThresholdSlider2->SetMinimum(v);
256   int m1 = (int)lrint(v);
257
258   for(int i=0;i<mCurrentSliceManager->NumberOfSlicers(); i++) {
259     mImageContour[i]->update(m1);
260   }
261   mCurrentSliceManager->Render();
262 }
263 //------------------------------------------------------------------------------