1 #include "CheckBoard.h"
6 //------------------------------------------------------------
7 CheckBoard::CheckBoard()
8 : // use 'Initialization List'! //JPR
35 //------------------------------------------------------------
36 CheckBoard::~CheckBoard()
38 //if (image1 != NULL ) { image1->Delete(); }
39 //if (image2 != NULL ) { image2->Delete(); }
40 if (newImage != NULL ) { newImage->Delete(); }
41 if (result != NULL ) { result->Delete(); }
44 //------------------------------------------------------------
45 void CheckBoard::calculateImage()
48 if(image1!=NULL && image2!=NULL)
52 // Information from image1
53 image1->GetSpacing(spcImg1);
54 image1->GetExtent(extImg1);
56 type = image1->GetScalarType();
58 // The Z dimension is 1 for a 2D image
59 dimImg1[0] = extImg1[1] - extImg1[0]+1;
60 dimImg1[1] = extImg1[3] - extImg1[2]+1;
65 // Information from image2
66 image2->GetSpacing(spcImg2);
67 image2->GetExtent(extImg2);
69 // The Z dimension is 1 for a 2D image
70 dimImg2[0] = extImg2[1] - extImg2[0]+1;
71 dimImg2[1] = extImg2[3] - extImg2[2]+1;
74 long numPixelsImg1 = dimImg1[0]*dimImg1[1];
75 long numPixelsImg2 = dimImg2[0]*dimImg2[1];
79 resample = vtkImageResample::New();
80 result = vtkImageData::New();
81 if(numPixelsImg1<numPixelsImg2)
83 resample->SetInput(image1);
84 factorX = (double)extImg2[1]/extImg1[1];
85 factorY = (double)extImg2[3]/extImg1[3];
86 resample->SetAxisMagnificationFactor(0,factorX);
87 resample->SetAxisMagnificationFactor(1,factorY);
88 resample->SetInformationInput(image2);
90 initialize(dimImg2, spcImg2);
91 result = resample->GetOutput();
93 createImage(result,image2,dimImg2[0],dimImg2[1]);
95 else if (numPixelsImg1>numPixelsImg2)
97 resample->SetInput(image2);
98 factorX = (double)extImg1[1]/extImg2[1];
99 factorY = (double)extImg1[3]/extImg2[3];
100 resample->SetAxisMagnificationFactor(0,factorX);
101 resample->SetAxisMagnificationFactor(1,factorY);
102 resample->SetInformationInput(image1);
104 initialize(dimImg1, spcImg1);
105 result = resample->GetOutput();
109 createImage(image1,result,dimImg1[0],dimImg1[1]);
113 //If both images have the same number of pixels, the resultant image will have the
114 //properties of the first image.
115 resample->SetInput(image2);
116 factorX = (double)extImg1[1]/extImg2[1];
117 factorY = (double)extImg1[3]/extImg2[3];
118 resample->SetAxisMagnificationFactor(0,factorX);
119 resample->SetAxisMagnificationFactor(1,factorY);
120 resample->SetInformationInput(image1);
122 initialize(dimImg1, spcImg1);
124 result = resample->GetOutput();
127 createImage(image1,result,dimImg1[0],dimImg1[1]);
136 //------------------------------------------------------------
137 void CheckBoard::initialize(int dimensions[], double spacing[])
139 // Setting the new image
140 if(newImage != NULL){
143 newImage = vtkImageData::New();
144 newImage->SetScalarType(type);
145 newImage->SetSpacing(spacing);
146 newImage->SetDimensions(dimensions);
147 newImage->AllocateScalars();
151 //------------------------------------------------------------
152 void CheckBoard::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
154 int imageType=img1->GetScalarType();
156 if(imageType == VTK_CHAR)
159 char* dataImagePointer1 = NULL;
160 char* dataImagePointer2 = NULL;
161 char* dataImageResultPointer = NULL;
163 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
165 else if(imageType == VTK_SIGNED_CHAR)
168 signed char* dataImagePointer1 = NULL;
169 signed char* dataImagePointer2 = NULL;
170 signed char* dataImageResultPointer = NULL;
172 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
174 else if(imageType == VTK_UNSIGNED_CHAR)
177 unsigned char* dataImagePointer1 = NULL;
178 unsigned char* dataImagePointer2 = NULL;
179 unsigned char* dataImageResultPointer = NULL;
181 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
183 else if(imageType == VTK_SHORT)
186 short* dataImagePointer1 = NULL;
187 short* dataImagePointer2 = NULL;
188 short* dataImageResultPointer = NULL;
190 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
192 else if(imageType == VTK_UNSIGNED_SHORT)
195 unsigned short* dataImagePointer1 = NULL;
196 unsigned short* dataImagePointer2 = NULL;
197 unsigned short* dataImageResultPointer = NULL;
199 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
202 else if(imageType == VTK_INT)
205 int* dataImagePointer1 = NULL;
206 int* dataImagePointer2 = NULL;
207 int* dataImageResultPointer = NULL;
209 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
211 else if(imageType == VTK_UNSIGNED_INT)
214 unsigned int* dataImagePointer1 = NULL;
215 unsigned int* dataImagePointer2 = NULL;
216 unsigned int* dataImageResultPointer = NULL;
218 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
220 else if(imageType == VTK_LONG)
223 long* dataImagePointer1 = NULL;
224 long* dataImagePointer2 = NULL;
225 long* dataImageResultPointer = NULL;
227 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
229 else if(imageType == VTK_UNSIGNED_LONG)
232 unsigned long* dataImagePointer1 = NULL;
233 unsigned long* dataImagePointer2 = NULL;
234 unsigned long* dataImageResultPointer = NULL;
236 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
238 else if(imageType == VTK_FLOAT)
241 float* dataImagePointer1 = NULL;
242 float* dataImagePointer2 = NULL;
243 float* dataImageResultPointer = NULL;
245 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
247 else if(imageType == VTK_DOUBLE)
250 double* dataImagePointer1 = NULL;
251 double* dataImagePointer2 = NULL;
252 double* dataImageResultPointer = NULL;
254 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
257 //std::cout << "The image has been checkboardized!" << std::endl;
259 // newImage->Modified();
261 /**Template used for the different image types
264 void CheckBoard::createImageByType(T* dataImagePointer1, T* dataImagePointer2, T* dataImageResultPointer, vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
266 dataImagePointer1 = (T*) img1->GetScalarPointer(0,0,0);
267 dataImagePointer2 = (T*) img2->GetScalarPointer(0,0,0);
268 dataImageResultPointer = (T*) newImage->GetScalarPointer(0,0,0);
279 int divX = sizeX/squaresX;
280 int divY = sizeY/squaresY;
282 int counterX=0, counterY; // JPR : uninitialized
283 for(i = 0; i < sizeX; i++)
286 for(j = 0; j < sizeY; j++)
288 dataImagePointer1 = (T*)img1->GetScalarPointer(i,j,0);
289 dataImagePointer2 = (T*)img2->GetScalarPointer(i,j,0);
290 dataImageResultPointer = (T*)newImage->GetScalarPointer(i,j,0);
291 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
293 *dataImageResultPointer = (T) *dataImagePointer1;
295 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
297 *dataImageResultPointer = (T) *dataImagePointer2;
300 if(counterX >= 2*divX)
304 else if(counterY >= 2*divY)
317 //------------------------------------------------------------
318 vtkImageData* CheckBoard::getFilteredImage()
328 //------------------------------------------------------------
329 void CheckBoard::setInputImage1(vtkImageData *_image)
334 //------------------------------------------------------------
335 void CheckBoard::setInputImage2(vtkImageData *_image)
340 //------------------------------------------------------------
341 void CheckBoard::setCols(int cols)
346 //------------------------------------------------------------
347 void CheckBoard::setRows(int rows)