[vtkusers] Volume rendering example

Lodron, Gerald Gerald.Lodron at joanneum.at
Wed Oct 28 07:00:32 EDT 2009


Hi

OK, now i do it like in SimpleRayCast but I have the following problem: The vtkVolumeRayCastMapper does not take my data (only unsigned char allowed, i have signed things). So I must first rescale my data between 0 and 1 into a unsigned char format using a lookup table:

vtkLookupTable *table = vtkLookupTable::New();
table->SetSaturationRange(0,0);
table->SetRange(-1500, 2500);  //All necessary information is between -1500 and 2500
table->SetValueRange(0,1);     //And is scaled between 0 and 1
table->SetRampToLinear();
table->Build();

vtkImageMapToColors *color = vtkImageMapToColors::New();
color->SetLookupTable(table);
color->SetInputConnection(data->GetProducerPort());

So, now I want to display bones in white, bones have usually a value between 500 and 1500, because of the scaling between 0 and 1 I must calculate the new mapped data:

double bone_begin = ((500-(-1500))/(2500-(-1500)));
double bone_end =  ((1500-(-1500))/(2500-(-1500)));

Now I can make the volume rendering stuff:

vtkPiecewiseFunction *opacityTransferFunction=vtkPiecewiseFunction::New();
opacityTransferFunction->AddPoint(0,0.0);
opacityTransferFunction->AddPoint(bone_begin,0);
opacityTransferFunction->AddPoint(bone_begin+0.01,0.2);
opacityTransferFunction->AddPoint(bone_end,0.2);
opacityTransferFunction->AddPoint(bone_end+0.01/255,0);
opacityTransferFunction->AddPoint(1,0);

vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New(); //bones are white
colorTransferFunction->AddRGBPoint(0,1.0,1.0,1.0);
colorTransferFunction->AddRGBPoint(1,1.0,1.0,1.0);	
		
vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
volumeProperty->SetColor(colorTransferFunction);
volumeProperty->SetScalarOpacity(opacityTransferFunction);
volumeProperty->SetInterpolationTypeToLinear();

vtkVolumeRayCastCompositeFunction  *compositeFunction = vtkVolumeRayCastCompositeFunction::New();
vtkVolumeRayCastMapper *volumeMapper=vtkVolumeRayCastMapper::New();
volumeMapper->SetVolumeRayCastFunction(compositeFunction);
volumeMapper->SetInputConnection(color->GetOutputPort());

vtkVolume *volume=vtkVolume::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
		
m_Renderer->AddVolume(volume);

m_Renderer->Render();

All I get is a cube with white noisy points. What is wrong with my settings?

Thanks and best regards
 
Gerald
________________________________

Von: Martin Schmitz [mailto:meindatenlaufwerk at googlemail.com] 
Gesendet: Mittwoch, 28. Oktober 2009 10:50
An: Lodron, Gerald
Betreff: Re: [vtkusers] Volume rendering example


hallo Gerald,

look in  in the vtk Source directory under "\Examples\VolumeRendering\Python" you find a file "SimpleRayCast" it shows a simple volume rendering example. You find  an another color transfer function. May this help you.
 

2009/10/28 Lodron, Gerald <Gerald.Lodron at joanneum.at>


	Hi,
	
	I want to render a volume using VTK but i have some problems, may anyone can help me a little bit:
	I have a 3d volume of a human CT scan, the range is in hountsfield units so we have signed char. I want to render it like in "The Visualization Toolkit - Will Schroeder, Ken Martin, Bill Lorensen" book on page 233 but the author does not provide any code of his results (also not on the CD).
	
	//First get the range of my image
	double *range = data->GetScalarRange();
	//Scale the image between 0 and 1 using a lookup table
	vtkLookupTable *table = vtkLookupTable::New();
	table->SetValueRange(0,1);
	table->SetSaturationRange(0,0);
	table->SetRange(range[0], range[1]); //shoul here not be the minimum/maximum possible of "data"?
	table->SetRampToLinear();
	table->Build();
	
	// Map the image through the lookup table
	vtkImageMapToColors *color = vtkImageMapToColors::New();
	color->SetLookupTable(table);
	color->SetInputConnection(data->GetProducerPort());
	
	//The opacity function should map the data from invisible to visible
	vtkPiecewiseFunction *opacityTransferFunction=vtkPiecewiseFunction::New();
	opacityTransferFunction->AddPoint(0,0.0);
	opacityTransferFunction->AddPoint(1,0.2);       //should it be (1,0.2) or (255, 0.2)? Shouldnt it be like table->SetValueRange(0,1)?
	
	//Color the image from black to white, does anybody has some good color functions for me??
	vtkColorTransferFunction *colorTransferFunction = vtkColorTransferFunction::New();
	colorTransferFunction->AddRGBPoint(0,0.0,0.0,0.0);
	colorTransferFunction->AddRGBPoint(1,1.0,1.0,1.0);
	
	//Generate a volume Property
	vtkVolumeProperty *volumeProperty = vtkVolumeProperty::New();
	volumeProperty->SetColor(colorTransferFunction);
	volumeProperty->SetScalarOpacity(opacityTransferFunction);
	volumeProperty->SetInterpolationTypeToLinear();
	
	//I do not exactly know what this stuff does but it renders:
	vtkVolumeRayCastCompositeFunction *compositeFunction = vtkVolumeRayCastCompositeFunction::New();
	vtkVolumeRayCastMapper *volumeMapper=vtkVolumeRayCastMapper::New();
	volumeMapper->SetInputConnection(color->GetOutputPort());
	volumeMapper->SetVolumeRayCastFunction(compositeFunction);
	
	vtkLODProp3D *prop = vtkLODProp3D::New();
	prop->AddLOD(volumeMapper,volumeProperty, 0.0);
	m_Renderer->AddViewProp(prop);
	
	m_Renderer->Render();
	
	Does this code seems right? I only see a strange cube
	
	_______________________________________________
	Powered by www.kitware.com
	
	Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
	
	Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
	
	Follow this link to subscribe/unsubscribe:
	http://www.vtk.org/mailman/listinfo/vtkusers
	





More information about the vtkusers mailing list