GOFIGURE2  0.9.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
QGoFilterChanAndVese.cxx
Go to the documentation of this file.
1 /*=========================================================================
2  Authors: The GoFigure Dev. Team.
3  at Megason Lab, Systems biology, Harvard Medical school, 2009-11
4 
5  Copyright (c) 2009-11, President and Fellows of Harvard College.
6  All rights reserved.
7 
8  Redistribution and use in source and binary forms, with or without
9  modification, are permitted provided that the following conditions are met:
10 
11  Redistributions of source code must retain the above copyright notice,
12  this list of conditions and the following disclaimer.
13  Redistributions in binary form must reproduce the above copyright notice,
14  this list of conditions and the following disclaimer in the documentation
15  and/or other materials provided with the distribution.
16  Neither the name of the President and Fellows of Harvard College
17  nor the names of its contributors may be used to endorse or promote
18  products derived from this software without specific prior written
19  permission.
20 
21  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
25  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
27  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
30  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 
33 =========================================================================*/
34 #include "QGoFilterChanAndVese.h"
35 
36 #include "QGoGUILibConfigure.h"
37 
38 // for apply method
39 #include "vtkImageExport.h"
40 #include "vtkImageData.h"
41 
42 // ITK filter
44 #include "itkImage.h"
45 #include "itkVTKImageImport.h"
46 
47 // to cut
48 #include "vtkPlane.h"
49 #include "vtkCutter.h"
50 
51 // to translate
52 #include "vtkTransform.h"
53 #include "vtkTransformPolyDataFilter.h"
54 
55 #include "GoImageProcessor.h"
56 
57 //#include "QGoContourSemiAutoLevelsetWidget.h"
58 
59 //--------------------------------------------------------------------------
61  QGoFilterSemiAutoBase(iParent)
62 {
63  m_Image3D = itk::Image< float, 3 >::New();
64  m_Image2D = itk::Image< float, 2 >::New();
65 
66  m_Dimension = iDimension;
67  m_Iterations = 15;
68  m_Curvature = 5;
69 }
70 
71 //--------------------------------------------------------------------------
72 
73 //--------------------------------------------------------------------------
76 {
77 }
78 //--------------------------------------------------------------------------
79 /*
80 //--------------------------------------------------------------------------
81 void
82 QGoFilterChanAndVese::Filter2D(double *iCenter, const int & iOrientation)
83 {
84  const int dimension = 2;
85 
86  // useful to translate the polydata afterwards
87  setCenter(iCenter);
88 
89  vtkImageData *slice = vtkImageData::New();
90 
91  // Extract one slice if dimenesion == 2
92  vtkImageData *input = extractOneSlice(getInput(), iCenter, iOrientation);
93  slice->DeepCopy(input);
94  input->Delete();
95 
96  // Recompute new center
97  double *newOrigin = slice->GetOrigin();
98  double center[3];
99 
100  switch ( iOrientation )
101  {
102  case 0:
103  {
104  center[0] = iCenter[0] + newOrigin[0];
105  center[1] = iCenter[1] + newOrigin[1];
106  center[2] = 0.;
107  break;
108  }
109  case 1:
110  {
111  center[0] = iCenter[0] + newOrigin[0];
112  center[1] = iCenter[2] + newOrigin[1];
113  center[2] = 0.;
114  break;
115  }
116  case 2:
117  {
118  center[0] = iCenter[1] + newOrigin[0];
119  center[1] = iCenter[2] + newOrigin[1];
120  center[2] = 0.;
121  break;
122  }
123  default:
124  {
125  break;
126  }
127  }
128 
129  // run filter
130  typedef itk::Image< unsigned char, dimension > FeatureImageType;
131  typedef itk::Image< float, dimension > OutputImageType;
132 
133  //VTK to ITK
134  //---------------------------------------------------------
135  FeatureImageType::Pointer
136  itkImage = ConvertVTK2ITK< unsigned char, dimension >(slice);
137  slice->Delete();
138 
139  // Extract ROI
140  //---------------------------------------------------------
141  FeatureImageType::Pointer
142  test2 = ExtractROI< unsigned char, dimension >( itkImage, center, getRadius() );
143 
144  // Apply filter
145  // Apply LevelSet segmentation filter
146  //---------------------------------------------------------
147  typedef itk::ChanAndVeseSegmentationFilter< FeatureImageType >
148  SegmentationFilterType;
149 
150  FeatureImageType::PointType pt;
151 
152  SegmentationFilterType::Pointer filter = SegmentationFilterType::New();
153 
154  filter->SetFeatureImage(test2);
155  filter->SetPreprocess(1);
156 
157  pt[0] = center[0];
158  pt[1] = center[1];
159 
160  filter->SetCenter(pt);
161 
162  filter->SetRadius( getRadius() );
163  filter->SetNumberOfIterations(m_Iterations);
164  filter->SetCurvatureWeight(m_Curvature);
165  filter->Update();
166 
167  OutputImageType::Pointer test3 = filter->GetOutput();
168 
169  // Convert output
170  //---------------------------------------------------------
171  vtkImageData *itk2vtk = ConvertITK2VTK< float, dimension >(test3);
172  setOutput(itk2vtk);
173  itk2vtk->Delete();
174 
175  vtkPolyData *reconstructed = ReconstructContour(getOutput(), 0.);
176 
177  // Translate to real location (i.e. see_pos[])
178  vtkTransform *t = vtkTransform::New();
179  t->Translate(getCenter()[0],
180  getCenter()[1],
181  getCenter()[2]);
182 
183  vtkTransformPolyDataFilter *tf = vtkTransformPolyDataFilter::New();
184  tf->SetTransform(t);
185  tf->SetInput(reconstructed);
186  tf->Update();
187 
188  vtkPolyData *contour = vtkPolyData::New();
189  contour->DeepCopy( tf->GetOutput() );
190 
191  tf->Delete();
192  t->Delete();
193  reconstructed->Delete();
194 
195  emit ContourCreated(contour);
196 }*/
197 //--------------------------------------------------------------------------
198 
199 //--------------------------------------------------------------------------
200 std::vector<std::vector<vtkPolyData*> > QGoFilterChanAndVese::
202  double iRadius, std::vector< vtkPoints* >* iPoints,
203  int iIterations, int iCurvature, int iSampling,
204  GoImageProcessor* iImages, int iChannel)
205 {
206  std::vector<std::vector<vtkPolyData*> > oSetOfContours =
207  std::vector<std::vector<vtkPolyData*> >();
208 
209 
210  return oSetOfContours;
211 }
212 //--------------------------------------------------------------------------
213 
214 //--------------------------------------------------------------------------
215 //itk::Image< float, VImageDimension >::Pointer QGoFilterChanAndVese::Apply2DFilter(
216 // itk::Image< unsigned int, VImageDimension >::Pointer iPointer,
217 // int iIterations, int iCurvature)
218 //{
219 // //const int dimension = 2;
220 
221 // // useful to translate the polydata afterwards
222 // //setCenter(iCenter);
223 
224 // //vtkImageData *slice = vtkImageData::New();
225 
226 // // Extract one slice if dimenesion == 2
227 // //vtkImageData *input = extractOneSlice(getInput(), iCenter, iOrientation);
228 // //slice->DeepCopy(input);
229 // //input->Delete();
230 
231 // // Recompute new center
232 // //double *newOrigin = slice->GetOrigin();
233 // //double center[3];
234 
235 // switch ( iOrientation )
236 // {
237 // case 0:
238 // {
239 // center[0] = iCenter[0] + newOrigin[0];
240 // center[1] = iCenter[1] + newOrigin[1];
241 // center[2] = 0.;
242 // break;
243 // }
244 // case 1:
245 // {
246 // center[0] = iCenter[0] + newOrigin[0];
247 // center[1] = iCenter[2] + newOrigin[1];
248 // center[2] = 0.;
249 // break;
250 // }
251 // case 2:
252 // {
253 // center[0] = iCenter[1] + newOrigin[0];
254 // center[1] = iCenter[2] + newOrigin[1];
255 // center[2] = 0.;
256 // break;
257 // }
258 // default:
259 // {
260 // break;
261 // }
262 // }
263 
264 // // run filter
265 // typedef itk::Image< unsigned char, dimension > FeatureImageType;
266 // typedef itk::Image< float, dimension > OutputImageType;
267 
268 // //VTK to ITK
269 // //---------------------------------------------------------
270 // FeatureImageType::Pointer
271 // itkImage = ConvertVTK2ITK< unsigned char, dimension >(slice);
272 // slice->Delete();
273 
274 // // Extract ROI
275 // //---------------------------------------------------------
276 // FeatureImageType::Pointer
277 // test2 = ExtractROI< unsigned char, dimension >( itkImage, center, getRadius() );
278 
279 // // Apply filter
280 // // Apply LevelSet segmentation filter
281 // //----------------------------------------------------------
282 // const int dimension = 2;
283 // typedef itk::Image< unsigned char, dimension > FeatureImageType;
284 // typedef itk::Image< float, dimension > OutputImageType;
285 // typedef itk::ChanAndVeseSegmentationFilter< FeatureImageType >
286 // SegmentationFilterType;
287 
288 // FeatureImageType::PointType pt;
289 
290 // SegmentationFilterType::Pointer filter = SegmentationFilterType::New();
291 
292 // //filter->SetFeatureImage(test2);
293 // filter->SetFeatureImage(iPointer);
294 // filter->SetPreprocess(1);
295 
296 // //pt[0] = center[0];
297 // //pt[1] = center[1];
298 
299 // //filter->SetCenter(pt);
300 
301 // //filter->SetRadius( getRadius() );
302 // //filter->SetNumberOfIterations(m_Iterations);
303 // //filter->SetCurvatureWeight(m_Curvature);
304 // filter->SetNumberOfIterations(iIterations);
305 // filter->SetCurvatureWeight(iCurvature);
306 // filter->Update();
307 
308 // //OutputImageType::Pointer test3 = filter->GetOutput();
309 // return filter->GetOutput();
310 // // Convert output
311 // //---------------------------------------------------------
312 // vtkImageData *itk2vtk = ConvertITK2VTK< float, dimension >(test3);
313 // setOutput(itk2vtk);
314 // itk2vtk->Delete();
315 
316 // vtkPolyData *reconstructed = ReconstructContour(getOutput(), 0.);
317 
318 // // Translate to real location (i.e. see_pos[])
319 // vtkTransform *t = vtkTransform::New();
320 // t->Translate(getCenter()[0],
321 // getCenter()[1],
322 // getCenter()[2]);
323 
324 // vtkTransformPolyDataFilter *tf = vtkTransformPolyDataFilter::New();
325 // tf->SetTransform(t);
326 // tf->SetInput(reconstructed);
327 // tf->Update();
328 
329 // vtkPolyData *contour = vtkPolyData::New();
330 // contour->DeepCopy( tf->GetOutput() );
331 
332 // tf->Delete();
333 // t->Delete();
334 // reconstructed->Delete();
335 
336 // emit ContourCreated(contour);
337 //}
QGoFilterChanAndVese(QObject *iParent=NULL, int iDimension=2)
Constructor.
Output3DType::Pointer m_Image3D
~QGoFilterChanAndVese()
Destructor.
Output2DType::Pointer m_Image2D
Connects the common signals regarding the seeds segmentation Provides methods to convert images from ...
Interface between image reader and vtkImageData.
std::vector< std::vector< vtkPolyData * > > ApplyFilterSetOf2D(double iRadius, std::vector< vtkPoints * > *iPoints, int iIterations, int iCurvature, int iSampling, GoImageProcessor *iImages, int iChannel)