[ITK-users] Buffered Region out of Range error
Michael Jackson
mike.jackson at bluequartz.net
Tue Oct 27 17:59:13 EDT 2015
I have been struggling with this error all afternoon and I just can not “see” what I am doing wrong. I am getting the following exception message from our program:
Failed to execute itk::SignedMaurerDistanceMapImage filter for Feature 9. Error Message returned from ITK:
itk::ERROR: MultiThreader(0x7fb53486e200): Exception occurred during SingleMethodExecute
/Users/Shared/DREAM3D_SDK/InsightToolkit-4.7.2/Modules/Core/Common/include/itkImageConstIterator.h:211:
itk::ERROR: Region ImageRegion (0x12e6f6730)
Dimension: 3
Index: [0, 0, 0]
Size: [64, 64, 4]
is outside of buffered region ImageRegion (0x7fb53c0a8040)
Dimension: 3
Index: [0, 0, 0]
Size: [0, 0, 0]
So what are the reasons that this can happen? Basically we creating an unsigned char image where we fill in the pixels, then run the Itk filter on each unsigned char image. Finally we want to copy the final output data into one of our own arrays. I will post the code under here. Any help is greatly appreciated.
size_t iDims[3] = { 0, 0, 0 };
float origin[3] = { 0.0f, 0.0f, 0.0f };
float resolution[3] = { 0.0f, 0.0f, 0.0f };
image->getDimensions(iDims);
image->getOrigin(origin);
image->getResolution(resolution);
int32_t numFeatures = m_SignedDistanceFields.size();
typedef itk::Image<unsigned char, 3> BoolImageType;
typedef itk::Image<float, 3> FloatImageType;
std::vector<BoolImageType::Pointer> booleanFeatureImages(numFeatures);
BoolImageType::IndexType start;
BoolImageType::SizeType size;
BoolImageType::RegionType region;
start.Fill(0);
size[0] = iDims[0];
size[1] = iDims[1];
size[2] = iDims[2];
region.SetIndex(start);
region.SetSize(size);
for (int32_t i = 0; i < numFeatures; i++)
{
BoolImageType::Pointer tmpBoolImage = BoolImageType::New();
tmpBoolImage->SetRegions(region);
tmpBoolImage->Allocate();
tmpBoolImage->SetOrigin(origin);
tmpBoolImage->SetSpacing(resolution);
tmpBoolImage->FillBuffer(0);
booleanFeatureImages[i] = tmpBoolImage;
}
size_t zStride = 0;
size_t yStride = 0;
size_t index = 0;
for (size_t z = 0; z < iDims[2]; z++)
{
zStride = z * iDims[1] * iDims[2];
for (size_t y = 0; y < iDims[1]; y++)
{
yStride = y * iDims[0];
for (size_t x = 0; x < iDims[0]; x++)
{
index = zStride + yStride + x;
BoolImageType::IndexType pixelIndex;
pixelIndex[0] = x;
pixelIndex[1] = y;
pixelIndex[2] = z;
if (x == y && y == z) { booleanFeatureImages[0]->SetPixel(pixelIndex, 255); }
booleanFeatureImages[m_FeatureIds[index]]->SetPixel(pixelIndex, 255);
}
}
}
// Compute signed distance field for each Feature
typedef itk::SignedMaurerDistanceMapImageFilter<BoolImageType, FloatImageType> SignedMaurerFilter;
for (int32_t i = 0; i < numFeatures; i++)
{
if (getCancel() == true) { return; }
SignedMaurerFilter::Pointer signedDistMap = SignedMaurerFilter::New();
float* tmpDistField = m_SignedDistanceFields[i].lock()->getPointer(0);
signedDistMap->SetInsideIsPositive(false);
signedDistMap->SetSquaredDistance(true);
signedDistMap->SetUseImageSpacing(true);
signedDistMap->SetInput(booleanFeatureImages[i]);
try
{
signedDistMap->Update();
for (size_t z = 0; z < iDims[2]; z++)
{
zStride = z * iDims[1] * iDims[2];
for (size_t y = 0; y < iDims[1]; y++)
{
yStride = y * iDims[0];
for (size_t x = 0; x < iDims[0]; x++)
{
index = zStride + yStride + x;
BoolImageType::IndexType pixelIndex;
pixelIndex[0] = x;
pixelIndex[1] = y;
pixelIndex[2] = z;
FloatImageType::Pointer out = signedDistMap->GetOutput();
out->SetBufferedRegion(region);
tmpDistField[index] = out->GetPixel(pixelIndex);
}
}
}
}
catch (itk::ExceptionObject& err)
{
setErrorCondition(-5);
QString ss = QObject::tr("Failed to execute itk::SignedMaurerDistanceMapImage filter for Feature %1. Error Message returned from ITK:\n %2").arg(i).arg(err.GetDescription());
notifyErrorMessage(getHumanLabel(), ss, getErrorCondition());
}
}
--
Mike Jackson
BlueQuartz Software, LLC
[e]: mike.jackson at bluequartz.net
More information about the Insight-users
mailing list