Matlab图像处理-均值滤波,中值滤波和高斯滤波。

news2024/12/22 13:22:57

针对添加了零均值高斯噪声的图像,以取得尽可能好的处理效果为目的,采用不少于3种方法进行处理;对处理结果进行定性和定量的比较、并得出相应的结论。

1.算法原理

采用的图像滤波包括均值滤波,中值滤波和高斯滤波。

  1. 均值滤波的基本原理

图像的均值滤波用于减少图像中的噪声和细节。它的基本原理是用像素周围邻域内像素值的平均值来替代该像素的值。首先需要确定滤波器的大小,即决定用于计算每个像素邻域的大小。滤波器的大小可以是一个正方形或矩形区域,其尺寸通常是奇数。常见的滤波器大小有3x3、5x5等。对于图像中的每个像素,将滤波器放置在该像素周围的邻域内。邻域内的像素值被提取出来,并计算它们的平均值。平均值代表了邻域内像素值的整体特征。将计算得到的平均值作为该像素的新值,用于替代原始像素的值。均值滤波是一种线性滤波方法,它能够有效地平滑图像,减少噪声的影响。在实际应用中,根据需要选择不同大小的滤波器来控制平滑程度。较大的滤波器会更加平滑图像,但可能会导致更多的细节丢失。而较小的滤波器可以保留更多的细节,但可能无法有效地降低噪声水平。因此,在使用均值滤波器时需要根据具体情况进行调整和权衡。

  1. 中值滤波的基本原理

中值滤波是一种非线性滤波方法,它的基本原理是用图像中像素值的中值来替代该像素点的值。选取一个滤波窗口,遍历输入图像的每个像素点,统计滤波窗口内的所有像素值,并将这些像素值排序,用排序后位于中间位置的值(中值)来替代当前像素点的值,可以得到中值滤波后的图像。与均值滤波相比,中值滤波对脉冲噪声和椒盐噪声具有很好的滤除效果。因为中值可以有效剔除像素值离群点的影响,不像均值那样容易受极值影响较大。边缘保持性好,由于中值滤波在统计滤波窗口内像素值时,选取中间值,而不是计算均值,所以它可以很好地保留图像边缘细节,不出现图像模糊的问题。不易产生新的灰度值。中值滤波只选择输入灰度级内已有的值,不会产生新的灰度值,所以它保证了输出图像的自然性。

  1. 高斯滤波的基本原理

高斯滤波基于高斯函数的原理,通过对图像中的每个像素点及其周围像素点进行加权平均来实现平滑效果。

高斯函数是一个钟形曲线,具有中心点和标准差两个参数。它的形式如下:

其中,x表示距离中心点的偏移量,σ表示标准差。高斯函数的图像呈钟形曲线,中心点处取得最大值,随着距离中心点的偏移增加,函数值逐渐减小。在高斯滤波中,对于图像中的每个像素点,会将其与周围像素点进行加权平均,权重由高斯函数计算得出。距离中心点越远的像素点,其权重越小,距离中心点越近的像素点,其权重越大。高斯滤波首先要定义一个滤波模板,通常为一个奇数大小的矩阵,例如3x3、5x5等。模板大小决定了滤波的范围。对于图像中的每个像素点,将该点及其邻域像素点与滤波模板进行逐元素乘法。将乘积结果进行加权平均,权重由高斯函数计算得出。最后将加权平均结果赋值给原始像素点,完成平滑处理。高斯滤波可以有效地平滑图像,去除图像中的高频噪声,同时保留图像的主要特征。

2.步骤

1.读取图像:使用imread函数读取了三个图像文件,分别是原始图像lena.bmp,添加了高斯噪声的图像lena_noisy01.jpg,以及另一个添加了高斯噪声的图像lena_noisy02.bmp。

2.转换为灰度图像:对第二个图像进行rgb2gray转换,将其转换为灰度图像,命名为img1。

3.均值滤波:使用imfilter函数和fspecial函数创建一个3x3的平均滤波器,分别对img1和img2进行均值滤波操作。

4.中值滤波:使用medfilt2函数对img1和img2进行中值滤波操作。

5.高斯滤波:使用imgaussfilt函数对img1和img2进行高斯滤波操作。

6.画图比较。

7.计算均方误差:使用mean函数计算原始图像I0与每种滤波结果之间的均方误差。

8.显示MSE结果:使用disp函数显示每种滤波方法对应的MSE结果。

3.程序代码

clc;

clear all;

close all;

% 读取图像

