itk中有个类叫做itkCosImageFilter,是将图像中每个点做cos变换。可能大家现在还不知道有什么用,那么本文只谈实现,不谈应用场景。
使用方法:
typedef itk::CosImageFilter< ImageType, ImageType > FilterType;
FilterType::Pointer filter = FilterType::New();
filter->SetInput( input_image );
filter->Update();
itk封装好的类,使用方法基本都和vtk中类似,多了一个预先定于图像数据格式ImageType。接下来看实现方法:
思路就是把大象放到冰箱里,分4步:
1.将输入图像的像素类型转换成double
2.每个像素值做cos变换
3.将double类型的结果值转换成输出图像对应的像素类型
4.将转换后的值写入输出图像
1.将输入图像的像素类型转换成double
2.每个像素值做cos变换
3.将double类型的结果值转换成输出图像对应的像素类型
4.将转换后的值写入输出图像
itk中的数学方法引用自第三方库:vxl,vxl(Vision-something-Libraries)是为计算机视觉研究和实现而设计的C++库集合。vcl是vxl中的一部分,首先定义一个Cos模版类:
namespace Functor {
template< class TInput, class TOutput>//定义模版类的输入输出
class Cos
{
public:
Cos() {};//构造函数
~Cos() {};//析构函数
bool operator!=( const Cos & ) const//运算符号!=重载
{
return false;
}
bool operator==( const Cos & other ) const//运算符号==重载
{
return !(*this != other);
}
inline TOutput operator()( const TInput & A ) const//内联函数
{
return static_cast<TOutput>(vcl_cos( static_cast<double>(A)) );
}
};
}
cos这个类中并没有什么实际的实现,它继承自类itkUnaryFunctorImageFilter,而itkUnaryFunctorImageFilter 中的实现就是遍历并计算输入图像中的每个像素,而方法就是N维循环(并没有黑科技。。。)。继承的优点在这里就凸显了出来,子类中只需要输入像素变换的方法即可。不忘初心,方得始终。念念不忘,必有回响。
----这句话写给那些和我一样还怀揣着梦想的人
参考文献:
1. https://itk.org/Doxygen312/html/classitk_1_1CosImageFilter.html
1. https://itk.org/Doxygen312/html/classitk_1_1CosImageFilter.html