#include "vtkMitkThickSlicesFilter.h"#include "vtkDataArray.h"#include "vtkImageData.h"#include "vtkInformation.h"#include "vtkInformationVector.h"#include "vtkObjectFactory.h"#include "vtkPointData.h"#include "vtkStreamingDemandDrivenPipeline.h"#include <math.h>#include <vtksys/ios/sstream>Go to the source code of this file.
Functions | |
| vtkCxxRevisionMacro (vtkMitkThickSlicesFilter,"$Revision: 1.00 $") | |
| vtkStandardNewMacro (vtkMitkThickSlicesFilter) | |
| template<class T > | |
| void | vtkMitkThickSlicesFilterExecute (vtkMitkThickSlicesFilter *self, vtkImageData *inData, T *inPtr, vtkImageData *outData, T *outPtr, int outExt[6], int) |
| vtkCxxRevisionMacro | ( | vtkMitkThickSlicesFilter | , |
| "$Revision: 1.00 $" | |||
| ) |
| void vtkMitkThickSlicesFilterExecute | ( | vtkMitkThickSlicesFilter * | self, |
| vtkImageData * | inData, | ||
| T * | inPtr, | ||
| vtkImageData * | outData, | ||
| T * | outPtr, | ||
| int | outExt[6], | ||
| int | |||
| ) |
Definition at line 119 of file vtkMitkThickSlicesFilter.cpp.
References vtkMitkThickSlicesFilter::MIP, QuadProgPP::sum(), and vtkMitkThickSlicesFilter::SUM.
Referenced by vtkMitkThickSlicesFilter::ThreadedRequestData().
{
int idxX, idxY;
int maxX, maxY;
vtkIdType inIncX, inIncY, inIncZ;
vtkIdType outIncX, outIncY, outIncZ;
int axesNum;
int *inExt = inData->GetExtent();
int *wholeExtent;
vtkIdType *inIncs;
int useYMin, useYMax, useXMin, useXMax;
// find the region to loop over
maxX = outExt[1] - outExt[0];
maxY = outExt[3] - outExt[2];
// maxZ = outExt[5] - outExt[4];
// Get the dimensionality of the gradient.
axesNum = self->GetDimensionality();
// Get increments to march through data
inData->GetContinuousIncrements(outExt, inIncX, inIncY, inIncZ);
outData->GetContinuousIncrements(outExt, outIncX, outIncY, outIncZ);
/*
// The data spacing is important for computing the gradient.
// central differences (2 * ratio).
// Negative because below we have (min - max) for dx ...
inData->GetSpacing(r);
r[0] = -0.5 / r[0];
r[1] = -0.5 / r[1];
r[2] = -0.5 / r[2];
*/
// get some other info we need
inIncs = inData->GetIncrements();
wholeExtent = inData->GetExtent();
// Move the pointer to the correct starting position.
inPtr += (outExt[0]-inExt[0])*inIncs[0] +
(outExt[2]-inExt[2])*inIncs[1] +
(outExt[4]-inExt[4])*inIncs[2];
// Loop through ouput pixels
int _minZ = /*-5 + outExt[4]; if( _minZ < wholeExtent[4]) _minZ=*/wholeExtent[4];
int _maxZ = /* 5 + outExt[4]; if( _maxZ > wholeExtent[5]) _maxZ=*/wholeExtent[5];
if(_maxZ<_minZ)
return;
double invNum = 1.0 / (_maxZ-_minZ+1) ;
switch(self->GetThickSliceMode())
{
default:
case vtkMitkThickSlicesFilter::MIP:
{
//MIP
for (idxY = 0; idxY <= maxY; idxY++)
{
useYMin = ((idxY + outExt[2]) <= wholeExtent[2]) ? 0 : -inIncs[1];
useYMax = ((idxY + outExt[2]) >= wholeExtent[3]) ? 0 : inIncs[1];
for (idxX = 0; idxX <= maxX; idxX++)
{
useXMin = ((idxX + outExt[0]) <= wholeExtent[0]) ? 0 : -inIncs[0];
useXMax = ((idxX + outExt[0]) >= wholeExtent[1]) ? 0 : inIncs[0];
T mip = inPtr[_minZ*inIncs[2]];
for(int z = _minZ+1; z<= _maxZ;z++)
{
T value = inPtr[z*inIncs[2]];
if(value > mip)
mip=value;
}
// do X axis
*outPtr = mip;
outPtr++;
inPtr++;
}
outPtr += outIncY;
inPtr += inIncY;
}
}
break;
case vtkMitkThickSlicesFilter::SUM:
{
//MIP
for (idxY = 0; idxY <= maxY; idxY++)
{
useYMin = ((idxY + outExt[2]) <= wholeExtent[2]) ? 0 : -inIncs[1];
useYMax = ((idxY + outExt[2]) >= wholeExtent[3]) ? 0 : inIncs[1];
for (idxX = 0; idxX <= maxX; idxX++)
{
useXMin = ((idxX + outExt[0]) <= wholeExtent[0]) ? 0 : -inIncs[0];
useXMax = ((idxX + outExt[0]) >= wholeExtent[1]) ? 0 : inIncs[0];
double sum = 0;
for(int z = _minZ; z<= _maxZ;z++)
{
T value = inPtr[z*inIncs[2]];
sum += value;
}
// do X axis
*outPtr = invNum*sum;
outPtr++;
inPtr++;
}
outPtr += outIncY;
inPtr += inIncY;
}
}
break;
}
}
| vtkStandardNewMacro | ( | vtkMitkThickSlicesFilter | ) |
1.7.2