[ITK-users] itk::EllipsoidInteriorExteriorSpatialFunction

Daoued23 mlt.khawla at gmail.com
Fri Jul 3 08:55:25 EDT 2015


I used the examle of public wiki, and i made some adjustments. I just pasted
a part of the code that deals with the ellipsoid creation, i set an
arbitrary direction and the length of the axes as [1,1,10].

Thanks



{//*********************ELLIPSOID DRAWING****************
// Image size and spacing parameters
unsigned long xExtent = 9;
unsigned long yExtent = 9;
unsigned long zExtent = 9;
unsigned long structuringElementSize[] = { xExtent, yExtent, zExtent };
double structuringElementSpacing[] = { 1.0, 1.0, 1.0 };
double structuringElementOrigin[] = { 0, 0, 0 };

// Calculate image volume
unsigned long imageVolume = xExtent * yExtent * zExtent;

// Image typedef
typedef itk::Image< unsigned char, Dimension> ImageType;

// Creates the structuringElement (but doesn't set the size or allocate
memory)
ImageType::Pointer structuringElement = ImageType::New();
structuringElement->SetOrigin(structuringElementOrigin);
structuringElement->SetSpacing(structuringElementSpacing);

std::cout << "New physical structuringElement created\n";

//-----The following block allocates the structuringElement-----

// Create a size object native to the structuringElement type
ImageType::SizeType structuringElementSizeObject;
// Set the size object to the array defined earlier
structuringElementSizeObject.SetSize(structuringElementSize);
// Create a region object native to the structuringElement type
ImageType::RegionType largestPossibleRegion;
// Resize the region
largestPossibleRegion.SetSize(structuringElementSizeObject);
// Set the largest legal region size (i.e. the size of the whole
structuringElement) to what we just defined
structuringElement->SetLargestPossibleRegion(largestPossibleRegion);
// Set the buffered region
structuringElement->SetBufferedRegion(largestPossibleRegion);
// Set the requested region
structuringElement->SetRequestedRegion(largestPossibleRegion);
// Now allocate memory for the structuringElement
structuringElement->Allocate();

std::cout << "New physical structuringElement allocated\n";

// Initialize the image to hold all 0
itk::ImageRegionIterator<ImageType> it
=itk::ImageRegionIterator<ImageType>(structuringElement,
largestPossibleRegion);

unsigned long numImagePixels = 0;
unsigned char exteriorPixelValue = 0;
for (it.GoToBegin(); !it.IsAtEnd(); ++it)
{
	it.Set(exteriorPixelValue);
	++numImagePixels;
}

//-----Create ellipsoid in structuringElement-----------------

// Ellipsoid spatial function typedef
typedef itk::EllipsoidInteriorExteriorSpatialFunction<Dimension>
EllipsoidFunctionType;

// Create an ellipsoid spatial function for the source image
EllipsoidFunctionType::Pointer spatialFunc = EllipsoidFunctionType::New();

// Define and set the axes lengths for the ellipsoid
EllipsoidFunctionVectorType axes;
axes[0] =1;
axes[1] =1;
axes[2] = 10;
				
			
cout << "Axes:  " << axes << endl;
spatialFunc->SetAxes(axes);

// Define and set the center of the ellipsoid in physical space
EllipsoidFunctionVectorType center;
center[0] = 4.5;
center[1] = 4.5;
center[2] = 4.5;
spatialFunc->SetCenter(center);
std::cout << center << std::endl;

// Define the orientations of the ellipsoid axes, vectors must be normalized  
// (0,1,0) corresponds to the axes of length axes[0]
// (1,0,0) corresponds to the axes of length axes[1]
// (0,0,1) corresponds to the axes of lenght axes[2]
//double data[] = {0, 1, 0, 1, 0, 0, 0, 0, 1};
double data[] ={0.7,-0.7,0,0.408,0.408,-0.816, 0.57735,0.57735,0.57735}; //
I just took an exemple

vnl_matrix<double> orientations(data, 3, 3);

// Set the orientations of the ellipsoids
spatialFunc->SetOrientations(orientations);
//cout<<"spatialfunction"<<spatialFunc<<endl;
typedef   ImageType::IndexType       IndexType;
typedef   IndexType::IndexValueType   IndexValueType;

IndexType seedPos;
seedPos[0] = static_cast<IndexValueType>(center[0]);
seedPos[1] = static_cast<IndexValueType>(center[1]);
seedPos[2] = static_cast<IndexValueType>(center[2]);

itk::FloodFilledSpatialFunctionConditionalIterator<ImageType,
EllipsoidFunctionType>
sfi = itk::FloodFilledSpatialFunctionConditionalIterator<ImageType,
EllipsoidFunctionType>(structuringElement, spatialFunc, seedPos);

