ITK-基于itkUnaryFunctorImageFilter实现图像反转
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
原理
itkUnaryFunctorImageFilter是 ITK(Insight Segmentation and Registration Toolkit)中的一个模板类,它并不是一个函数。这个类用于对图像中的每个像素应用一个一元函数(即只接受一个输入参数并返回一个输出值的函数),从而生成一个新的图像。它在图像的逐像素处理中非常有用,例如图像灰度变换、阈值化、对比度调整等操作。
通过遍历输入图像的每个像素,将每个像素值作为输入传递给用户定义的一元函数对象(functor)。这个函数对象根据特定的算法对输入像素值进行处理,并返回一个新的像素值。这些新的像素值被组合成一个新的输出图像,输出图像的大小、维度和空间信息与输入图像相同。
而图像反转就是将像素黑变白,白变黑,假设像素数值范围0-255,就用函数y=255-x即可实现反转。
本文介绍如何用itkUnaryFunctorImageFilter实现图像反转。
环境准备
参见:Windows下用CMake编译ITK及配置测试_itk配置-CSDN博客
功能解析
1.引入必要的头文件:
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkUnaryFunctorImageFilter.h>
#include <itkPNGImageIOFactory.h>
2.定义一元模板函数:
// 定义像素值反转的函数对象
template <typename TInputPixel>
struct InvertPixelFunctor
{
using InputPixelType = TInputPixel;
using OutputPixelType = TInputPixel;
OutputPixelType operator()(const InputPixelType &input) const
{
return static_cast<OutputPixelType>(255 - input);
}
};
3.初始化:
// 定义图像类型
typedef itk::Image<unsigned char, 2> CharImageType;
typedef itk::ImageFileReader<CharImageType> ReaderType;
typedef itk::ImageFileWriter<CharImageType> WriterType;
// 注册 PNG 格式支持
itk::PNGImageIOFactory::RegisterOneFactory();
// 创建读取器和写入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
// 设置要读取和写入的文件
reader->SetFileName("BrainProtonDensitySlice.png");
writer->SetFileName("inverted_image.png");
4.创建像素值反转滤波器:
// 创建像素值反转滤波器
typedef itk::UnaryFunctorImageFilter<CharImageType, CharImageType, InvertPixelFunctor<unsigned char>> InvertFilterType;
InvertFilterType::Pointer invertFilter = InvertFilterType::New();
invertFilter->SetInput(reader->GetOutput());
5.连接过滤器输出到写入器并执行写入操作:
// 将反转后的图像作为输出图像
writer->SetInput(invertFilter->GetOutput());
// 执行更新
try
{
writer->Update();
}
catch (itk::ExceptionObject& error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
完整代码
#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkUnaryFunctorImageFilter.h>
#include <itkPNGImageIOFactory.h>
// 定义像素值反转的函数对象
template <typename TInputPixel>
struct InvertPixelFunctor
{
using InputPixelType = TInputPixel;
using OutputPixelType = TInputPixel;
OutputPixelType operator()(const InputPixelType &input) const
{
return static_cast<OutputPixelType>(255 - input);
}
};
int main()
{
// 定义图像类型
typedef itk::Image<unsigned char, 2> CharImageType;
typedef itk::ImageFileReader<CharImageType> ReaderType;
typedef itk::ImageFileWriter<CharImageType> WriterType;
// 注册 PNG 格式支持
itk::PNGImageIOFactory::RegisterOneFactory();
// 创建读取器和写入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
// 设置要读取和写入的文件
reader->SetFileName("BrainProtonDensitySlice.png");
writer->SetFileName("inverted_image.png");
// 创建像素值反转滤波器
typedef itk::UnaryFunctorImageFilter<CharImageType, CharImageType, InvertPixelFunctor<unsigned char>> InvertFilterType;
InvertFilterType::Pointer invertFilter = InvertFilterType::New();
invertFilter->SetInput(reader->GetOutput());
// 将反转后的图像作为输出图像
writer->SetInput(invertFilter->GetOutput());
// 执行更新
try
{
writer->Update();
}
catch (itk::ExceptionObject& error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
std::cout << "Image inversion completed successfully." << std::endl;
return EXIT_SUCCESS;
}
测试效果
原图:
反转效果:
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!