1 #include "CheckBoard.h"
7 //------------------------------------------------------------
8 CheckBoard::CheckBoard()
24 //------------------------------------------------------------
25 CheckBoard::~CheckBoard()
27 //if (image1 != NULL ) { image1->Delete(); }
28 //if (image2 != NULL ) { image2->Delete(); }
29 if (newImage != NULL ) { newImage->Delete(); }
30 if (result != NULL ) { result->Delete(); }
33 //------------------------------------------------------------
34 void CheckBoard::calculateImage()
37 if(image1!=NULL && image2!=NULL)
42 // Information from image1
43 image1->GetSpacing(spcImg1);
44 image1->GetExtent(extImg1);
46 type = image1->GetScalarType();
48 // The Z dimension is 1 for a 2D image
49 dimImg1[0] = extImg1[1] - extImg1[0]+1;
50 dimImg1[1] = extImg1[3] - extImg1[2]+1;
55 // Information from image2
56 image2->GetSpacing(spcImg2);
57 image2->GetExtent(extImg2);
59 // The Z dimension is 1 for a 2D image
60 dimImg2[0] = extImg2[1] - extImg2[0]+1;
61 dimImg2[1] = extImg2[3] - extImg2[2]+1;
64 long numPixelsImg1 = dimImg1[0]*dimImg1[1];
65 long numPixelsImg2 = dimImg2[0]*dimImg2[1];
69 resample = vtkImageResample::New();
70 result = vtkImageData::New();
71 if(numPixelsImg1<numPixelsImg2)
73 resample->SetInput(image1);
74 factorX = (double)extImg2[1]/extImg1[1];
75 factorY = (double)extImg2[3]/extImg1[3];
76 resample->SetAxisMagnificationFactor(0,factorX);
77 resample->SetAxisMagnificationFactor(1,factorY);
78 resample->SetInformationInput(image2);
80 initialize(dimImg2, spcImg2);
81 result = resample->GetOutput();
83 createImage(result,image2,dimImg2[0],dimImg2[1]);
86 else if (numPixelsImg1>numPixelsImg2)
88 resample->SetInput(image2);
89 factorX = (double)extImg1[1]/extImg2[1];
90 factorY = (double)extImg1[3]/extImg2[3];
91 resample->SetAxisMagnificationFactor(0,factorX);
92 resample->SetAxisMagnificationFactor(1,factorY);
93 resample->SetInformationInput(image1);
95 initialize(dimImg1, spcImg1);
96 result = resample->GetOutput();
100 createImage(image1,result,dimImg1[0],dimImg1[1]);
104 //If both images have the same number of pixels, the resultant image will have the
105 //properties of the first image.
106 resample->SetInput(image2);
107 factorX = (double)extImg1[1]/extImg2[1];
108 factorY = (double)extImg1[3]/extImg2[3];
109 resample->SetAxisMagnificationFactor(0,factorX);
110 resample->SetAxisMagnificationFactor(1,factorY);
111 resample->SetInformationInput(image1);
113 initialize(dimImg1, spcImg1);
115 result = resample->GetOutput();
118 createImage(image1,result,dimImg1[0],dimImg1[1]);
127 //------------------------------------------------------------
128 void CheckBoard::initialize(int dimensions[], double spacing[])
130 // Setting the new image
131 if(newImage != NULL){
134 newImage = vtkImageData::New();
135 newImage->SetScalarType(type);
136 newImage->SetSpacing(spacing);
137 newImage->SetDimensions(dimensions);
138 newImage->AllocateScalars();
144 //------------------------------------------------------------
145 void CheckBoard::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
147 int imageType=img1->GetScalarType();
149 if(imageType == VTK_CHAR)
152 char* dataImagePointer1 = NULL;
153 char* dataImagePointer2 = NULL;
154 char* dataImageResultPointer = NULL;
156 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
158 else if(imageType == VTK_SIGNED_CHAR)
161 signed char* dataImagePointer1 = NULL;
162 signed char* dataImagePointer2 = NULL;
163 signed char* dataImageResultPointer = NULL;
165 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
167 else if(imageType == VTK_UNSIGNED_CHAR)
170 unsigned char* dataImagePointer1 = NULL;
171 unsigned char* dataImagePointer2 = NULL;
172 unsigned char* dataImageResultPointer = NULL;
174 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
176 else if(imageType == VTK_SHORT)
179 short* dataImagePointer1 = NULL;
180 short* dataImagePointer2 = NULL;
181 short* dataImageResultPointer = NULL;
183 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
185 else if(imageType == VTK_UNSIGNED_SHORT)
188 unsigned short* dataImagePointer1 = NULL;
189 unsigned short* dataImagePointer2 = NULL;
190 unsigned short* dataImageResultPointer = NULL;
192 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
195 else if(imageType == VTK_INT)
198 int* dataImagePointer1 = NULL;
199 int* dataImagePointer2 = NULL;
200 int* dataImageResultPointer = NULL;
202 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
204 else if(imageType == VTK_UNSIGNED_INT)
207 unsigned int* dataImagePointer1 = NULL;
208 unsigned int* dataImagePointer2 = NULL;
209 unsigned int* dataImageResultPointer = NULL;
211 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
213 else if(imageType == VTK_LONG)
216 long* dataImagePointer1 = NULL;
217 long* dataImagePointer2 = NULL;
218 long* dataImageResultPointer = NULL;
220 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
222 else if(imageType == VTK_UNSIGNED_LONG)
225 unsigned long* dataImagePointer1 = NULL;
226 unsigned long* dataImagePointer2 = NULL;
227 unsigned long* dataImageResultPointer = NULL;
229 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
231 else if(imageType == VTK_FLOAT)
234 float* dataImagePointer1 = NULL;
235 float* dataImagePointer2 = NULL;
236 float* dataImageResultPointer = NULL;
238 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
240 else if(imageType == VTK_DOUBLE)
243 double* dataImagePointer1 = NULL;
244 double* dataImagePointer2 = NULL;
245 double* dataImageResultPointer = NULL;
247 createImageByType(dataImagePointer1,dataImagePointer2,dataImageResultPointer,img1,img2,sizeX,sizeY);
251 //std::cout << "The image has been checkboardized!" << std::endl;
253 // newImage->Modified();
255 /**Template used for the different image types
258 void CheckBoard::createImageByType(T* dataImagePointer1, T* dataImagePointer2, T* dataImageResultPointer, vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
260 dataImagePointer1 = (T*) img1->GetScalarPointer(0,0,0);
261 dataImagePointer2 = (T*) img2->GetScalarPointer(0,0,0);
262 dataImageResultPointer = (T*) newImage->GetScalarPointer(0,0,0);
273 int divX = sizeX/squaresX;
274 int divY = sizeY/squaresY;
275 int i, j, counterX, counterY;
276 for(i = 0; i < sizeX; i++)
279 for(j = 0; j < sizeY; j++)
281 dataImagePointer1 = (T*)img1->GetScalarPointer(i,j,0);
282 dataImagePointer2 = (T*)img2->GetScalarPointer(i,j,0);
283 dataImageResultPointer = (T*)newImage->GetScalarPointer(i,j,0);
284 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
286 *dataImageResultPointer = (T) *dataImagePointer1;
288 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
290 *dataImageResultPointer = (T) *dataImagePointer2;
293 if(counterX >= 2*divX)
297 else if(counterY >= 2*divY)
310 //------------------------------------------------------------
311 vtkImageData* CheckBoard::getFilteredImage()
321 //------------------------------------------------------------
322 void CheckBoard::setInputImage1(vtkImageData *_image)
327 //------------------------------------------------------------
328 void CheckBoard::setInputImage2(vtkImageData *_image)
333 //------------------------------------------------------------
334 void CheckBoard::setCols(int cols)
339 //------------------------------------------------------------
340 void CheckBoard::setRows(int rows)