I0 = imread('lena.bmp');I1 = imread('lena_noisy01.jpg');

img2 = imread('lena_noisy02.bmp');

img1 = rgb2gray(I1);

% 均值滤波

mean_filtered1 = imfilter(img1, fspecial('average', [3, 3]));

mean_filtered2 = imfilter(img2, fspecial('average', [3, 3]));

% 中值滤波

median_filtered1 = medfilt2(img1);

median_filtered2 = medfilt2(img2);

% 高斯滤波

gaussian_filtered1 = imgaussfilt(img1);

gaussian_filtered2 = imgaussfilt(img2);

% 显示原始图像和处理后的图像

figure;

subplot(2, 2, 1);

imshow(img1);

title('原始图像1');

subplot(2, 2, 2);

imshow(mean_filtered1);

title('均值滤波1');

subplot(2, 2, 3);

title('中值滤波1');

imshow(median_filtered1);

subplot(2, 2, 4);

imshow(gaussian_filtered1);

title('高斯滤波1');

subplot(2, 2, 4);

figure;

subplot(2, 2, 1);

imshow(img2);

title('原始图像2');

subplot(2, 2, 2);

imshow(mean_filtered2);

title('均值滤波2');

subplot(2, 2, 3);

imshow(median_filtered2);

title('中值滤波2');

subplot(2, 2, 4);

imshow(gaussian_filtered1);

title('高斯滤波2');

% 计算MSE

MSE1 = mean((I0 - mean_filtered1).^2, 'all');

MSE2 = mean((I0 - median_filtered1).^2, 'all');

MSE3 = mean((I0 - gaussian_filtered1).^2, 'all');

disp(['均值滤波1的MSE:', num2str(MSE1)]);

disp(['中值滤波1的MSE:', num2str(MSE2)]);

disp(['高斯滤波1的MSE:', num2str(MSE3)]);

MSE4 = mean((I0 - mean_filtered2).^2, 'all');

MSE5 = mean((I0 - median_filtered2).^2, 'all');

MSE6 = mean((I0 - gaussian_filtered2).^2, 'all');

disp(['均值滤波2的MSE:', num2str(MSE4)]);

disp(['中值滤波2的MSE:', num2str(MSE5)]);

disp(['高斯滤波2的MSE:', num2str(MSE6)]);

4.处理结果

对于lena_noisy01.jpg图像的处理结果。

对于lena_noisy02.bmp图像的处理结果

定性比较,对于采用的三种滤波处理三种方法,其中通过对于处理结果的观察,均值滤波效果最好。

定量比较,计算未加噪的信号与处理后的信号的均方误差,结果如下:

从结果中可以看出,均值滤波的均方误差数值最小,效果最佳。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1625211.html

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

相关文章

算法基础:并查集详解

并查集 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学…

【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

文章目录 网络编程一、什么是网络编程1.TCP和UDP的区别 二、UDP数据报套接字编程DatagramSocketDatagramPacket回显服务器(echo server) 网络编程 一、什么是网络编程 通过网络,让两个主机之间能够进行通信。基于通信来完成一定的功能。 ​…

Linux网络-DNS域名解析服务

目录 一.DNS相关介绍 1.DNS是什么 2.DNS系统的分布式数据结构 根域 顶级域 二级域 子域 主机 3.服务器类型 主域名服务器 从域名服务器 缓存域名服务器 转发域名服务器 二.DNS域名解析 1.DNS域名解析方式及功能 2.DNS域名解析查询方式 2.1.递归查询&#xff0…

