自学内容网 自学内容网

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;
}

测试效果 

​原图:

反转效果:

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!


原文地址:https://blog.csdn.net/zhaitianbao/article/details/144692299

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!