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

ITK-高斯滤波

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

高斯滤波原理

       高斯滤波(Gaussian Blur)是数字图像处理中常见的一种平滑滤波器,旨在通过模糊处理来减少图像中的噪声或细节。它基于高斯函数(Gaussian function),模拟了自然界中模糊的物理现象,如相机失焦、运动模糊等。

       它的数学表达式:

G(x, y)=\frac{1}{2 \pi \sigma^{2}} e^{-\frac{x^{2}+y^{2}}{2 \sigma^{2}}}

       其中G(x, y)是在坐标(x,y)处的高斯权重值,\sigma是高斯核的标准差,它决定了模糊的强度。较大的\sigma值会产生更强的模糊效果。

       高斯模糊是通过用这个高斯核对图像进行卷积操作来实现的。高斯核的值决定了每个像素周围邻域像素的权重,离中心越远的像素权重越小。它可以让图像变得更加平滑,去除细小的噪声。与简单的均值滤波器不同,高斯模糊会更加自然地保留图像的边缘和结构,不会造成突兀的平滑过渡。它被广泛应用于各种场景,比如:

  • 图像去噪:减少随机噪声对图像的影响。
  • 预处理:在执行边缘检测等操作之前,可以通过高斯模糊来消除噪声,减少误检。
  • 图像效果:高斯模糊还常用于生成背景模糊、柔化图像等效果。

       相比其他滤波器(如均值滤波器或中值滤波器),高斯模糊的特点是:

  • 平滑效果更自然:高斯模糊遵循正态分布,因此对图像细节的模糊处理更加平滑和自然。
  • 权重分布考虑空间距离:高斯模糊根据空间距离来调整像素的权重,而均值滤波器只是对邻域像素做简单平均。
  • 更适合处理噪声:在一些有较多噪声的图像中,高斯模糊能较好地保留图像主要结构,同时去除随机噪声。

       高斯模糊滤波器是图像处理中的一个重要工具,通过调整方差,你可以灵活控制图像的模糊程度,既适用于去噪,也适用于制造柔化效果。ITK中的高斯模糊滤波器简单易用,可以很好地处理图像平滑和噪声问题。

环境准备

参见:Windows下用CMake编译ITK及配置测试_itk配置-CSDN博客

功能解析

1.引入必要的头文件:

#include <itkImage.h>
#include <itkImageFileReader.h>
#include <itkImageFileWriter.h>
#include <itkDiscreteGaussianImageFilter.h>
#include <itkRescaleIntensityImageFilter.h>
#include <itkJPEGImageIOFactory.h>
#include <itkCastImageFilter.h>

2.初始化图像类型和读写器:

// 定义图像类型
typedef itk::Image<unsigned char, 2> CharImageType;
typedef itk::Image<float, 2> FloatImageType;
typedef itk::ImageFileReader<CharImageType> ReaderType;
typedef itk::ImageFileWriter<CharImageType> WriterType;
// 注册JPEG格式支持
itk::JPEGImageIOFactory::RegisterOneFactory();
// 创建读取器和写入器
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();

3.设置文件名:

// 设置要读取和写入的文件
reader->SetFileName("test.jpg");
writer->SetFileName("gaussian_output.jpg");

4.类型转换:

// 将unsigned char类型转换为float类型的图像
typedef itk::CastImageFilter<CharImageType, FloatImageType> CastFilterType;
CastFilterType::Pointer castfilter = CastFilterType::New();
castfilter->SetInput(reader->GetOutput());

5.创建高斯滤波器,并配置参数:

// 创建高斯模糊滤波器
typedef itk::DiscreteGaussianImageFilter<FloatImageType, FloatImageType> GaussianFilterType;
GaussianFilterType::Pointer gaussianFilter = GaussianFilterType::New();
gaussianFilter->SetInput(castfilter->GetOutput());
// 设置高斯模糊的方差,控制模糊程度
gaussianFilter->SetVariance(2.0);  // 方差越大,模糊程度越高

6.类型转换:

// 将浮点图像转换回unsigned char类型
typedef itk::RescaleIntensityImageFilter<FloatImageType, CharImageType> RescaleFilterType;
RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();
rescaleFilter->SetInput(gaussianFilter->GetOutput());

