1 #include "CheckBoard.h"
6 //------------------------------------------------------------
7 CheckBoard::CheckBoard() :
33 //------------------------------------------------------------
34 CheckBoard::~CheckBoard()
36 //if (image1 != NULL ) { image1->Delete(); }
37 //if (image2 != NULL ) { image2->Delete(); }
38 if (newImage != NULL ) { newImage->Delete(); }
39 if (result != NULL ) { result->Delete(); }
42 //------------------------------------------------------------
43 void CheckBoard::calculateImage()
46 if(image1!=NULL && image2!=NULL)
50 // Information from image1
51 image1->GetSpacing(spcImg1);
52 image1->GetExtent(extImg1);
54 type = image1->GetScalarType();
56 // The Z dimension is 1 for a 2D image
57 dimImg1[0] = extImg1[1] - extImg1[0]+1;
58 dimImg1[1] = extImg1[3] - extImg1[2]+1;
63 // Information from image2
64 image2->GetSpacing(spcImg2);
65 image2->GetExtent(extImg2);
67 // The Z dimension is 1 for a 2D image
68 dimImg2[0] = extImg2[1] - extImg2[0]+1;
69 dimImg2[1] = extImg2[3] - extImg2[2]+1;
72 long numPixelsImg1 = dimImg1[0]*dimImg1[1];
73 long numPixelsImg2 = dimImg2[0]*dimImg2[1];
77 resample = vtkImageResample::New();
78 result = vtkImageData::New();
79 if(numPixelsImg1<numPixelsImg2)
81 resample->SetInput(image1);
82 factorX = (double)extImg2[1]/extImg1[1];
83 factorY = (double)extImg2[3]/extImg1[3];
84 resample->SetAxisMagnificationFactor(0,factorX);
85 resample->SetAxisMagnificationFactor(1,factorY);
86 resample->SetInformationInput(image2);
88 initialize(dimImg2, spcImg2);
89 result = resample->GetOutput();
91 createImage(result,image2,dimImg2[0],dimImg2[1]);
93 else if (numPixelsImg1>numPixelsImg2)
95 resample->SetInput(image2);
96 factorX = (double)extImg1[1]/extImg2[1];
97 factorY = (double)extImg1[3]/extImg2[3];
98 resample->SetAxisMagnificationFactor(0,factorX);
99 resample->SetAxisMagnificationFactor(1,factorY);
100 resample->SetInformationInput(image1);
102 initialize(dimImg1, spcImg1);
103 result = resample->GetOutput();
107 createImage(image1,result,dimImg1[0],dimImg1[1]);
111 //If both images have the same number of pixels, the resultant image will have the
112 //properties of the first image.
113 resample->SetInput(image2);
114 factorX = (double)extImg1[1]/extImg2[1];
115 factorY = (double)extImg1[3]/extImg2[3];
116 resample->SetAxisMagnificationFactor(0,factorX);
117 resample->SetAxisMagnificationFactor(1,factorY);
118 resample->SetInformationInput(image1);
120 initialize(dimImg1, spcImg1);
122 result = resample->GetOutput();
125 createImage(image1,result,dimImg1[0],dimImg1[1]);
134 //------------------------------------------------------------
135 void CheckBoard::initialize(int dimensions[], double spacing[])
137 // Setting the new image
138 if(newImage != NULL){
141 newImage = vtkImageData::New();
142 newImage->SetScalarType(type);
143 newImage->SetSpacing(spacing);
144 newImage->SetDimensions(dimensions);
145 newImage->AllocateScalars();
149 //------------------------------------------------------------
150 void CheckBoard::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
152 int imageType=img1->GetScalarType();
154 if(imageType == VTK_CHAR)
157 char* dataImagePointer1 = NULL;
158 char* dataImagePointer2 = NULL;
159 char* dataImageResultPointer = NULL;
161 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
163 else if(imageType == VTK_SIGNED_CHAR)
166 signed char* dataImagePointer1 = NULL;
167 signed char* dataImagePointer2 = NULL;
168 signed char* dataImageResultPointer = NULL;
170 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
172 else if(imageType == VTK_UNSIGNED_CHAR)
175 unsigned char* dataImagePointer1 = NULL;
176 unsigned char* dataImagePointer2 = NULL;
177 unsigned char* dataImageResultPointer = NULL;
179 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
181 else if(imageType == VTK_SHORT)
184 short* dataImagePointer1 = NULL;
185 short* dataImagePointer2 = NULL;
186 short* dataImageResultPointer = NULL;
188 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
190 else if(imageType == VTK_UNSIGNED_SHORT)
193 unsigned short* dataImagePointer1 = NULL;
194 unsigned short* dataImagePointer2 = NULL;
195 unsigned short* dataImageResultPointer = NULL;
197 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
200 else if(imageType == VTK_INT)
203 int* dataImagePointer1 = NULL;
204 int* dataImagePointer2 = NULL;
205 int* dataImageResultPointer = NULL;
207 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
209 else if(imageType == VTK_UNSIGNED_INT)
212 unsigned int* dataImagePointer1 = NULL;
213 unsigned int* dataImagePointer2 = NULL;
214 unsigned int* dataImageResultPointer = NULL;
216 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
218 else if(imageType == VTK_LONG)
221 long* dataImagePointer1 = NULL;
222 long* dataImagePointer2 = NULL;
223 long* dataImageResultPointer = NULL;
225 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
227 else if(imageType == VTK_UNSIGNED_LONG)
230 unsigned long* dataImagePointer1 = NULL;
231 unsigned long* dataImagePointer2 = NULL;
232 unsigned long* dataImageResultPointer = NULL;
234 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
236 else if(imageType == VTK_FLOAT)
239 float* dataImagePointer1 = NULL;
240 float* dataImagePointer2 = NULL;
241 float* dataImageResultPointer = NULL;
243 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
245 else if(imageType == VTK_DOUBLE)
248 double* dataImagePointer1 = NULL;
249 double* dataImagePointer2 = NULL;
250 double* dataImageResultPointer = NULL;
252 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
255 //std::cout << "The image has been checkboardized!" << std::endl;
257 // newImage->Modified();
259 /**Template used for the different image types
262 void CheckBoard::createImageByType(T* dataImagePointer1, T* dataImagePointer2, T* dataImageResultPointer, vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
264 dataImagePointer1 = (T*) img1->GetScalarPointer(0,0,0);
265 dataImagePointer2 = (T*) img2->GetScalarPointer(0,0,0);
266 dataImageResultPointer = (T*) newImage->GetScalarPointer(0,0,0);
277 int divX = sizeX/squaresX;
278 int divY = sizeY/squaresY;
280 int counterX=0, counterY; // JPR : uninitialized
281 for(i = 0; i < sizeX; i++)
284 for(j = 0; j < sizeY; j++)
286 dataImagePointer1 = (T*)img1->GetScalarPointer(i,j,0);
287 dataImagePointer2 = (T*)img2->GetScalarPointer(i,j,0);
288 dataImageResultPointer = (T*)newImage->GetScalarPointer(i,j,0);
289 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
291 *dataImageResultPointer = (T) *dataImagePointer1;
293 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
295 *dataImageResultPointer = (T) *dataImagePointer2;
298 if(counterX >= 2*divX)
302 else if(counterY >= 2*divY)
315 //------------------------------------------------------------
316 vtkImageData* CheckBoard::getFilteredImage()
326 //------------------------------------------------------------
327 void CheckBoard::setInputImage1(vtkImageData *_image)
332 //------------------------------------------------------------
333 void CheckBoard::setInputImage2(vtkImageData *_image)
338 //------------------------------------------------------------
339 void CheckBoard::setCols(int cols)
344 //------------------------------------------------------------
345 void CheckBoard::setRows(int rows)