// Iterate through the entire image and set interior pixels to 255  
int numInteriorPixels1 = 0;
unsigned char interiorPixelValue = 255;
for (; !sfi.IsAtEnd(); ++sfi)
{
	sfi.Set(interiorPixelValue);
	++numInteriorPixels1;
}
cout << "numInteriorPixels1     :        " << numInteriorPixels1 << endl;

ImageType::PixelType apixel;
int numExteriorPixels = 0; // Number of pixels not filled by spatial
function
int numInteriorPixels2 = 0; // Number of pixels filled by spatial function
int numErrorPixels = 0; // Number of pixels not set by spatial function

ImageType::IndexValueType indexarray[3] = { 0, 0, 0 };

// Iterate through source image and get pixel values and count pixels 
// iterated through, not filled by spatial function, filled by spatial
// function, and not set by the spatial function.
for (unsigned long x = 0; x < xExtent; x++)
{
	for (unsigned long y = 0; y < yExtent; y++)
	{
		for (unsigned long z = 0; z < zExtent; z++)
		{
				indexarray[0] = x;
				indexarray[1] = y;
				indexarray[2] = z;
				ImageType::IndexType index;
				index.SetIndex(indexarray);
				apixel = structuringElement->GetPixel(index);
							
				if (apixel == exteriorPixelValue)
				{
					++numExteriorPixels;
				}
				else
				{
					if (apixel == interiorPixelValue)
					{
						++numInteriorPixels2;
					}
					else
					{
						if (apixel != interiorPixelValue || apixel != exteriorPixelValue)
						{
							++numErrorPixels;
						}
				        }
			        }
		}
	}
}
cout << "numInteriorPixels2      :        " << numInteriorPixels2 << endl;

std::cout << "Number of interior, exterior and error pixels: "
		<< numInteriorPixels2 << ", "
		<< numExteriorPixels << ", "
		<< numErrorPixels << std::endl;
				

// Check to see that number of pixels within ellipsoid are equal 
// for different iteration loops.
int numInteriorPixels;
 if(numInteriorPixels1 == numInteriorPixels2)
{
	std::cerr << "numInteriorPixels1 != numInteriorPixels2" << std::endl;
	return EXIT_FAILURE;
}
else
{
	numInteriorPixels = numInteriorPixels1;
}

// Volume of ellipsoid using V=(4/3)*pi*(a/2)*(b/2)*(c/2)
double ellipsoidVolume = 4.18879013333*(axes[0] / 2)*(axes[1] / 2)*(axes[2]
/ 2);

// Percent difference in volume measurement and calculation.
double volumeError = (fabs(ellipsoidVolume - numInteriorPixels2) /
ellipsoidVolume) * 100;

// Test the center of the ellipsoid which should be within the sphere 
// and return 1.
double testPosition[Dimension];
bool functionValue;
testPosition[0] = center[0];
testPosition[1] = center[1];
testPosition[2] = center[2];
functionValue = spatialFunc->Evaluate(testPosition);

// 20% error was randomly chosen as a successful ellipsoid fill.
// This should actually be some function of the image/ellipsoid size.
if (volumeError > 20 || functionValue == 0)
{
	std::cerr << std::endl << "calculated ellipsoid volume = " <<
ellipsoidVolume << std::endl
			<< "measured ellipsoid volume = " << numInteriorPixels << std::endl
			<< "volume error = " << volumeError << "%" << std::endl
			<< "function value = " << functionValue << std::endl
			<< "itkEllipsoidInteriorExteriorSpatialFunction failed :(" << std::endl;

	return EXIT_FAILURE;
}

else if (numImagePixels != (imageVolume))
{
	// Make sure that the number of pixels iterated through from source image
	// is equal to the pre-defined image size.
	std::cerr << "Number of pixels iterated through in structuringElement = "
			<< numImagePixels << std::endl;
	return EXIT_FAILURE;
}

else
{
	std::cout << std::endl << "calculated ellipsoid volume = " <<
ellipsoidVolume << std::endl
			<< "measured ellipsoid volume = " << numInteriorPixels << std::endl
			<< "volume error = " << volumeError << "%" << std::endl
			<< "function value = " << functionValue << std::endl
			<< "itkEllipsoidInteriorExteriorSpatialFunction ended succesfully!" <<
std::endl;
}














siavashk wrote
> It would help if you pasted your code. I think you might have a small bug
> that you overlooked.
> 
> 
> 
> --
> View this message in context:
> http://itk-insight-users.2283740.n2.nabble.com/itk-EllipsoidInteriorExteriorSpatialFunction-tp7587522p7587523.html
> Sent from the ITK Insight Users mailing list archive at Nabble.com.
> _____________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> 
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.php
> 
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
> 
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/insight-users





--
View this message in context: http://itk-users.7.n7.nabble.com/Re-ITK-users-itk-EllipsoidInteriorExteriorSpatialFunction-tp35851p35864.html
Sent from the ITK - Users mailing list archive at Nabble.com.


More information about the Insight-users mailing list