vtkImageData如何存储多个组件以及如何呈现它

时间:2014-02-19 05:50:05

标签: vtk

我一直在使用带有一个组件的vtkImageData进行体积渲染。现在我想基于现有的vtkImageData创建一个新的vtkImageData。新的vtkImageData有两个组件,第一个组件存储与现有标量数据相同的标量数据,第二个组件存储我将分配的数据。我的代码片段是这样的:

// I read a series of dicom file:
vtkImageData *originalData = reader->GetOutput(); 
int dim[3];
double spa[3], ori[3];
originalData->GetDimensions(dim);
originalData->GetSpacing(spa);
originalData->GetOrigin(ori);

//newData is created based on the originalData's dimensions spacing and origin.
vtkImageData *newData = vtkImagaData::New();
newData->SetDimensions(dim);
newData->SetScalarTypeToShort();
newData->SetSpacing(spa);
newData->SetNumberOfScalarComponents(2);//newData's component is two
newData->SetOrigin(ori);
newData->AllocateScalars();

//Now I have some puzzles:How does the vtkImageData store multiple components, I think it store data one point by one point, because each point now have two components, so it looks like this in memory: Point1(component1, component2), Point2(component1, component2), Point3.... is it right???
//Then I traverse the new data and assign each component of each point
short *originalDataPointer = (short *)originalData->GetScalarPointer();
short *newDataPointer = (short *)newData->GetScalarPointer();
for(int i = 0; i < dim[0]*dim[1]*dim[2]; i++){
    //I assign each point's first component and second component the same data as the original data.
    originalDataPointer[i*2] = newDataPointer[i];
    originalDataPointer[i*2 + 1] = newDataPointer[i];
}

vtkSmartPointer<vtkColorTransferFunction> colorTransferFunction =
    vtkSmartPointer<vtkColorTransferFunction>::New();
colorTransferFunction->AddRGBPoint(0.0, 0.0, 0.5, 0.0);
colorTransferFunction->AddRGBPoint(60.0, 1.0, 0.0, 0.0);
colorTransferFunction->AddRGBPoint(128.0, 0.2, 0.1, 0.9);
colorTransferFunction->AddRGBPoint(196.0, 0.27, 0.21, 0.1);
colorTransferFunction->AddRGBPoint(255.0, 0.8, 0.8, 0.8);
vtkSmartPointer<vtkPiecewiseFunction> piecewiseFunction =
    vtkSmartPointer<vtkPiecewiseFunction>::New();
piecewiseFunction->AddPoint(20, 0.0);
piecewiseFunction->AddPoint(120, 0.1);
piecewiseFunction->AddPoint(255, 0.2);
vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> fixedPointVolumeRayCastMapper =
    vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
fixedPointVolumeRayCastMapper->SetNumberOfThreads(1);

fixedPointVolumeRayCastMapper->SetInput(newData);
vtkSmartPointer<vtkVolumeProperty> volumeProperty =
    vtkSmartPointer<vtkVolumeProperty>::New();
//I want to use the first component as the input of opacity transfer function
volumeProperty->SetScalarOpacity(0, piecewiseFunction);
// I want to use the second component as the input of color transfer function
volumeProperty->SetColor(1, colorTransferFunction);

vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(fixedPointVolumeRayCastMapper);
volume->SetProperty(volumeProperty);

vtkSmartPointer<vtkOpenGLRenderer> renderer = vtkSmartPointer<vtkOpenGLRenderer>::New();
renderer->AddVolume(volume);
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
renWin->Render(); 

体绘制的结果与原始数据的结果不同,原始数据只有一个具有相同传递函数的分量。结果应该不一样吗?

每个像素都有两个组件,第一个确定它的不透明度,第二个确定它的颜色,我应该怎么做?

1 个答案:

答案 0 :(得分:2)

如果有人仍然关心:你必须切换&#34;独立组件&#34;关闭。

volumeProperty->IndependentComponentsOff()

默认设置为开启。

还设置第一个颜色功能:

volumeProperty->SetColor(colorTransferFunction); // not SetColor(1,...

来自http://www.vtk.org/doc/release/5.10/html/classvtkVolumeProperty.html

数据是否具有独立的组件,还是仅定义一些颜色?如果IndependentComponents为On(默认值),则每个组件将独立地通过查找表来确定RGBA,阴影。某些卷Mappers可以处理1到4个组件的unsigned char或unsigned short数据(请参阅每个mapper头文件以确定功能)。如果IndependentComponents为Off,则必须具有2或4个组件数据。 对于2个分量数据,第一个通过第一个颜色传递函数,第二个分量通过第一个不透明度传递函数。法线将从第二个分量生成。对于4个分量数据,前三个将直接表示RGB(无查找表)。第四个组件将通过不透明度的第一个标量不透明度传递函数。法线将从第四个组件生成。