1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
20 #include "vvToolSegmentation.h"
21 #include "vvSlicerManager.h"
23 #include "vvToolInputSelectorWidget.h"
24 #include "vvImageWriter.h"
27 #include <QFileDialog>
28 #include <QMessageBox>
31 #include "vtkImageContinuousErode3D.h"
32 #include "vtkImageContinuousDilate3D.h"
34 //------------------------------------------------------------------------------
35 // Create the tool and automagically (I like this word) insert it in
36 // the main window menu.
37 ADD_TOOL(vvToolSegmentation);
38 //------------------------------------------------------------------------------
41 //------------------------------------------------------------------------------
42 void vvToolSegmentation::Initialize()
44 SetToolName("Segmentation");
45 SetToolMenuName("Interactive Segmentation");
46 SetToolIconFilename(":/common/icons/ducky.ico");
47 SetToolTip("Image interactive segmentation (trial).");
48 SetToolExperimental(true);
50 //------------------------------------------------------------------------------
53 //------------------------------------------------------------------------------
54 vvToolSegmentation::vvToolSegmentation(vvMainWindowBase * parent, Qt::WindowFlags f)
55 :vvToolWidgetBase(parent,f),
56 vvToolBase<vvToolSegmentation>(parent),
57 Ui::vvToolSegmentation()
60 Ui_vvToolSegmentation::setupUi(mToolWidget);
61 setAttribute(Qt::WA_DeleteOnClose);
63 // Set how many inputs are needed for this tool
64 AddInputSelector("Select one image");
67 mKernelValue = 3; // FIXME must be odd. If even -> not symmetrical
69 //------------------------------------------------------------------------------
72 //------------------------------------------------------------------------------
73 vvToolSegmentation::~vvToolSegmentation()
76 //------------------------------------------------------------------------------
79 //------------------------------------------------------------------------------
80 bool vvToolSegmentation::close()
82 mRefMaskActor->RemoveActors();
84 mCurrentSlicerManager->Render();
87 //------------------------------------------------------------------------------
90 //------------------------------------------------------------------------------
91 void vvToolSegmentation::InputIsSelected(vvSlicerManager * m)
93 DD("InputIsSelected");
94 mCurrentSlicerManager = m;
95 mCurrentImage = mCurrentSlicerManager->GetImage();
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"));
105 //mLabelInputInfo->setText(QString("%1").arg(m->GetFileName().c_str()));
110 //------------------------------------------------------------------------------
113 //------------------------------------------------------------------------------
114 void vvToolSegmentation::apply()
118 //------------------------------------------------------------------------------
121 //------------------------------------------------------------------------------
122 void vvToolSegmentation::OpenBinaryImage()
124 DD("OpenBinaryImage");
126 // Load browser and select image
127 QString Extensions = "Images files ( *.mha *.mhd *.hdr *.his)";
128 Extensions += ";;All Files (*)";
130 QFileDialog::getOpenFileName(this,tr("Open binary image"),
131 mMainWindowBase->GetInputPathName(),Extensions);
132 DD(filename.toStdString());
133 if (filename.size() == 0) return;
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();
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);
152 mMaskImage = reader->GetOutput();
153 int dim = mMaskImage->GetNumberOfDimensions();
155 QMessageBox::information(this,tr("Sorry only 3D yet"), tr("Sorry only 3D yet"));
160 // Add a new roi actor
161 mRefMaskActor = QSharedPointer<vvROIActor>(new vvROIActor);
162 std::vector<double> color;
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();
174 // Prepare widget to get keyboard event
176 //connect(this, SIGNAL(keyPressEvent(QKeyEvent*)), this, SLOT(keyPressed(QKeyEvent*)));
178 //------------------------------------------------------------------------------
181 //------------------------------------------------------------------------------
182 void vvToolSegmentation::keyPressEvent(QKeyEvent * event)
184 vvToolWidgetBase::keyPressEvent(event);
187 if (event->text() == "e") {
190 if (event->text() == "d") {
191 Dilate(); // FIXME -> extend image BB !!
193 if (event->text() == "s") {
194 vvImageWriter::Pointer writer = vvImageWriter::New();
195 writer->SetOutputFileName("a.mha");
196 writer->SetInput(mMaskImage);
200 //------------------------------------------------------------------------------
203 //------------------------------------------------------------------------------
204 void vvToolSegmentation::Erode()
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);
212 image->DeepCopy(erode->GetOutput());
216 QApplication::restoreOverrideCursor();
218 //------------------------------------------------------------------------------
221 //------------------------------------------------------------------------------
222 void vvToolSegmentation::Dilate()
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);
230 image->DeepCopy(dilate->GetOutput());
234 QApplication::restoreOverrideCursor();
236 //------------------------------------------------------------------------------
239 //------------------------------------------------------------------------------
240 void vvToolSegmentation::UpdateAndRender()
242 bool visible = mRefMaskActor->IsVisible();
243 bool cvisible = mRefMaskActor->IsContourVisible();
244 mRefMaskActor->SetVisible(false);
245 mRefMaskActor->SetContourVisible(false);
246 mCurrentSlicerManager->Render();
248 //mRefMaskActor->RemoveActors();
249 mRefMaskActor->UpdateImage();
250 mRefMaskActor->SetVisible(visible);
251 mRefMaskActor->SetContourVisible(cvisible);
252 mCurrentSlicerManager->Render();
254 //------------------------------------------------------------------------------