Hello,
As I mentioned at the TCON, I need to get the GradientImageFilter into
SimpleITK. The problem is that the output of this filter is strongly typed to
be an Image of CovariantVectors and SimpleITK deal will all multi-component
images as the more flexible VectorImages. Not the buffer image buffer is really
exactly the same for the two type, just a bunch of floats, but the levels
abstraction and C++ I don't believe really guarantees this as one is a pointer
to floats for the VectorImages, while the other is an array of CovariantVector
object. The reason that we can't just make the filter work with VectorImages is
because how it's templated:
template< class TInputImage, class TOperatorValueType = float, class
TOutputValueType = float >
class ITK_EXPORT GradientImageFilter:
public ImageToImageFilter< TInputImage,
Image< CovariantVector< TOutputValueType,
::itk::GetImageDimension<
TInputImage >::ImageDimension >,
::itk::GetImageDimension< TInputImage
>::ImageDimension > >
There is just no way to specify the output image type, I suppose I could add a
4th template parameter.
I am looking for other suggestions on how to adapt this class's output for
SimpleITK, or other wise safely convert the output.
I was able to come up with the following efficient, and horrendous hack, but I
don't think I can bare to actually commit it:
template< typename TPixelType, unsigned int ImageDimension >
typename itk::VectorImage< TPixelType, ImageDimension >::Pointer
GetVectorImage( itk::Image< itk::CovariantVector< TPixelType, ImageDimension >,
ImageDimension> *img )
{
typedef itk::Image< itk::CovariantVector< TPixelType, ImageDimension >,
ImageDimension> ImageType;
typedef itk::VectorImage< TPixelType, ImageDimension > VectorImageType;
SizeValueType numberOfElements = img->GetBufferedRegion().GetNumberOfPixels();
img->GetPixelContainer()->SetImportPointer(
img->GetPixelContainer()->GetBufferPointer(), numberOfElements, false );
// It appears that the Covararient vector neither is POD nor does it
// have a trivial copy constructor. So this really is a hack and
// guaranteed to work.
//sitkStaticAssert( std::tr1::has_trivial_copy<typename
ImageType::PixelType>::value, "Assumption on CovarientVector violated!" ;)
//sitkStaticAssert( std::tr1::is_pod<typename ImageType::PixelType>::value,
"Assumption on CovarientVector violated!" ;)
typename VectorImageType::InternalPixelType* buffer
= reinterpret_cast<typename VectorImageType::InternalPixelType*>(
img->GetPixelContainer()->GetBufferPointer() );
// Unlike an image of CovarientVector a VectorImage's container is a
// container of TPixelType, whos size is the image's number of
// pixels * number of pixels per component
numberOfElements *= ImageDimension;
typename VectorImageType::Pointer out = VectorImageType::New();
// Set the image's pixel container to import the pointer provided.
out->GetPixelContainer()->SetImportPointer(buffer, numberOfElements, true );
out->CopyInformation( img );
out->SetRegions( img->GetBufferedRegion() );
return out;
}
Thanks for your suggestions
Brad
========================================================
Bradley Lowekamp
Medical Science and Computing for
Office of High Performance Computing and Communications
National Library of Medicine
[email protected]
_______________________________________________
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://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://www.itk.org/mailman/listinfo/insight-developers