Verilog基础语法——parameter、localparam与`define

Verilog基础语法——parameter、localparam与define 写在前面一、localparam二、parameter三、define写在最后 写在前面 在使用Verilog编写RTL代码时,如果需要定义一个常量,可以使用define、parameter和localparam三种进行定义与赋值。 一、localparam …

施耐德EOCR-2CT-300/5电流互感器 50HZ 5VA

EOCR主要产品有电子式电动机保护继电器,电子式过电流继电器,电子式欠电流继电器,电子式欠电压继电器,其它保护和监视装置,电流互感器。 施耐德EOCR-2CT-300/5电流互感器 EOCR-2CT系列型号: EOCR 2CT 100…

操作系统安全:Linux安全审计,Linux日志详解

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等…

18.Nacos配置管理-微服务读取Nacos中的配置

需要解决的问题 1.实现配置更改热更新,而不是改动了配置文件还要去重启服务才能生效。 2.对多个微服务的配置文件统一集中管理。而不是需要对每个微服务逐一去修改配置文件,特别是公共通用的配置。 配置管理服务中的配置发生改变后,回去立…

leetcode-二叉树的镜像-91

题目要求 思路1 1.遍历一遍二叉树,将左边的结点对应创建一个右边的结点 2.用此方法空间复杂度O(n),并不是最优 思路2 1.将一个结点的左右子树进行交换,如果左子树还有左右结点,就再交换左子树的左右结点,以此递归下去…

vscode 创建代码模版

在vscode中快捷创建代码模版 1.在VSCode中,按下Ctrl Shift P(Windows/Linux)或Cmd Shift P(Mac)打开命令面板。 2.然后输入"Preferences: Configure User Snippets"并选择该选项。打开一个json文件用户…

Python函数小知识

目录 一、函数的定义和调用 二、函数参数 三、函数作用域 四、递归函数和匿名函数 一、函数的定义和调用 def 函数名(参数): 自定义函数可以分为有参函数和无参函数 。 函数的作用: 在Python中定义函数可以提高代码的复用率,避免重复的代码,…

matlab保存示波器数据

再重新运行一下示波器 然后就可以在工作区看见(这里没有运行所以没有) 将保存到文件夹中方便后续绘图

服务于金融新核心系统 星辰天合与中电金信完成产品兼容认证

近日,北京星辰天合科技股份有限公司(简称:XSKY星辰天合)与中电金信软件有限公司(简称:中电金信)完成产品兼容性认证,星辰天合的企业级分布式统一数据平台 XEDP 符合金融级数字底座&q…

“一个有趣的C语言代码”分析

“一个有趣的C语言代码” 一个有趣的C语言代码-流浪的海豚-ChinaUnix博客 #include <stdio.h> int print() {printf("hello world!\n");return 0; } int main(void) {long base[0];long* result base3;*(result1) *result;*result (long)print;return 0; …

Qt : 在QTreeWidget中添加自定义右键菜单

一、引言 如图&#xff0c;我们需要在一个QTreeWidget 控件中添加了自定义右键菜单。 二、思路 如何做到的呢&#xff0c;很简单。浅浅记录和分享一下。 继承QTreeWidget&#xff0c;定义一个子类CustomTreeWidget &#xff0c;在重写contextMenuEvent 事件即可。 三、代…

数据结构初阶——树和二叉树

数据结构初阶——树和二叉树 1. 树的概念和结构1.1 树的概念1.2 树的表示 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的存储结构2.2.1 顺序存储2.2.2 链式存储 3. 二叉树的顺序结构及实现——堆3.1 堆的概念和结构3.2 堆的实现3.2.1 堆的定义3.2.2 堆的向上调整3.2.3 堆的向下…

Pycharm/Dataspell中使用jupyter导入ros humble包

配置ros humble对应python包路径文件 首先在~/.local/lib/python3.10/site-packages目录下新建一个.pth文件&#xff0c;如下图所示。 将对应的ros humble的python包的路径配置在上述文件中&#xff0c;一行放置一个路径&#xff0c;对应的路径如下图所示。 完成上述操作后…

ESP32 IDF环境 连接WIFI

新建wifi.h #ifndef __WIFI_H_ #define __WIFI_H_#include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/event_groups.h" #include "esp_system.h" #include "esp_wifi.h&…

IntelliJ IDEA - 10 款 IDEA 宝贝插件,YYDS!

好久没发这种实用贴了&#xff0c;最近用到了一些能提升工作效率的IDEA插件&#xff0c;给小伙伴们分享一下。相信我&#xff0c;我分享的这些插件&#xff0c;都是实实在在能解决实际开发场景中痛处的。 1、POJO to JSON 开发工作中&#xff0c;常常在设计完API后&#xff0c…

recat组件使用Antd

安装和初始化 项目中进行安装yarn add antd或者npm i antd安装 使用 在App.js文件中引入按钮并使用 需要引入自己的css文件 模块化 import React, { Component } from react import { Button } from antd; //引入按钮 import antd/dist/antd.css; //还需要引入css样式 …

javascript使用setTimeout函数来实现仅执行最后一次操作

在JavaScript中&#xff0c;setTimeout函数用于在指定的毫秒数后执行一个函数或计算表达式。它的主要用途是允许开发者延迟执行某些代码&#xff0c;而不是立即执行。 当我们想要确保仅最后一次更新UI时&#xff0c;我们可以使用setTimeout来合并多次连续的更新请求。具体做法…