2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------ */
27 #include "CheckBoard.h"
32 //------------------------------------------------------------
33 CheckBoard::CheckBoard() :
59 //------------------------------------------------------------
60 CheckBoard::~CheckBoard()
62 //if (image1 != NULL ) { image1->Delete(); }
63 //if (image2 != NULL ) { image2->Delete(); }
64 if (newImage != NULL ) { newImage->Delete(); }
65 if (result != NULL ) { result->Delete(); }
68 //------------------------------------------------------------
69 void CheckBoard::calculateImage()
72 if(image1!=NULL && image2!=NULL)
76 // Information from image1
77 image1->GetSpacing(spcImg1);
78 image1->GetExtent(extImg1);
80 type = image1->GetScalarType();
82 // The Z dimension is 1 for a 2D image
83 dimImg1[0] = extImg1[1] - extImg1[0]+1;
84 dimImg1[1] = extImg1[3] - extImg1[2]+1;
89 // Information from image2
90 image2->GetSpacing(spcImg2);
91 image2->GetExtent(extImg2);
93 // The Z dimension is 1 for a 2D image
94 dimImg2[0] = extImg2[1] - extImg2[0]+1;
95 dimImg2[1] = extImg2[3] - extImg2[2]+1;
98 long numPixelsImg1 = dimImg1[0]*dimImg1[1];
99 long numPixelsImg2 = dimImg2[0]*dimImg2[1];
103 resample = vtkImageResample::New();
104 result = vtkImageData::New();
105 if(numPixelsImg1<numPixelsImg2)
107 resample->SetInput(image1);
108 factorX = (double)extImg2[1]/extImg1[1];
109 factorY = (double)extImg2[3]/extImg1[3];
110 resample->SetAxisMagnificationFactor(0,factorX);
111 resample->SetAxisMagnificationFactor(1,factorY);
112 resample->SetInformationInput(image2);
114 initialize(dimImg2, spcImg2);
115 result = resample->GetOutput();
117 createImage(result,image2,dimImg2[0],dimImg2[1]);
119 else if (numPixelsImg1>numPixelsImg2)
121 resample->SetInput(image2);
122 factorX = (double)extImg1[1]/extImg2[1];
123 factorY = (double)extImg1[3]/extImg2[3];
124 resample->SetAxisMagnificationFactor(0,factorX);
125 resample->SetAxisMagnificationFactor(1,factorY);
126 resample->SetInformationInput(image1);
128 initialize(dimImg1, spcImg1);
129 result = resample->GetOutput();
133 createImage(image1,result,dimImg1[0],dimImg1[1]);
137 //If both images have the same number of pixels, the resultant image will have the
138 //properties of the first image.
139 resample->SetInput(image2);
140 factorX = (double)extImg1[1]/extImg2[1];
141 factorY = (double)extImg1[3]/extImg2[3];
142 resample->SetAxisMagnificationFactor(0,factorX);
143 resample->SetAxisMagnificationFactor(1,factorY);
144 resample->SetInformationInput(image1);
146 initialize(dimImg1, spcImg1);
148 result = resample->GetOutput();
151 createImage(image1,result,dimImg1[0],dimImg1[1]);
160 //------------------------------------------------------------
161 void CheckBoard::initialize(int dimensions[], double spacing[])
163 // Setting the new image
164 if(newImage != NULL){
167 newImage = vtkImageData::New();
168 newImage->SetScalarType(type);
169 newImage->SetSpacing(spacing);
170 newImage->SetDimensions(dimensions);
171 newImage->AllocateScalars();
175 //------------------------------------------------------------
176 void CheckBoard::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
178 int imageType=img1->GetScalarType();
180 if(imageType == VTK_CHAR)
183 char* dataImagePointer1 = NULL;
184 char* dataImagePointer2 = NULL;
185 char* dataImageResultPointer = NULL;
187 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
189 else if(imageType == VTK_SIGNED_CHAR)
192 signed char* dataImagePointer1 = NULL;
193 signed char* dataImagePointer2 = NULL;
194 signed char* dataImageResultPointer = NULL;
196 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
198 else if(imageType == VTK_UNSIGNED_CHAR)
201 unsigned char* dataImagePointer1 = NULL;
202 unsigned char* dataImagePointer2 = NULL;
203 unsigned char* dataImageResultPointer = NULL;
205 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
207 else if(imageType == VTK_SHORT)
210 short* dataImagePointer1 = NULL;
211 short* dataImagePointer2 = NULL;
212 short* dataImageResultPointer = NULL;
214 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
216 else if(imageType == VTK_UNSIGNED_SHORT)
219 unsigned short* dataImagePointer1 = NULL;
220 unsigned short* dataImagePointer2 = NULL;
221 unsigned short* dataImageResultPointer = NULL;
223 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
226 else if(imageType == VTK_INT)
229 int* dataImagePointer1 = NULL;
230 int* dataImagePointer2 = NULL;
231 int* dataImageResultPointer = NULL;
233 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
235 else if(imageType == VTK_UNSIGNED_INT)
238 unsigned int* dataImagePointer1 = NULL;
239 unsigned int* dataImagePointer2 = NULL;
240 unsigned int* dataImageResultPointer = NULL;
242 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
244 else if(imageType == VTK_LONG)
247 long* dataImagePointer1 = NULL;
248 long* dataImagePointer2 = NULL;
249 long* dataImageResultPointer = NULL;
251 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
253 else if(imageType == VTK_UNSIGNED_LONG)
256 unsigned long* dataImagePointer1 = NULL;
257 unsigned long* dataImagePointer2 = NULL;
258 unsigned long* dataImageResultPointer = NULL;
260 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
262 else if(imageType == VTK_FLOAT)
265 float* dataImagePointer1 = NULL;
266 float* dataImagePointer2 = NULL;
267 float* dataImageResultPointer = NULL;
269 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
271 else if(imageType == VTK_DOUBLE)
274 double* dataImagePointer1 = NULL;
275 double* dataImagePointer2 = NULL;
276 double* dataImageResultPointer = NULL;
278 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
281 //std::cout << "The image has been checkboardized!" << std::endl;
283 // newImage->Modified();
285 /**Template used for the different image types
288 void CheckBoard::createImageByType(T* dataImagePointer1, T* dataImagePointer2, T* dataImageResultPointer, vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
290 dataImagePointer1 = (T*) img1->GetScalarPointer(0,0,0);
291 dataImagePointer2 = (T*) img2->GetScalarPointer(0,0,0);
292 dataImageResultPointer = (T*) newImage->GetScalarPointer(0,0,0);
303 int divX = sizeX/squaresX;
304 int divY = sizeY/squaresY;
306 int counterX=0, counterY; // JPR : uninitialized
307 for(i = 0; i < sizeX; i++)
310 for(j = 0; j < sizeY; j++)
312 dataImagePointer1 = (T*)img1->GetScalarPointer(i,j,0);
313 dataImagePointer2 = (T*)img2->GetScalarPointer(i,j,0);
314 dataImageResultPointer = (T*)newImage->GetScalarPointer(i,j,0);
315 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
317 *dataImageResultPointer = (T) *dataImagePointer1;
319 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
321 *dataImageResultPointer = (T) *dataImagePointer2;
324 if(counterX >= 2*divX)
328 else if(counterY >= 2*divY)
341 //------------------------------------------------------------
342 vtkImageData* CheckBoard::getFilteredImage()
352 //------------------------------------------------------------
353 void CheckBoard::setInputImage1(vtkImageData *_image)
358 //------------------------------------------------------------
359 void CheckBoard::setInputImage2(vtkImageData *_image)
364 //------------------------------------------------------------
365 void CheckBoard::setCols(int cols)
370 //------------------------------------------------------------
371 void CheckBoard::setRows(int rows)