VTKPNGWriter打印出黑色图像?
问题描述:
我正在使用ITK进行一些图像处理,然后使用VTK以.png格式打印结果,但输出图像始终为黑色。VTKPNGWriter打印出黑色图像?
目前,我使用itk :: ImagetoVTKImageFilter(typedeffed to ITKtoVTKFilterType in the code)将itk :: Image转换为vtk :: vtkImageData。
ITKtoVTKFilterType::Pointer itk2vtkGray = ITKtoVTKFilterType::New();
itk2vtkGray->SetInput(grayBinary); //grayBinary is of type itk::Image<unsigned short, 2>
itk2vtkGray->Update();
vtkSmartPointer<vtkImageData> grayVTK = vtkSmartPointer<vtkImageData>::New();
grayVTK->SetExtent(extent);
grayVTK->SetSpacing(m_spacing);
grayVTK->SetScalarTypeToUnsignedShort();
grayVTK->SetNumberOfScalarComponents(1);
grayVTK->AllocateScalars();
grayVTK->DeepCopy(static_cast<vtkImageData*>(itk2vtkGray->GetOutput()));
//grayVTK = itk2vtkGray->GetOutput();
我甚至使用下面的代码证实我的VTK ImageData包含值为255或0。
int *dims = grayVTK->GetDimensions();
std::cout << "Dims: " << " x: " << dims[0] << " y: " << dims[1] << " z: " << dims[2] << std::endl;
std::cout << "Number of points: " << grayVTK->GetNumberOfPoints() << std::endl;
std::cout << "Number of cells: " << grayVTK->GetNumberOfCells() << std::endl;
for (int y = 0; y < dims[1]; y++)
{
for (int x = 0; x < dims[0]; x++)
{
unsigned short *pixel = static_cast<unsigned short*>(grayVTK->GetScalarPointer(x,y,0));
std::cout << "PIXEL LOC/VAL "<< y*dims[0] + x << " " << pixel[0] <<std::endl;
}
std::cout << std::endl;
}
然后我继续做一个ImageCast,以确保数据的类型是unsignedShort的。
vtkSmartPointer<vtkImageCast> cast2 = vtkSmartPointer<vtkImageCast>::New();
cast2->SetInput(grayVTK);
cast2->SetOutputScalarTypeToUnsignedShort();
cast2->ClampOverflowOn();
cast2->Update();
然后最后我用vtkPNGwriter输出.png文件。请注意,我试图输出实际的vtkImageData以及ImageCastFilter的输出。
vtkSmartPointer<vtkPNGWriter> writer =
vtkSmartPointer<vtkPNGWriter>::New();
writer->SetFileName(filename.toStdString().c_str());
writer->SetInputConnection(cast2->GetOutputPort());
//writer->SetInput(grayVTK); I have tried to method as well but to no success
writer->Write();
但是,.png输出始终为黑色。有谁知道我做错了什么。
答
以供将来参考,似乎有很多读者PNG不显示16个数据。因此,我在最后做的没有签名的演员阵容应该是焦点。
vtkSmartPointer<vtkImageCast> cast2 = vtkSmartPointer<vtkImageCast>::New();
cast2->SetInput(grayVTK);
cast2->SetOutputScalarTypeToChar();
cast2->ClampOverflowOn();
cast2->Update();
+0
感谢它解决了我的问题! – 2013-04-24 11:28:54
也许,问题出在图书馆的一个/你VTK建?如果你编译并运行这个例子 - http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/WritePNG,它是否按预期工作? – 2013-03-28 18:05:46
为什么不使用itImageFileWriter来编写PNG? – 2013-05-13 20:33:57