]> Creatis software - clitk.git/blob - common/clitkDicomRT_ROI_ConvertToImageFilter.cxx
Reformatted using new coding style
[clitk.git] / common / clitkDicomRT_ROI_ConvertToImageFilter.cxx
1 /*=========================================================================
2   Program:         vv http://www.creatis.insa-lyon.fr/rio/vv
3   Main authors :   XX XX XX
4
5   Authors belongs to:
6   - University of LYON           http://www.universite-lyon.fr/
7   - Léon Bérard cancer center    http://oncora1.lyon.fnclcc.fr
8   - CREATIS CNRS laboratory      http://www.creatis.insa-lyon.fr
9
10   This software is distributed WITHOUT ANY WARRANTY; without even
11   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12   PURPOSE.  See the copyright notices for more information.
13
14   It is distributed under dual licence
15   - BSD       http://www.opensource.org/licenses/bsd-license.php
16   - CeCILL-B  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17
18   =========================================================================*/
19
20 #include "clitkDicomRT_ROI_ConvertToImageFilter.h"
21 #include <vtkPolyDataToImageStencil.h>
22 #include <vtkSmartPointer.h>
23 #include <vtkImageStencil.h>
24 #include <vtkLinearExtrusionFilter.h>
25 #include <itkVTKImageToImageFilter.h>
26 #include "clitkImageCommon.h"
27
28 //--------------------------------------------------------------------
29 clitk::DicomRT_ROI_ConvertToImageFilter::DicomRT_ROI_ConvertToImageFilter()
30 {
31   mROI = NULL;
32   mImageInfoIsSet = false;
33   mWriteOutput = false;
34   mCropMask = true;
35 }
36 //--------------------------------------------------------------------
37
38
39 //--------------------------------------------------------------------
40 clitk::DicomRT_ROI_ConvertToImageFilter::~DicomRT_ROI_ConvertToImageFilter()
41 {
42
43 }
44 //--------------------------------------------------------------------
45
46
47 //--------------------------------------------------------------------
48 void clitk::DicomRT_ROI_ConvertToImageFilter::SetROI(clitk::DicomRT_ROI * roi)
49 {
50   mROI = roi;
51 }
52 //--------------------------------------------------------------------
53
54
55 //--------------------------------------------------------------------
56 void clitk::DicomRT_ROI_ConvertToImageFilter::SetCropMaskEnabled(bool b)
57 {
58   mCropMask = b;
59 }
60 //--------------------------------------------------------------------
61
62
63 //--------------------------------------------------------------------
64 void clitk::DicomRT_ROI_ConvertToImageFilter::SetOutputImageFilename(std::string s)
65 {
66   mOutputFilename = s;
67   mWriteOutput = true;
68 }
69 //--------------------------------------------------------------------
70
71
72 //--------------------------------------------------------------------
73 void clitk::DicomRT_ROI_ConvertToImageFilter::SetImageFilename(std::string f)
74 {
75   itk::ImageIOBase::Pointer header = clitk::readImageHeader(f);
76   if (header->GetNumberOfDimensions() < 3) {
77     std::cerr << "Error. Please provide a 3D image instead of " << f << std::endl;
78     exit(0);
79   }
80   if (header->GetNumberOfDimensions() > 3) {
81     std::cerr << "Warning dimension > 3 are ignored" << std::endl;
82   }
83   mSpacing.resize(3);
84   mOrigin.resize(3);
85   mSize.resize(3);
86   for(unsigned int i=0; i<3; i++) {
87     mSpacing[i] = header->GetSpacing(i);
88     mOrigin[i] = header->GetOrigin(i);
89     mSize[i] = header->GetDimensions(i);
90   }
91   mImageInfoIsSet = true;
92 }
93 //--------------------------------------------------------------------
94
95
96 //--------------------------------------------------------------------
97 void clitk::DicomRT_ROI_ConvertToImageFilter::Update()
98 {
99   if (!mROI) {
100     std::cerr << "Error. No ROI set, please use SetROI." << std::endl;
101     exit(0);
102   }
103   if (!mImageInfoIsSet) {
104     std::cerr << "Error. Please provide image info (spacing/origin) with SetImageFilename" << std::endl;
105     exit(0);
106   }
107   // DD("Update");
108
109   // Get Mesh
110   vtkPolyData * mesh = mROI->GetMesh();
111   DD(mesh->GetNumberOfCells());
112
113   // Get bounds
114   double *bounds=mesh->GetBounds();
115   // for(int i=0; i<6; i++){
116 //     DD(bounds[i]);
117 //   }
118
119   // Compute origin
120   std::vector<double> origin;
121   origin.resize(3);
122   origin[0] = floor((bounds[0]-mOrigin[0])/mSpacing[0]-2)*mSpacing[0]+mOrigin[0];
123   origin[1] = floor((bounds[2]-mOrigin[1])/mSpacing[1]-2)*mSpacing[1]+mOrigin[1];
124   origin[2] = floor((bounds[4]-mOrigin[2])/mSpacing[2]-2)*mSpacing[2]+mOrigin[2];
125
126   // Compute extend
127   std::vector<double> extend;
128   extend.resize(3);
129   extend[0] = ceil((bounds[1]-origin[0])/mSpacing[0]+4);
130   extend[1] = ceil((bounds[3]-origin[1])/mSpacing[1]+4);
131   extend[2] = ceil((bounds[5]-origin[2])/mSpacing[2]+4);
132
133   // If no crop, set initial image size/origin
134   if (!mCropMask) {
135     for(int i=0; i<3; i++) {
136       origin[i] = mOrigin[i];
137       extend[i] = mSize[i]-1;
138     }
139   }
140
141   // Create new output image
142   mBinaryImage = vtkImageData::New();
143   mBinaryImage->SetScalarTypeToUnsignedChar();
144   mBinaryImage->SetOrigin(&origin[0]);
145   mBinaryImage->SetSpacing(&mSpacing[0]);
146   mBinaryImage->SetExtent(0, extend[0],
147                           0, extend[1],
148                           0, extend[2]);
149   mBinaryImage->AllocateScalars();
150
151   // for(int i=0; i<3; i++){
152   //     DD(origin[i]);
153   //     DD(extend[i]);
154   //     DD(mBinaryImage->GetDimensions()[i]);
155   //   }
156   memset(mBinaryImage->GetScalarPointer(), 0,
157          mBinaryImage->GetDimensions()[0]*mBinaryImage->GetDimensions()[1]*mBinaryImage->GetDimensions()[2]*sizeof(unsigned char));
158
159   // Extrude
160   vtkSmartPointer<vtkLinearExtrusionFilter> extrude=vtkSmartPointer<vtkLinearExtrusionFilter>::New();
161   extrude->SetInput(mesh);
162   ///We extrude in the -slice_spacing direction to respect the FOCAL convention // ?????????????
163   extrude->SetVector(0, 0, -mSpacing[2]);
164
165   // Binarization
166   vtkSmartPointer<vtkPolyDataToImageStencil> sts=vtkSmartPointer<vtkPolyDataToImageStencil>::New();
167   //The following line is extremely important
168   //http://www.nabble.com/Bug-in-vtkPolyDataToImageStencil--td23368312.html#a23370933
169   sts->SetTolerance(0);
170   sts->SetInformationInput(mBinaryImage);
171   sts->SetInput(extrude->GetOutput());
172   //sts->SetInput(mesh);
173
174   vtkSmartPointer<vtkImageStencil> stencil=vtkSmartPointer<vtkImageStencil>::New();
175   stencil->SetStencil(sts->GetOutput());
176   stencil->SetInput(mBinaryImage);
177   stencil->ReverseStencilOn();
178   stencil->Update();
179   mBinaryImage->ShallowCopy(stencil->GetOutput());
180
181   if (mWriteOutput) {
182     typedef itk::Image<unsigned char, 3> ImageType;
183     typedef itk::VTKImageToImageFilter<ImageType> ConnectorType;
184     ConnectorType::Pointer connector = ConnectorType::New();
185     connector->SetInput(GetOutput());
186     connector->Update();
187     clitk::writeImage<ImageType>(connector->GetOutput(), mOutputFilename);
188   }
189 }
190 //--------------------------------------------------------------------
191
192
193
194 //--------------------------------------------------------------------
195 vtkImageData * clitk::DicomRT_ROI_ConvertToImageFilter::GetOutput()
196 {
197   return mBinaryImage;
198 }
199 //--------------------------------------------------------------------