Когда я читаю изображение, itk::ImageIOBase
как реализовано Вот, говорит мне, что изображение имеет тип пикселя RGB. Формат изображения — TIFF, но также может быть png или gif.
itk::ImageIOBase::Pointer imageIO =
itk::ImageIOFactory::CreateImageIO(
fileName, itk::ImageIOFactory::ReadMode);
Как узнать, через ITK, является ли изображение на самом деле изображением палитры, то есть скалярное изображение вместе с цветовой палитрой, и читать изображение как скалярное изображение + палитра? Мне нужно получить индекс, как хранится в файле, а также цветовую палитру, используемую в файле.
На данный момент мое единственное решение — использовать freeImagePlus для идентификации и чтения этого типа изображения. Я не нашел ни одной функции в классе ImageIOBase
это может быть связано с этим.
Буду признателен за любую помощь, я не нашел много информации об этом в Интернете!
Вы пытались прочитать это как изображение в градациях серого? Какой результат дает этот читатель без явной настройки ввода-вывода?
typedef itk::Image<unsigned char, 2> uc2Type;
typedef itk::ImageFileReader<uc2Type> ReaderType;
Если вам не нужна цветовая палитра для чего-то, этого может быть достаточно.
Чтобы ответить на мой собственный вопрос, эта функция теперь реализована в ITK, в основной ветке, и предлагает поддержку палитры для изображений png tif и bmp.
Вот рабочий пример, для тех, кому интересно:
#include "itkImage.h"#include <iostream>
#include <string>
#include "itkPNGImageIOFactory.h"#include "itkImageFileReader.h"#include "itkPNGImageIO.h"
int main()
{
std::string filename("testImage_palette.png");
auto io = itk::PNGImageIO::New();
// tell the reader not to expand palette to RGB, if possible
io->SetExpandRGBPalette(false);
typedef unsigned short PixelType;
typedef itk::Image<PixelType, 2> imageType;
typedef itk::ImageFileReader<imageType> ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName(filename);
reader->SetImageIO(io);
try {
reader->Update();
} catch (itk::ExceptionObject &err) {
std::cerr << "ExceptionObject caught !" << std::endl;
std::cerr << err << std::endl;
return EXIT_FAILURE;
}
std::cout<< std::endl << "IsReadAsScalarPlusPalette:" <<io->GetIsReadAsScalarPlusPalette() << std::endl;
if (io->GetIsReadAsScalarPlusPalette()) {
auto palette(io->GetColorPalette());
std::cout<< "palette (size="<< palette.size()<<"):"<< std::endl;
auto m(std::min(static_cast<size_t>(10),palette.size()));
for (size_t i=0; i<m;++i) {
std::cout << "["<<palette[i]<< "]"<< std::endl;
}
if (m< palette.size())
std::cout<< "[...]"<< std::endl;
}
// if io->GetIsReadAsScalarPlusPalette() im will be the index of the palette image
auto im(reader->GetOutput());
}