ITK-高斯滤波

news2024/9/22 5:29:50

作者:翟天保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.coloradmin.cn/o/2108991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 从入门到实战8(字典)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中元组的定义及相关操作。今天…

css弹性盒子——flex布局

目录 ​编辑 一、flex容器的样式属性(父元素属性) display:flex 弹性盒子&#xff0c;实现水平排列,在父盒子设置&#xff0c;适用于单行/单列 justify-content 二、flex元素的样式属性(子元素属性) 1.flex-grow 2.flex-shrink 3.flex-basis 4.flex组合属性 flex:flex-…

【WPS Excel】复制表格时,提示“图片太大,超过部份将被截去“ 问题

WPS表格 2019版本 升级到 WPS最新版 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 使用最新版就能够解决这个问题&#xff0c;如果仍旧无法解决可以勾选如下配置 重启Excel解决。 请勾选&#xff1a;文件 - 选项 - 编辑 - 不提示且不压缩文件中的图像

无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了。

智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

Linux系统下载并配置vscode(无废话)写C++

首先下载visual studio code 1.可以在应用商店下载 2.进入vscode官网Documentation for Visual Studio Code点击download>>点击下载.rpm 下载好之后打开vscode&#xff0c;先下载中文拓展&#xff08;可省略&#xff09; 然后下载c语言拓展 下载完之后打开设置&#xf…

Vue 使用接口返回的背景图片和拼图图片进行滑动拼图验证

一、背景 前两天发了一篇 vue-monoplasty-slide-verify 滑动验证码插件使用及踩坑_vue-monoplasty-slide-verify 引用后不显示-CSDN博客 这两天项目又需要通过接口校验&#xff0c;接口返回了背景图片和拼图图片&#xff0c;于是在网上找了一篇帖子&#xff0c;vue 图片滑动…

了解一下HTTP 与 HTTPS 的区别

介绍&#xff1a; HTTP是超文本传输协议。规定了客户端&#xff08;通常是浏览器&#xff09;和服务器之间如何传输超文本&#xff0c;也就是包含链接的文本。通常使用TCP【1】/IP协议来传输数据&#xff0c;默认端口为80。 HTTPS是超文本传输安全协议&#xff0c;具有CA证书。…

羲和能源大数据平台——Python数据绘图方法

1. 写在前面 目前论文对绘图的美观度要求越来越高&#xff0c;在气象领域呈现维度高&#xff0c;时空关联的特性&#xff0c;为了充分展示数据在各个维度的特性&#xff0c;选用合适的绘图方法至关重要&#xff0c;下图给出了如今在科研领域中个常用的各类图像&#xff1a;线型…

远程教育与学习:探索远程控制技术在教育领域的新机遇

什么适合会用到远程控制工具&#xff1f;如果你是运维、是设计或者外勤需要办公的一些资料文件&#xff0c;有远程控制工具工具的话就能轻松解决这些情况。为了保证电脑的安全我建议从官方网站进行下载&#xff0c;比如从向日葵远程控制官网下载就可以得到向日葵的官方正版。这…

Docker Container 常用命令

文章目录 目录 文章目录 1 . 什么是容器&#xff1f; 2 . 容器命令清单 docker create docker run docker ps docker logs docker exec docker kill docker container inspect docker cp docker rm docker export 总结 1 . 什么是容器&#xff1f; 通俗地讲&a…

C++设计模式——Command命令模式

一&#xff0c;命令模式的定义 命令模式是一种行为型设计模式。在实际开发场景中&#xff0c;命令模式将一个请求的处理或者一个具体操作封装为一个对象&#xff0c;从而可以让开发者根据不同的请求参数来生成不同的执行函数。 命令模式的本质是对具体命令的拆解和封装&#…

【Git远程仓库】将本地仓库推送到github(踩坑记录)

上一篇博客已经介绍了git本地仓库的基本操作&#xff0c;接下来记录一下如何将本地仓库上传到远程仓库中 远程仓库&#xff1a;托管在因特网的版本库&#xff0c;保存版本库的历史记录&#xff0c;多人协作 1. 创建远程版本库&#xff0c;得到远程仓库git地址 2. 本地仓库添加…

C#复习之内部类和分布类

知识点一&#xff1a;内部类 知识点二&#xff1a;分布类 知识点三&#xff1a;分部方法

DisplayManagerService启动-Android13

DisplayManagerService启动-Android13 1、DisplayManagerService启动1.1 简要时序图 2、DEFAULT_DISPLAY主屏幕添加3、默认屏幕亮度 1、DisplayManagerService启动 1.1 简要时序图 2、DEFAULT_DISPLAY主屏幕添加 3、默认屏幕亮度

C#复习之继承的基本规则

知识点一&#xff1a;基本概念 知识点二&#xff1a;基本语法 知识点三&#xff1a;实例 知识点四&#xff1a;访问修饰符的影响 知识点五&#xff1a;子类和父类的同名成员 总结&#xff1a;

MIT线性代数

本文链接的原创作者为 浊酒南街https://blog.csdn.net/weixin_43597208 第1讲 MIT_线性代数笔记&#xff1a;第 01 讲 行图像和列图像-CSDN博客 第2讲 MIT_线性代数笔记&#xff1a;第 02 讲 矩阵消元_矩阵first pivot-CSDN博客 第3讲 MIT_线性代数笔记&#xff1a;第 03…

反弹shell介绍和应用

一、什么是反弹shell 1 .含义 反向连接弹shell(即反弹shell为攻击者为服务端,受害者主机为客户端主动连接攻击者的服务端) 2 .目的 对方主机在外网无法访问 对方主机防火墙限制,只能发送请求,不能接收请求 对方IP动态变化 攻击了一台主机需要在自己的机器上…

3D一览通助力成都派铂宇航航天管道设计交付

在航空航天这一高精尖行业中&#xff0c;每一处细节都承载着不可估量的责任与使命。特别是在航天航空管道设计制造的复杂供应链中&#xff0c;任何误差都可能引发连锁反应&#xff0c;影响整体性能乃至安全。当前&#xff0c;航空航天行业面临的一大挑战在于如何有效管理这一复…

【数据结构】LinkedList ------ java实现

知识框架图&#xff1a; LinkedList是一种常用的数据结构。底层是一个双向链表。每个节点包含数据以及指向前一个节点和后一个节点的引用。 一&#xff1a;LinkedList的使用 1.1 LinkedList的构造方法 方法 解释LinkedList() 无参构造public LinkedList(Collection<? exte…

【教程】MySQL数据库学习笔记(六)——数据查询语言DQL(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…