3d 用于体渲染的vtkgdcmimagereader
我想读一系列2D dicom图像。然后,我将它显示为三维体积。为此,我遵循以下步骤: 1-ipp分拣机 2-设置文件名 3-vtkimagechangeinformation 在这些之后,我尝试使用vtkimageviewer2将它们可视化。 我几乎发送了我写的所有代码。我很确定它会加载和排序图像。但它给出了一个错误,比如 排序成功:0.5 排序成功:1.5 程序意外地完成了 这是我的密码:3d 用于体渲染的vtkgdcmimagereader,3d,vtk,dicom,volume-rendering,gdcm,3d,Vtk,Dicom,Volume Rendering,Gdcm,我想读一系列2D dicom图像。然后,我将它显示为三维体积。为此,我遵循以下步骤: 1-ipp分拣机 2-设置文件名 3-vtkimagechangeinformation 在这些之后,我尝试使用vtkimageviewer2将它们可视化。 我几乎发送了我写的所有代码。我很确定它会加载和排序图像。但它给出了一个错误,比如 排序成功:0.5 排序成功:1.5 程序意外地完成了 这是我的密码: vtkGDCMImageReader *dicomReader = vtkGDCMImageReader
vtkGDCMImageReader *dicomReader =
vtkGDCMImageReader::New();
std::vector<std::string> filenames;
const char *filename = "/home/telemed/Downloads/Dentascan";
gdcm::Directory d;
d.Load( filename, false);
filenames = d.GetFilenames();
gdcm::IPPSorter s;
s.SetComputeZSpacing( true );
s.SetZSpacingTolerance( 1e-3 );
bool b = s.Sort( filenames );
if( !b )
{
std::cerr << "Failed to sort:" << "s" << std::endl;
return 1;
}
std::cout << "Sorting succeeded:" << s.GetZSpacing() << std::endl;
//s.Print( std::cout );
const std::vector<std::string> & sorted = s.GetFilenames();
vtkStringArray *files =vtkStringArray::New();
std::vector< std::string >::const_iterator it = sorted.begin();
for( ; it != sorted.end(); ++it)
{
const std::string &f = *it;
files->InsertNextValue( f.c_str() );
}
dicomReader->SetFileNames( files );
//dicomReader->Update();
vtkImageChangeInformation *changer =
vtkImageChangeInformation::New();
changer->SetInputConnection(dicomReader->GetOutputPort());
changer->SetOutputSpacing(VTK_DOUBLE_MAX,VTK_DOUBLE_MAX, 2.0);
changer->Update();
vtkInteractorStyleImage *imageStyle =vtkInteractorStyleImage::New();
vtkRenderWindowInteractor *interactor =vtkRenderWindowInteractor::New();
/ Calculate the center of the volume
dicomReader->GetOutput()->UpdateInformation();
int extent[6];
double spacing[3];
double origin[3];
dicomReader->GetOutput()->GetWholeExtent(extent);
dicomReader->GetOutput()->GetSpacing(spacing);
dicomReader->GetOutput()->GetOrigin(origin);
spacing[2] = 1.5;
vtkImageData* image = vtkImageData ::New();
image->SetSpacing(spacing);
std::cout << "Sorting succeeded:" << spacing[2] << std::endl;
double center[3];
center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);
// Matrices for axial, coronal, sagittal, oblique view orientations
static double axialElements[16] = {
1, 0, 0, center[0],
0, 1, 0, center[1],
0, 0, 1, center[2],
0, 0, 0, 1 };
static double coronalElements[16] = {
1, 0, 0, center[0],
0, 0, 1, center[1],
0,-1, 0, center[2],
0, 0, 0, 1 };
static double sagittalElements[16] = {
0, 0,-1, center[0],
1, 0, 0, center[1],
0,-1, 0, center[2],
0, 0, 0, 1 };
// Set the slice orientation
vtkMatrix4x4 *resliceAxes = vtkMatrix4x4::New();
resliceAxes->DeepCopy(coronalElements);
vtkImageReslice *Reslice = vtkImageReslice::New();
Reslice->SetInputConnection(changer->GetOutputPort());
Reslice->SetOutputDimensionality(3);
Reslice->SetResliceAxes(resliceAxes);
Reslice->SetInterpolationModeToLinear();
vtkImageViewer2 *viewer = vtkImageViewer2::New();
viewer->SetupInteractor(interactor);
viewer->SetSize(500,500);
viewer->SetColorWindow(1024);
viewer->SetColorLevel(800);
viewer->SetInputConnection(Reslice->GetOutputPort());
// Create a greyscale lookup table
vtkLookupTable *table = vtkLookupTable::New();
table->SetRange(0, 200); // image intensity range
table->SetValueRange(0.0, 1.0); // from black to white
table->SetSaturationRange(0.0, 0.0); // no color saturation
table->SetRampToLinear();
table->Build();
// Map the image through the lookup table
vtkImageMapToColors *color = vtkImageMapToColors::New();
color->SetLookupTable(table);
color->SetInputConnection(Reslice->GetOutputPort());
// Display the image
vtkImageActor *actor = vtkImageActor::New();
actor->SetInput(color->GetOutput());
vtkRenderer *renderer = vtkRenderer::New();
renderer->AddActor(actor);
vtkRenderWindow *window = vtkRenderWindow::New();
window->AddRenderer(renderer);
interactor->SetInteractorStyle(imageStyle);
window->SetInteractor(interactor);
window->Render();
interactor->Start();
vtkGDCMImageReader*dicomReader=
vtkGDCMImageReader::New();
std::矢量文件名;
const char*filename=“/home/telemed/Downloads/Dentascan”;
gdcm::目录d;
d、 加载(文件名,false);
filenames=d.GetFilenames();
gdcm::IPPS分拣机;
s、 设置间距(真);
s、 设置间隙公差(1e-3);
bool b=s.Sort(文件名);
如果(!b)
{
std::cerr GetOutputPort());
变换器->设置输出间距(VTK_DOUBLE_MAX,VTK_DOUBLE_MAX,2.0);
更改器->更新();
VTKInteratorStyleImage*imageStyle=VTKInteratorStyleImage::New();
vtkRenderWindowInteractor*interactor=vtkRenderWindowInteractor::New();
/计算体积的中心
dicomReader->GetOutput()->UpdateInformation();
整数范围[6];
双间距[3];
双原点[3];
dicomReader->GetOutput()->GetWholeExtent(范围);
dicomReader->GetOutput()->GetSpacing(间距);
dicomReader->GetOutput()->GetOrigin(原点);
间距[2]=1.5;
vtkImageData*image=vtkImageData::New();
图像->设置间距(间距);
std::cout GetOutputPort());
Reslice->setOutputDimensional(3);
Reslice->SetResliceAxes(resliceAxes);
Reslice->SetInterpolationModeToLinear();
vtkImageViewer2*viewer=vtkImageViewer2::New();
查看器->设置交互器(交互器);
查看器->设置大小(500500);
查看器->设置颜色窗口(1024);
查看器->设置颜色级别(800);
查看器->设置输入连接(Reslice->GetOutputPort());
//创建灰度查找表
vtkLookupTable*table=vtkLookupTable::New();
表->设置范围(0200);//图像强度范围
table->SetValueRange(0.0,1.0);//从黑到白
表->设置饱和度范围(0.0,0.0);//无颜色饱和度
表->SetRampToLinear();
表->构建();
//通过查找表映射图像
vtkimageaptocolors*color=vtkimageaptocolors::New();
颜色->可设置查找(表格);
color->SetInputConnection(Reslice->GetOutputPort());
//显示图像
vtkImageActor*actor=vtkImageActor::New();
actor->SetInput(color->GetOutput());
vtkrender*renderer=vtkrender::New();
渲染器->AddActor(actor);
vtkRenderWindow*window=vtkRenderWindow::New();
窗口->添加渲染器(渲染器);
interactor->SetInteractorStyle(imageStyle);
窗口->设置交互器(交互器);
窗口->渲染();
交互器->开始();
感谢您的帮助。您能否尝试简化代码并确定问题的来源。使用分而治之的方法。注释掉代码的后半部分,重新编译并运行它。尝试实现VTK_GDCMP