1 #include "CheckBoard.h"
7 //------------------------------------------------------------
8 CheckBoard::CheckBoard()
22 //------------------------------------------------------------
23 CheckBoard::~CheckBoard()
25 //if (image1 != NULL ) { image1->Delete(); }
26 //if (image2 != NULL ) { image2->Delete(); }
27 if (newImage != NULL ) { newImage->Delete(); }
30 //------------------------------------------------------------
31 void CheckBoard::calculateImage()
34 if(image1!=NULL && image2!=NULL)
39 // Information from image1
40 image1->GetSpacing(spcImg1);
41 image1->GetExtent(extImg1);
43 type = image1->GetScalarType();
45 // The Z dimension is 1 for a 2D image
46 dimImg1[0] = extImg1[1] - extImg1[0]+1;
47 dimImg1[1] = extImg1[3] - extImg1[2]+1;
52 // Information from image2
53 image2->GetSpacing(spcImg2);
54 image2->GetExtent(extImg2);
56 // The Z dimension is 1 for a 2D image
57 dimImg2[0] = extImg2[1] - extImg2[0]+1;
58 dimImg2[1] = extImg2[3] - extImg2[2]+1;
61 long numPixelsImg1 = dimImg1[0]*dimImg1[1];
62 long numPixelsImg2 = dimImg2[0]*dimImg2[1];
66 vtkImageResample *resample = vtkImageResample::New();
68 if(numPixelsImg1<numPixelsImg2)
70 resample->SetInput(image1);
71 factorX = (double)extImg2[1]/extImg1[1];
72 factorY = (double)extImg2[3]/extImg1[3];
73 resample->SetAxisMagnificationFactor(0,factorX);
74 resample->SetAxisMagnificationFactor(1,factorY);
75 resample->SetInformationInput(image2);
77 initialize(dimImg2, spcImg2);
78 result = resample->GetOutput();
80 createImage(result,image2,dimImg2[0],dimImg2[1]);
83 else if (numPixelsImg1>numPixelsImg2)
85 resample->SetInput(image2);
86 factorX = (double)extImg1[1]/extImg2[1];
87 factorY = (double)extImg1[3]/extImg2[3];
88 resample->SetAxisMagnificationFactor(0,factorX);
89 resample->SetAxisMagnificationFactor(1,factorY);
90 resample->SetInformationInput(image1);
92 initialize(dimImg1, spcImg1);
93 result = resample->GetOutput();
97 createImage(image1,result,dimImg1[0],dimImg1[1]);
101 //If both images have the same number of pixels, the resultant image will have the
102 //properties of the first image.
103 resample->SetInput(image2);
104 factorX = (double)extImg1[1]/extImg2[1];
105 factorY = (double)extImg1[3]/extImg2[3];
106 resample->SetAxisMagnificationFactor(0,factorX);
107 resample->SetAxisMagnificationFactor(1,factorY);
108 resample->SetInformationInput(image1);
110 initialize(dimImg1, spcImg1);
112 result = resample->GetOutput();
115 createImage(image1,result,dimImg1[0],dimImg1[1]);
124 //------------------------------------------------------------
125 void CheckBoard::initialize(int dimensions[], double spacing[])
127 // Setting the new image
128 if(newImage != NULL){
131 newImage = vtkImageData::New();
132 newImage->SetScalarType(type);
133 newImage->SetSpacing(spacing);
134 newImage->SetDimensions(dimensions);
135 newImage->AllocateScalars();
141 //------------------------------------------------------------
142 void CheckBoard::createImage(vtkImageData *img1, vtkImageData *img2, int sizeX, int sizeY)
144 int imageType=img1->GetScalarType();
146 if(imageType == VTK_CHAR)
149 char* dataImagePointer1 = NULL;
150 char* dataImagePointer2 = NULL;
151 char* dataImageResultPointer = NULL;
153 dataImagePointer1 = (char*) img1->GetScalarPointer(0,0,0);
154 dataImagePointer2 = (char*) img2->GetScalarPointer(0,0,0);
155 dataImageResultPointer = (char*) newImage->GetScalarPointer(0,0,0);
166 int divX = sizeX/squaresX;
167 int divY = sizeY/squaresY;
168 int i, j, counterX, counterY;
169 for(i = 0; i < sizeX; i++)
172 for(j = 0; j < sizeY; j++)
174 dataImagePointer1 = (char*)img1->GetScalarPointer(i,j,0);
175 dataImagePointer2 = (char*)img2->GetScalarPointer(i,j,0);
176 dataImageResultPointer = (char*)newImage->GetScalarPointer(i,j,0);
178 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
180 *dataImageResultPointer = (char) *dataImagePointer1;
182 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
184 *dataImageResultPointer = (char) *dataImagePointer2;
187 if(counterX >= 2*divX)
191 else if(counterY >= 2*divY)
202 else if(imageType == VTK_SIGNED_CHAR)
205 signed char* dataImagePointer1 = NULL;
206 signed char* dataImagePointer2 = NULL;
207 signed char* dataImageResultPointer = NULL;
209 dataImagePointer1 = (signed char*) img1->GetScalarPointer(0,0,0);
210 dataImagePointer2 = (signed char*) img2->GetScalarPointer(0,0,0);
211 dataImageResultPointer = (signed char*) newImage->GetScalarPointer(0,0,0);
222 int divX = sizeX/squaresX;
223 int divY = sizeY/squaresY;
224 int i, j, counterX, counterY;
225 for(i = 0; i < sizeX; i++)
228 for(j = 0; j < sizeY; j++)
230 dataImagePointer1 = (signed char*)img1->GetScalarPointer(i,j,0);
231 dataImagePointer2 = (signed char*)img2->GetScalarPointer(i,j,0);
232 dataImageResultPointer = (signed char*)newImage->GetScalarPointer(i,j,0);
234 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
236 *dataImageResultPointer = (signed char) *dataImagePointer1;
238 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
240 *dataImageResultPointer = (signed char) *dataImagePointer2;
243 if(counterX >= 2*divX)
247 else if(counterY >= 2*divY)
257 else if(imageType == VTK_UNSIGNED_CHAR)
260 unsigned char* dataImagePointer1 = NULL;
261 unsigned char* dataImagePointer2 = NULL;
262 unsigned char* dataImageResultPointer = NULL;
264 dataImagePointer1 = (unsigned char*) img1->GetScalarPointer(0,0,0);
265 dataImagePointer2 = (unsigned char*) img2->GetScalarPointer(0,0,0);
266 dataImageResultPointer = (unsigned char*) newImage->GetScalarPointer(0,0,0);
277 int divX = sizeX/squaresX;
278 int divY = sizeY/squaresY;
279 int i, j, counterX, counterY;
280 for(i = 0; i < sizeX; i++)
283 for(j = 0; j < sizeY; j++)
285 dataImagePointer1 = (unsigned char*)img1->GetScalarPointer(i,j,0);
286 dataImagePointer2 = (unsigned char*)img2->GetScalarPointer(i,j,0);
287 dataImageResultPointer = (unsigned char*)newImage->GetScalarPointer(i,j,0);
289 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
291 *dataImageResultPointer = (unsigned char) *dataImagePointer1;
293 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
295 *dataImageResultPointer = (unsigned char) *dataImagePointer2;
298 if(counterX >= 2*divX)
302 else if(counterY >= 2*divY)
312 else if(imageType == VTK_SHORT)
315 short* dataImagePointer1 = NULL;
316 short* dataImagePointer2 = NULL;
317 short* dataImageResultPointer = NULL;
319 dataImagePointer1 = (short*) img1->GetScalarPointer(0,0,0);
320 dataImagePointer2 = (short*) img2->GetScalarPointer(0,0,0);
321 dataImageResultPointer = (short*) newImage->GetScalarPointer(0,0,0);
332 int divX = sizeX/squaresX;
333 int divY = sizeY/squaresY;
334 int i, j, counterX, counterY;
335 for(i = 0; i < sizeX; i++)
338 for(j = 0; j < sizeY; j++)
340 dataImagePointer1 = (short*)img1->GetScalarPointer(i,j,0);
341 dataImagePointer2 = (short*)img2->GetScalarPointer(i,j,0);
342 dataImageResultPointer = (short*)newImage->GetScalarPointer(i,j,0);
344 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
346 *dataImageResultPointer = (short) *dataImagePointer1;
348 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
350 *dataImageResultPointer = (short) *dataImagePointer2;
353 if(counterX >= 2*divX)
357 else if(counterY >= 2*divY)
367 else if(imageType == VTK_UNSIGNED_SHORT)
370 unsigned short* dataImagePointer1 = NULL;
371 unsigned short* dataImagePointer2 = NULL;
372 unsigned short* dataImageResultPointer = NULL;
374 dataImagePointer1 = (unsigned short*) img1->GetScalarPointer(0,0,0);
375 dataImagePointer2 = (unsigned short*) img2->GetScalarPointer(0,0,0);
376 dataImageResultPointer = (unsigned short*) newImage->GetScalarPointer(0,0,0);
387 int divX = sizeX/squaresX;
388 int divY = sizeY/squaresY;
389 int i, j, counterX, counterY;
390 for(i = 0; i < sizeX; i++)
393 for(j = 0; j < sizeY; j++)
395 dataImagePointer1 = (unsigned short*)img1->GetScalarPointer(i,j,0);
396 dataImagePointer2 = (unsigned short*)img2->GetScalarPointer(i,j,0);
397 dataImageResultPointer = (unsigned short*)newImage->GetScalarPointer(i,j,0);
399 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
401 *dataImageResultPointer = (unsigned short) *dataImagePointer1;
403 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
405 *dataImageResultPointer = (unsigned short) *dataImagePointer2;
408 if(counterX >= 2*divX)
412 else if(counterY >= 2*divY)
423 else if(imageType == VTK_INT)
426 int* dataImagePointer1 = NULL;
427 int* dataImagePointer2 = NULL;
428 int* dataImageResultPointer = NULL;
430 dataImagePointer1 = (int*) img1->GetScalarPointer(0,0,0);
431 dataImagePointer2 = (int*) img2->GetScalarPointer(0,0,0);
432 dataImageResultPointer = (int*) newImage->GetScalarPointer(0,0,0);
443 int divX = sizeX/squaresX;
444 int divY = sizeY/squaresY;
445 int i, j, counterX, counterY;
446 for(i = 0; i < sizeX; i++)
449 for(j = 0; j < sizeY; j++)
451 dataImagePointer1 = (int*)img1->GetScalarPointer(i,j,0);
452 dataImagePointer2 = (int*)img2->GetScalarPointer(i,j,0);
453 dataImageResultPointer = (int*)newImage->GetScalarPointer(i,j,0);
455 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
457 *dataImageResultPointer = (int) *dataImagePointer1;
459 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
461 *dataImageResultPointer = (int) *dataImagePointer2;
464 if(counterX >= 2*divX)
468 else if(counterY >= 2*divY)
478 else if(imageType == VTK_UNSIGNED_INT)
481 unsigned int* dataImagePointer1 = NULL;
482 unsigned int* dataImagePointer2 = NULL;
483 unsigned int* dataImageResultPointer = NULL;
485 dataImagePointer1 = (unsigned int*) img1->GetScalarPointer(0,0,0);
486 dataImagePointer2 = (unsigned int*) img2->GetScalarPointer(0,0,0);
487 dataImageResultPointer = (unsigned int*) newImage->GetScalarPointer(0,0,0);
498 int divX = sizeX/squaresX;
499 int divY = sizeY/squaresY;
500 int i, j, counterX, counterY;
501 for(i = 0; i < sizeX; i++)
504 for(j = 0; j < sizeY; j++)
506 dataImagePointer1 = (unsigned int*)img1->GetScalarPointer(i,j,0);
507 dataImagePointer2 = (unsigned int*)img2->GetScalarPointer(i,j,0);
508 dataImageResultPointer = (unsigned int*)newImage->GetScalarPointer(i,j,0);
510 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
512 *dataImageResultPointer = (unsigned int) *dataImagePointer1;
514 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
516 *dataImageResultPointer = (unsigned int) *dataImagePointer2;
519 if(counterX >= 2*divX)
523 else if(counterY >= 2*divY)
533 else if(imageType == VTK_LONG)
536 long* dataImagePointer1 = NULL;
537 long* dataImagePointer2 = NULL;
538 long* dataImageResultPointer = NULL;
540 dataImagePointer1 = (long*) img1->GetScalarPointer(0,0,0);
541 dataImagePointer2 = (long*) img2->GetScalarPointer(0,0,0);
542 dataImageResultPointer = (long*) newImage->GetScalarPointer(0,0,0);
553 int divX = sizeX/squaresX;
554 int divY = sizeY/squaresY;
555 int i, j, counterX, counterY;
556 for(i = 0; i < sizeX; i++)
559 for(j = 0; j < sizeY; j++)
561 dataImagePointer1 = (long*)img1->GetScalarPointer(i,j,0);
562 dataImagePointer2 = (long*)img2->GetScalarPointer(i,j,0);
563 dataImageResultPointer = (long*)newImage->GetScalarPointer(i,j,0);
565 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
567 *dataImageResultPointer = (long) *dataImagePointer1;
569 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
571 *dataImageResultPointer = (long) *dataImagePointer2;
574 if(counterX >= 2*divX)
578 else if(counterY >= 2*divY)
588 else if(imageType == VTK_UNSIGNED_LONG)
591 unsigned long* dataImagePointer1 = NULL;
592 unsigned long* dataImagePointer2 = NULL;
593 unsigned long* dataImageResultPointer = NULL;
595 dataImagePointer1 = (unsigned long*) img1->GetScalarPointer(0,0,0);
596 dataImagePointer2 = (unsigned long*) img2->GetScalarPointer(0,0,0);
597 dataImageResultPointer = (unsigned long*) newImage->GetScalarPointer(0,0,0);
608 int divX = sizeX/squaresX;
609 int divY = sizeY/squaresY;
610 int i, j, counterX, counterY;
611 for(i = 0; i < sizeX; i++)
614 for(j = 0; j < sizeY; j++)
616 dataImagePointer1 = (unsigned long*)img1->GetScalarPointer(i,j,0);
617 dataImagePointer2 = (unsigned long*)img2->GetScalarPointer(i,j,0);
618 dataImageResultPointer = (unsigned long*)newImage->GetScalarPointer(i,j,0);
620 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
622 *dataImageResultPointer = (unsigned long) *dataImagePointer1;
624 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
626 *dataImageResultPointer = (unsigned long) *dataImagePointer2;
629 if(counterX >= 2*divX)
633 else if(counterY >= 2*divY)
642 else if(imageType == VTK_FLOAT)
645 float* dataImagePointer1 = NULL;
646 float* dataImagePointer2 = NULL;
647 float* dataImageResultPointer = NULL;
649 dataImagePointer1 = (float*) img1->GetScalarPointer(0,0,0);
650 dataImagePointer2 = (float*) img2->GetScalarPointer(0,0,0);
651 dataImageResultPointer = (float*) newImage->GetScalarPointer(0,0,0);
662 int divX = sizeX/squaresX;
663 int divY = sizeY/squaresY;
664 int i, j, counterX, counterY;
665 for(i = 0; i < sizeX; i++)
668 for(j = 0; j < sizeY; j++)
670 dataImagePointer1 = (float*)img1->GetScalarPointer(i,j,0);
671 dataImagePointer2 = (float*)img2->GetScalarPointer(i,j,0);
672 dataImageResultPointer = (float*)newImage->GetScalarPointer(i,j,0);
674 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
676 *dataImageResultPointer = (float) *dataImagePointer1;
678 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
680 *dataImageResultPointer = (float) *dataImagePointer2;
683 if(counterX >= 2*divX)
687 else if(counterY >= 2*divY)
697 else if(imageType == VTK_DOUBLE)
700 double* dataImagePointer1 = NULL;
701 double* dataImagePointer2 = NULL;
702 double* dataImageResultPointer = NULL;
704 dataImagePointer1 = (double*) img1->GetScalarPointer(0,0,0);
705 dataImagePointer2 = (double*) img2->GetScalarPointer(0,0,0);
706 dataImageResultPointer = (double*) newImage->GetScalarPointer(0,0,0);
717 int divX = sizeX/squaresX;
718 int divY = sizeY/squaresY;
719 int i, j, counterX, counterY;
720 for(i = 0; i < sizeX; i++)
723 for(j = 0; j < sizeY; j++)
725 dataImagePointer1 = (double*)img1->GetScalarPointer(i,j,0);
726 dataImagePointer2 = (double*)img2->GetScalarPointer(i,j,0);
727 dataImageResultPointer = (double*)newImage->GetScalarPointer(i,j,0);
729 if( (counterX <= divX && counterY <= divY) || ((counterX >= divX && counterX <= 2*divX) && (counterY >= divY && counterY <= 2*divY)) )
731 *dataImageResultPointer = (double) *dataImagePointer1;
733 else //if( ((counterX >= divX && counterX <= 2*divX) && counterY <= divY) || (counterX <= divX && (counterY >= divY && counterY <= 2*divY)) )
735 *dataImageResultPointer = (double) *dataImagePointer2;
738 if(counterX >= 2*divX)
742 else if(counterY >= 2*divY)
753 //std::cout << "The image has been checkboardized!" << std::endl;
755 // newImage->Modified();
761 //------------------------------------------------------------
762 vtkImageData* CheckBoard::getFilteredImage()
772 //------------------------------------------------------------
773 void CheckBoard::setInputImage1(vtkImageData *_image)
778 //------------------------------------------------------------
779 void CheckBoard::setInputImage2(vtkImageData *_image)
784 //------------------------------------------------------------
785 void CheckBoard::setCols(int cols)
790 //------------------------------------------------------------
791 void CheckBoard::setRows(int rows)