]> Creatis software - clitk.git/blob - vv/vvToolSegmentation.cxx
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
[clitk.git] / vv / vvToolSegmentation.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://www.centreleonberard.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 // vv
20 #include "vvToolSegmentation.h"
21 #include "vvSlicerManager.h"
22 #include "vvSlicer.h"
23 #include "vvToolInputSelectorWidget.h"
24 #include "vvImageWriter.h"
25
26 // Qt
27 #include <QFileDialog>
28 #include <QMessageBox>
29
30 // vtk
31 #include "vtkImageContinuousErode3D.h"
32 #include "vtkImageContinuousDilate3D.h"
33  
34 //------------------------------------------------------------------------------
35 // Create the tool and automagically (I like this word) insert it in
36 // the main window menu.
37 ADD_TOOL(vvToolSegmentation);
38 //------------------------------------------------------------------------------
39
40
41 //------------------------------------------------------------------------------
42 void vvToolSegmentation::Initialize()
43 {
44   SetToolName("Segmentation");
45   SetToolMenuName("Interactive Segmentation");
46   SetToolIconFilename(":/common/icons/ducky.ico");
47   SetToolTip("Image interactive segmentation (trial).");
48   SetToolExperimental(true);
49 }
50 //------------------------------------------------------------------------------
51
52
53 //------------------------------------------------------------------------------
54 vvToolSegmentation::vvToolSegmentation(vvMainWindowBase * parent, Qt::WindowFlags f)
55   :vvToolWidgetBase(parent,f),
56    vvToolBase<vvToolSegmentation>(parent),
57    Ui::vvToolSegmentation()
58 {
59   // GUI Initialization
60   Ui_vvToolSegmentation::setupUi(mToolWidget);
61   setAttribute(Qt::WA_DeleteOnClose);
62
63   // Set how many inputs are needed for this tool
64   AddInputSelector("Select one image");
65   
66   // Init
67   mKernelValue = 3; // FIXME must be odd. If even -> not symmetrical
68 }
69 //------------------------------------------------------------------------------
70
71
72 //------------------------------------------------------------------------------
73 vvToolSegmentation::~vvToolSegmentation()
74 {
75 }
76 //------------------------------------------------------------------------------
77
78
79 //------------------------------------------------------------------------------
80 bool vvToolSegmentation::close()
81 {
82   mRefMaskActor->RemoveActors();
83   QWidget::close();  
84   mCurrentSlicerManager->Render();
85   return true;
86 }
87 //------------------------------------------------------------------------------
88
89
90 //------------------------------------------------------------------------------
91 void vvToolSegmentation::InputIsSelected(vvSlicerManager * m)
92 {
93   DD("InputIsSelected");
94   mCurrentSlicerManager = m;
95   mCurrentImage = mCurrentSlicerManager->GetImage();
96
97   // Refuse if non 3D image
98   if (mCurrentImage->GetNumberOfDimensions() != 3) {
99     QMessageBox::information(this,tr("Sorry only 3D yet"), tr("Sorry only 3D yet"));
100     close();
101     return;
102   }
103
104   // Change gui
105   //mLabelInputInfo->setText(QString("%1").arg(m->GetFileName().c_str()));
106
107   // Open mask
108   OpenBinaryImage();
109 }
110 //------------------------------------------------------------------------------
111
112
113 //------------------------------------------------------------------------------
114 void vvToolSegmentation::apply()
115 {
116   DD("apply");
117 }
118 //------------------------------------------------------------------------------
119
120
121 //------------------------------------------------------------------------------
122 void vvToolSegmentation::OpenBinaryImage()
123 {
124   DD("OpenBinaryImage");
125
126   // Load browser and select image
127   QString Extensions = "Images files ( *.mha *.mhd *.hdr *.his)";
128   Extensions += ";;All Files (*)";
129   QString filename =
130     QFileDialog::getOpenFileName(this,tr("Open binary image"),
131                                  mMainWindowBase->GetInputPathName(),Extensions);
132   DD(filename.toStdString());
133   if (filename.size() == 0) return;
134   
135   // Open Image
136   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
137   vvImageReader::Pointer reader = vvImageReader::New();
138   std::vector<std::string> filenames;
139   filenames.push_back(filename.toStdString());
140   reader->SetInputFilenames(filenames);
141   reader->Update(vvImageReader::IMAGE);
142   QApplication::restoreOverrideCursor();
143   
144   if (reader->GetLastError().size() != 0) {
145     std::cerr << "Error while reading " << filename.toStdString() << std::endl;
146     QString error = "Cannot open file \n";
147     error += reader->GetLastError().c_str();
148     QMessageBox::information(this,tr("Reading problem"),error);
149     return;
150   }
151
152   mMaskImage = reader->GetOutput();
153   int dim = mMaskImage->GetNumberOfDimensions();
154   if (dim != 3 ) {
155     QMessageBox::information(this,tr("Sorry only 3D yet"), tr("Sorry only 3D yet"));
156     close();
157     return;
158   }
159
160   // Add a new roi actor
161   mRefMaskActor = QSharedPointer<vvROIActor>(new vvROIActor);
162   std::vector<double> color;
163   color.push_back(1);
164   color.push_back(0);
165   color.push_back(0);
166   clitk::DicomRT_ROI::Pointer roi = clitk::DicomRT_ROI::New();
167   roi->SetFromBinaryImage(mMaskImage, 1, std::string("toto"), color, filename.toStdString());
168   mRefMaskActor->SetBGMode(true);
169   mRefMaskActor->SetROI(roi);
170   mRefMaskActor->SetSlicerManager(mCurrentSlicerManager);
171   mRefMaskActor->Initialize(10, true);
172   mRefMaskActor->Update();
173
174   // Prepare widget to get keyboard event
175   grabKeyboard();
176   //connect(this, SIGNAL(keyPressEvent(QKeyEvent*)), this, SLOT(keyPressed(QKeyEvent*)));
177 }
178 //------------------------------------------------------------------------------
179
180
181 //------------------------------------------------------------------------------
182 void vvToolSegmentation::keyPressEvent(QKeyEvent * event)
183 {
184   vvToolWidgetBase::keyPressEvent(event);
185   //DD("key");
186   
187   if (event->text() == "e") {
188     Erode();
189   }
190   if (event->text() == "d") {
191     Dilate(); // FIXME -> extend image BB !!
192   }
193   if (event->text() == "s") {
194     vvImageWriter::Pointer writer = vvImageWriter::New();
195     writer->SetOutputFileName("a.mha");
196     writer->SetInput(mMaskImage);
197     writer->Update();
198   }
199 }
200 //------------------------------------------------------------------------------
201
202
203 //------------------------------------------------------------------------------
204 void vvToolSegmentation::Erode()
205 {
206   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
207   vtkImageContinuousErode3D* erode = vtkImageContinuousErode3D::New();
208   erode->SetKernelSize(mKernelValue,mKernelValue,mKernelValue);
209   vtkImageData* image = mMaskImage->GetVTKImages()[0];
210   erode->SetInput(image);
211   erode->Update();
212   image->DeepCopy(erode->GetOutput());
213   image->Update();
214   UpdateAndRender();
215   erode->Delete();
216   QApplication::restoreOverrideCursor();
217 }
218 //------------------------------------------------------------------------------
219
220
221 //------------------------------------------------------------------------------
222 void vvToolSegmentation::Dilate()
223 {
224   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
225   vtkImageContinuousDilate3D* dilate = vtkImageContinuousDilate3D::New();
226   dilate->SetKernelSize(mKernelValue,mKernelValue,mKernelValue);
227   vtkImageData* image = mMaskImage->GetVTKImages()[0];
228   dilate->SetInput(image);
229   dilate->Update();
230   image->DeepCopy(dilate->GetOutput());
231   image->Update();
232   UpdateAndRender();
233   dilate->Delete();
234   QApplication::restoreOverrideCursor();
235 }
236 //------------------------------------------------------------------------------
237
238
239 //------------------------------------------------------------------------------
240 void vvToolSegmentation::UpdateAndRender()
241 {
242   bool visible = mRefMaskActor->IsVisible();
243   bool cvisible = mRefMaskActor->IsContourVisible();
244   mRefMaskActor->SetVisible(false);
245   mRefMaskActor->SetContourVisible(false);
246   mCurrentSlicerManager->Render();
247
248   //mRefMaskActor->RemoveActors();
249   mRefMaskActor->UpdateImage();
250   mRefMaskActor->SetVisible(visible);
251   mRefMaskActor->SetContourVisible(cvisible);
252   mCurrentSlicerManager->Render();
253 }
254 //------------------------------------------------------------------------------