VTKPNG, Печатает ли черные изображения?

Я выполняю некоторую обработку изображений с использованием ITK, а затем использую VTK для печати результатов в формате .png, однако выходное изображение всегда черное.

В настоящее время я конвертирую itk :: Image в vtk :: vtkImageData, используя itk :: ImagetoVTKImageFilter (typedeffed для ITKtoVTKFilterType в моем коде).

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 всегда черный. Кто-нибудь знает, что я делаю не так.

3

Решение

Для дальнейшего использования кажется, что многие читатели PNG не отображают 16-битные данные. Следовательно, кастинг, который я делал на unsigned short в конце, должен был быть на char.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]