如何使用 ITK 将调色板图像读取为标量图像?
How to read a palette image as a scalar image with ITK?
当我读取图像时,itk::ImageIOBase
实现 here 告诉我图像具有 RGB 像素类型。图片格式为TIFF,也可以是png或gif。
itk::ImageIOBase::Pointer imageIO =
itk::ImageIOFactory::CreateImageIO(
fileName, itk::ImageIOFactory::ReadMode);
如何通过 ITK 知道图像是否实际上是调色板图像,即 标量图像和调色板,并将图像读取为标量图像 + 调色板?我需要检索存储在文件中的索引以及文件中使用的调色板。
目前,我唯一的解决办法是使用freeImagePlus 来识别和读取这种类型的图像。我没有在 class ImageIOBase
中找到任何与此相关的函数。
任何帮助将不胜感激,我在互联网上没有找到太多这方面的信息!
你试过把它读成灰度图吗?这个 reader 在没有明确设置 IO 的情况下会产生什么结果?
typedef itk::Image<unsigned char, 2> uc2Type;
typedef itk::ImageFileReader<uc2Type> ReaderType;
除非您需要调色板,否则这就足够了。
为了回答我自己的问题,该功能现已在 ITK 的 master 分支中实现,并为 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());
}
当我读取图像时,itk::ImageIOBase
实现 here 告诉我图像具有 RGB 像素类型。图片格式为TIFF,也可以是png或gif。
itk::ImageIOBase::Pointer imageIO =
itk::ImageIOFactory::CreateImageIO(
fileName, itk::ImageIOFactory::ReadMode);
如何通过 ITK 知道图像是否实际上是调色板图像,即 标量图像和调色板,并将图像读取为标量图像 + 调色板?我需要检索存储在文件中的索引以及文件中使用的调色板。
目前,我唯一的解决办法是使用freeImagePlus 来识别和读取这种类型的图像。我没有在 class ImageIOBase
中找到任何与此相关的函数。
任何帮助将不胜感激,我在互联网上没有找到太多这方面的信息!
你试过把它读成灰度图吗?这个 reader 在没有明确设置 IO 的情况下会产生什么结果?
typedef itk::Image<unsigned char, 2> uc2Type;
typedef itk::ImageFileReader<uc2Type> ReaderType;
除非您需要调色板,否则这就足够了。
为了回答我自己的问题,该功能现已在 ITK 的 master 分支中实现,并为 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());
}