2013-03-27 105 views
2

我正在使用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輸出始終爲黑色。有誰知道我做錯了什麼。

+0

也許,問題出在圖書館的一個/你VTK建?如果你編譯並運行這個例子 - http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/WritePNG,它是否按預期工作? – 2013-03-28 18:05:46

+0

爲什麼不使用itImageFileWriter來編寫PNG? – 2013-05-13 20:33:57

回答

4

以供將來參考,似乎有很多讀者PNG不顯示16個數據。因此,我在最後做的沒有簽名的演員陣容應該是焦點。

vtkSmartPointer<vtkImageCast> cast2 = vtkSmartPointer<vtkImageCast>::New(); 
cast2->SetInput(grayVTK); 
cast2->SetOutputScalarTypeToChar(); 
cast2->ClampOverflowOn(); 
cast2->Update(); 
+0

感謝它解決了我的問題! – 2013-04-24 11:28:54