7.连接过滤器输出到写入器并执行写入操作:

// 设置输出图像
writer->SetInput(rescaleFilter->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 <itkDiscreteGaussianImageFilter.h>
#include <itkRescaleIntensityImageFilter.h>
#include <itkJPEGImageIOFactory.h>
#include <itkCastImageFilter.h>

int main()
{
	// 定义图像类型
	typedef itk::Image<unsigned char, 2> CharImageType;
	typedef itk::Image<float, 2> FloatImageType;
	typedef itk::ImageFileReader<CharImageType> ReaderType;
	typedef itk::ImageFileWriter<CharImageType> WriterType;

	// 注册JPEG格式支持
	itk::JPEGImageIOFactory::RegisterOneFactory();

	// 创建读取器和写入器
	ReaderType::Pointer reader = ReaderType::New();
	WriterType::Pointer writer = WriterType::New();

	// 设置要读取和写入的文件
	reader->SetFileName("test.jpg");
	writer->SetFileName("gaussian_output.jpg");

	// 将unsigned char类型转换为float类型的图像
	typedef itk::CastImageFilter<CharImageType, FloatImageType> CastFilterType;
	CastFilterType::Pointer castfilter = CastFilterType::New();
	castfilter->SetInput(reader->GetOutput());

	// 创建高斯模糊滤波器
	typedef itk::DiscreteGaussianImageFilter<FloatImageType, FloatImageType> GaussianFilterType;
	GaussianFilterType::Pointer gaussianFilter = GaussianFilterType::New();
	gaussianFilter->SetInput(castfilter->GetOutput());

	// 设置高斯模糊的方差,控制模糊程度
	gaussianFilter->SetVariance(2.0);  // 方差越大,模糊程度越高

	// 将浮点图像转换回unsigned char类型
	typedef itk::RescaleIntensityImageFilter<FloatImageType, CharImageType> RescaleFilterType;
	RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();
	rescaleFilter->SetInput(gaussianFilter->GetOutput());

	// 设置输出图像
	writer->SetInput(rescaleFilter->GetOutput());

	// 执行更新
	try
	{
		writer->Update();
	}
	catch (itk::ExceptionObject &error)
	{
		std::cerr << "Error: " << error << std::endl;
		return EXIT_FAILURE;
	}

	std::cout << "Gaussian blur filtering completed successfully." << std::endl;
	return EXIT_SUCCESS;
}

测试效果 

       通过调整参数,可以实现不同的滤波效果。

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


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

相关文章:

  • 阮一峰科技爱好者周刊(第 325 期)推荐工具:一个基于 Next.js 的博客和 CMS 系统
  • VSCode设置
  • 第三百二十三节 Java线程教程 - Java同步器
  • 金融领域先锋!海云安成功入选2024年人工智能先锋案例集
  • 【3D Slicer】的小白入门使用指南四
  • FingerprintSimilarity和BulkTanimotoSimilarity的区别
  • 数据库中的逐行数据处理
  • Python知识点:如何使用Python实现自动驾驶模拟
  • TCP/IP网络编程:Linux实现的web服务器
  • NowCoder HJ50 四则运算
  • EasyExcel实现复杂Excel的导入
  • 如何在Windows和Mac上免费提取RAR文件?这里有方法
  • 电路分析 ---- 加法器
  • 一小时原生画小程序商品展示单页面【代码实现】
  • 全球性“微软蓝屏”事件的深思:网络安全与系统稳定性的挑战与应对
  • Python-FLASK上传文件
  • 排序题目:插入区间
  • 趋势!遥感再发Nature正刊!
  • 一个webpack的plugin 的简单例子
  • python黄金分割数
  • 华为达芬奇人像引擎2.0,人像体验有哪些升级
  • 计算机毕业设计选题推荐-客栈管理系统-酒店预订-民宿管理系统-Java/Python项目实战
  • IDEA 2024最新软件下载
  • HarmonyOS开发实战( Beta5版)线程间通信场景最佳实践
  • linux curl命令介绍以及使用
  • React 通用后台管理项目