[vtkusers] Displaying a 2D image as a volume
J.S.Wijnhout at lumc.nl
J.S.Wijnhout at lumc.nl
Wed Feb 27 10:55:43 EST 2008
Hi,
Thanks for the suggestion, that actually worked! I'm not sure what is
wrong with my original approach (a bug perhaps?), but padding the image
with transparent voxels work. For those of you who have the same
problem:
double minValue = _image->GetScalarTypeMax ();
double maxValue = _image->GetScalarTypeMin ();
// This is a custom function to determine the min/max gray values:
DetermineMinMax ( _image, minValue, maxValue );
vtkImageShiftScale *scaler = vtkImageShiftScale::New ();
scaler->SetInput ( _image );
scaler->SetOutputScalarTypeToUnsignedChar ();
// Map to [1,255], the value 0 is reserved for a transparency hack:
int delta = maxValue - minValue;
scaler->SetShift ( ( delta / 254.0 ) - minValue );
scaler->SetScale ( 254.0 / delta );
vtkImageConstantPad *padder = vtkImageConstantPad::New ();
int extent [ 6 ];
_image->GetExtent ( extent );
extent [ 2 ] = 3;
extent [ 5 ] = 3;
padder->SetOutputWholeExtent ( extent );
padder->SetInput ( scaler->GetOutput () );
padder->SetConstant ( 0.0 );
// Modify the transfer functions such that pixel value 0 (the
// value the image is padded with in the z-dimension) corresponds to
a
// completely transparent voxel and value 1 to pure black:
vtkPiecewiseFunction *opacityTransferFunction =
vtkPiecewiseFunction::New ();
opacityTransferFunction->AddPoint ( 0, 0.0 );
opacityTransferFunction->AddPoint ( 0.5, 1.0 );
opacityTransferFunction->AddPoint ( 1, 1.0 );
opacityTransferFunction->AddPoint ( 255, 1.0 );
vtkColorTransferFunction *colorTransferFunction =
vtkColorTransferFunction::New ();
colorTransferFunction->AddRGBPoint ( 0, 0.0, 0.0, 0.0 );
colorTransferFunction->AddRGBPoint ( 1, 0.0, 0.0, 0.0 );
colorTransferFunction->AddRGBPoint ( 255, 1.0, 1.0, 1.0 );
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New ();
volumeProperty->SetColor ( colorTransferFunction );
volumeProperty->SetScalarOpacity ( opacityTransferFunction );
vtkVolumeRayCastCompositeFunction *rayCastFunction =
vtkVolumeRayCastCompositeFunction::New ();
vtkVolumeRayCastMapper *hiResVolumeMapper =
vtkVolumeRayCastMapper::New ();
hiResVolumeMapper->SetInput ( padder->GetOutput () );
hiResVolumeMapper->SetVolumeRayCastFunction ( rayCastFunction );
vtkVolume *volume = vtkVolume::New ();
volume->SetProperty ( volumeProperty );
volume->SetMapper ( hiResVolumeMapper );
best,
Jeroen
More information about the vtkusers
mailing list