Как прочитать изображение палитры как скалярное изображение с помощью ITK?

Когда я читаю изображение, itk::ImageIOBaseкак реализовано Вот, говорит мне, что изображение имеет тип пикселя RGB. Формат изображения — TIFF, но также может быть png или gif.

itk::ImageIOBase::Pointer imageIO =
itk::ImageIOFactory::CreateImageIO(
fileName, itk::ImageIOFactory::ReadMode);

Как узнать, через ITK, является ли изображение на самом деле изображением палитры, то есть скалярное изображение вместе с цветовой палитрой, и читать изображение как скалярное изображение + палитра? Мне нужно получить индекс, как хранится в файле, а также цветовую палитру, используемую в файле.

На данный момент мое единственное решение — использовать freeImagePlus для идентификации и чтения этого типа изображения. Я не нашел ни одной функции в классе ImageIOBase это может быть связано с этим.

Буду признателен за любую помощь, я не нашел много информации об этом в Интернете!

0

Решение

Вы пытались прочитать это как изображение в градациях серого? Какой результат дает этот читатель без явной настройки ввода-вывода?

typedef itk::Image<unsigned char, 2> uc2Type;
typedef itk::ImageFileReader<uc2Type> ReaderType;

Если вам не нужна цветовая палитра для чего-то, этого может быть достаточно.

0

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

Чтобы ответить на мой собственный вопрос, эта функция теперь реализована в 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());
}
0

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