我目前正在开发一款图像处理应用程序,主要基于C++和ITK。
1. 现状
我有一些节点类(例如FlipFilter
),它们都从同一个基类派生而来。每个节点会得到一个包含image_ptr
和所有元信息(图像维度、PixelType
(例如RGB、RGBA、标量)和ComponentType
(例如Float、int))的结构体。节点必须根据这些Meta-Informations
实例化一个ITK-Filter
,这些信息可以在每个输入图像上更改。
2. 问题
这些ITK-Filters
需要以模板参数的形式传递ImageType
(例如带有ComponentType UCHAR
的RGB)。模板类必须在编译时实例化。我的节点在运行时获取图像及其类型。因此,我需要为每个节点创建所有过滤器的所有排列,然后使用适当的实例化。
3. 我目前的解决方案
这个结构体包含了所有的元信息和指向实际图像的智能指针。我使用了图像的基指针,因为图像本身也是一个模板(稍后我会进行向下转换)。
struct ImageData
{
short NumberOfDimensions;
itk::ImageIOBase::IOComponentType ComponentType;
itk::ImageIOBase::IOPixelType PixelType;
itk::DataObject::Pointer Image;
ImageData() {}
~ImageData() {}
};
这是我的Node更新功能。它应该创建筛选器并在图像上执行它。
void LitkFlipImageFilter::update()
{
if (Input1 == nullptr)
throw(std::runtime_error("Input1 not set"));
Input1->update();
ImageData Input1Data = Input1->getOutput();
switch (Input1Data.PixelType)
{
default:
{
throw std::runtime_error("Type not Supported");
break;
}
case itk::ImageIOBase::RGB:
{
switch (Input1Data.ComponentType)
{
default:
{
throw std::runtime_error("Type not Supported");
break;
}
case itk::ImageIOBase::IOComponentType::UCHAR:
{
using PixelType = itk::RGBPixel< unsigned char >;
using ImageType = itk::Image < PixelType, 2 >;
itk::FlipImageFilter<ImageType>::Pointer filter = itk::FlipImageFilter<ImageType>::New();
//do stuff
break;
}
break;
}
}
}
}
4. 我的解决方案存在问题
虽然我的解决方案可以工作,但它会产生大量重复的代码和嵌套很深的switch语句。您是否知道更加优雅的解决方案呢?
谢谢!