当前位置: 首页 > article >正文

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

测试效果 

​原图:

反转效果:

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


http://www.kler.cn/a/455085.html

相关文章:

  • UGUI简单动画制作
  • 全局webSocket 单个页面进行监听并移除单页面监听
  • 软考-信息安全-网络安全体系与网络安全模型
  • Overleaf中设置表格中的字体为Times New Roman
  • C++ 面向对象编程:继承、继承方式
  • Kubernetes 安装 Nginx以及配置自动补全
  • PDF书籍《手写调用链监控APM系统-Java版》第1章 开篇介绍
  • 前端 学习
  • Alma linux部署gitlab
  • Java 中 List 源码解析:深度剖析与实现
  • 机器学习1-简单神经网络
  • Go主协程如何等其余协程完再操作
  • 废品回收小程序:助力企业转型发展
  • Vue3 +Element-Plus el-select下拉菜单样式(局部生效)
  • vue 中 keep-alive 详解
  • C# 窗体应用程序嵌套web网页,基于谷歌浏览器内核(含源码)
  • 《机器学习》——利用OpenCV库中的KNN算法进行图像识别
  • oracle数据泵expdp/impdp导出导入
  • 【C++第十六课 - C++11】列表初始化、右值引用、移动构造、移动赋值、lambda表达式
  • 大模型笔记!以LLAMA为例,快速入门LLM的推理过程
  • Vue异步处理、异步请求
  • 无人零售 4G 工业无线路由器赋能自助贩卖机高效运营
  • 【基础】卒的遍历(DFS)
  • dockfile 配置 /etc/apt/source.list.d/debian.list 清华镜像
  • 记录一个制作Fortran的docker镜像
  • 【NODE】01-fs和path常用知识点