【数字图像处理笔记】Matlab实现图像平滑算法 均值-中值-高斯滤波 (三)

news2024/9/23 15:29:27

请添加图片描述

  • 💌 所属专栏:【数字图像处理笔记】

  • 😀 作  者:我是夜阑的狗🐶

  • 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询!

  • 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!🤩 🤩 🤩

请添加图片描述

文章目录

  • 前言
  • 一、原理
  • 二、实现过程
      • 1、中值滤波
      • 2、均值滤波
      • 3、高斯滤波
  • 总结


前言

  大家好,又见面了,我是夜阑的狗🐶,本文是专栏【数字图像处理笔记】专栏的第3篇文章;
  这是今天学习到数字图像处理笔记 – Matlab实现图像平滑算法 均值-中值-高斯滤波 💖💖💖,开启新的征程,记录最美好的时刻🎉,每天进步一点点。
  专栏地址:【数字图像处理笔记】 , 此专栏是我是夜阑的狗对数字图像处理学习过程的总结,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。
  如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。

一、原理

  图像平滑的主要目的就是去除或衰减图像上的噪声和假轮廓,即衰减高频分量,增强低频分量,或称低通滤波。由前面的介绍可以得知,图像平滑处理在消除或减弱图像噪声和假轮廓的同时,对图像细节也有一定的衰减作用。
  因此,图像平滑的直观效果是图像噪声和假轮廓得以去除或衰减,但同时图像将变得比处理前模糊了,模糊的程度要看对高频成份的衰减程度而定。就同一种平滑方法而言,去除或衰减噪声和假轮廓的效果越好,图像就越模糊,因而图像细节损失越多。因此,在对图像作平滑处理的过程中,要二者兼顾。

二、实现过程

1、中值滤波

  代码:

	g = medfilt2(P1);                       %对高斯躁声中值滤波
	subplot(3,4,5),imshow(g);
	title('medfilter gaussian');

	h = medfilt2(P2);                       %对椒盐躁声中值滤波
	subplot(3,4,6),imshow(h);
	title('medfilter salt & pepper noise');

  medfilt2 中值滤波函数源码分析:

function b = medfilt2(varargin)
args = matlab.images.internal.stringToChar(varargin); %解析输入参数 
%a为待滤波图像,mn向量为滤波模板,padopt为边缘处理选项
[a, mn, padopt] = parse_inputs(args{:}); 
domain = ones(mn); %大小为m*n的全1矩阵
if (rem(prod(mn), 2) == 1) %取模判断mn滤波模板个数是否为奇数个
    tf = hUseIPPL(a, mn, padopt); %padopt是否设置为“symmetric”模式
    if tf
        b = medianfiltermex(a, [mn(1) mn(2)]);
    else
%取出mn矩阵中位数对应的下标order
        order = (prod(mn)+1)/2;
%对图像A作顺序统计滤波,A为输入图像矩阵,padopt为边界处理方式
%输出第order个数作为中值滤波的结果
        b = ordfilt2(a, order, domain, padopt);
    end
else %mn滤波模板个数为偶数个
    order1 = prod(mn)/2;%最中间靠左序号
    order2 = order1+1;%最中间靠右序号

%对图像A作顺序统计滤波,A为输入图像矩阵,padopt为边界处理方式
%输出第order个数作为中值滤波的结果
    b = ordfilt2(a, order1, domain, padopt);
    b2 = ordfilt2(a, order2, domain, padopt);
  if islogical(b) %判断b类型是否合法
    b = b | b2;
  else
    b = imlincomb(0.5, b, 0.5, b2); %取出平均中间值
  end
end

2、均值滤波

  代码:

	a=[1 1 1                               %对高斯躁声算术均值滤波
     1 1 1
     1 1 1];
	l=1/9*a;                          
	k = conv2(double(P1),double(l));                        
	subplot(3,4,7),imshow(k,[]);
	title('arithmeticfilter gaussian');                                          

	d = conv2(double(P2),double(l));           %对椒盐躁声算术均值滤波               
	subplot(3,4,8),imshow(d,[]);
	title('arithmeticfilter salt & pepper noise'

3、高斯滤波

  代码:

	sigma=8;% 标准差大小  
	window=double(uint8(3*sigma)*2+1);% 窗口大小一半为3*sigma  
	H=fspecial('gaussian', window, sigma);% fspecial('gaussian', hsize, sigma)产生滤波模板   
	img_gauss=imfilter(P1,H,'replicate'); %为了不出现黑边,使用参数'replicate'(输入图	像的外部边界通过复制内部边界的值来扩展)  
	subplot(3,4,9),  imshow(img_gauss);
	title('gaussian filting gauss noise');

	img_salt=imfilter(P2,H,'replicate'); 
	subplot(3,4,10),  imshow(img_salt);
	title('gaussian filting salt pepper noise');

  fspecial 高斯滤波函数源码分析:

function h = fspecial(varargin)
[type, p2, p3] = ParseInputs(varargin{:});%解析输入参数
switch type:%当参数type为'gaussian'高斯滤波时
 case 'gaussian' % Gaussian filter
% p2为模板大小,以[m n]形式定义,p3为标准差
        siz = (p2-1)/2; %siz为最大行列序号
        std = p3;%赋值标准差
          %基于siz,std,调用meshgrid函数生成mn模板每个位置的权值
        [x,y] = meshgrid(-siz(2):siz(2),-siz(1):siz(1));
          % 二维高斯分布中e对应的指数
        arg = -(x.*x + y.*y)/(2*std*std);
        h = exp(arg);
        h(h<eps*max(h(:))) = 0;
        %归一化处理
        sumh = sum(h(:));
        if sumh ~= 0,
            h = h/sumh;
        end;
end;

  从而得到高斯模板,接着调用 imfilter 函数对任意类型数组或多维图像进行滤波。imfilter(f, w, filtering_mode, boundary_options, size_options) ,其中, f 为输入图像, w 为滤波掩模, g 为滤波后图像。 filtering_mode 用于指定在滤波过程中是使用“相关”还是“卷积”。 boundary_options 用于处理边界充零问题,边界的大小由滤波器的大小确定。
  imfilter函数的核心源码分析如下:

function b = imfilter(varargin):
args = matlab.images.internal.stringToChar(varargin); %解析输入参数
[a, h, boundary, sameSize, convMode, outputShape, do_fcn] = parse_inputs(args{:});
[finalSize, pad] = computeSizes(a, h, sameSize);
if (isSeparable(a, h)&& (numel(size(a))<=3)) %分离滤波器的实部和虚部
  % 为了提高计算精度,中间变量用double保存。 
  class_of_a = class(a);
  if ~isa(a,'double')
    change_class = true;
    a = double(a);
  else
    change_class = false;
  end
%double精度的可分离滤波卷积运算
  b = filterDoubleSeparableWithConv(a, h, finalSize, sameSize, convMode, pad, boundary);
  if change_class
      % For logical inputs, output is rounded and then casted to
      % logical - expected behavior
      if isequal(class_of_a,'logical')
          b = round(b);
      end
      b = cast(b, class_of_a);
  end
else %不分离滤波
  if (isequal(class(a),'double') && ismatrix(h) && ismatrix(a)) && isreal(a) && isreal(h)
    % 2D image , 2D kernel 进行离滤波卷积运算
    b = filterDouble2DWithConv(a, h, finalSize, sameSize, convMode, pad, boundary);
elseif ismember(class(a),{'double','single','uint32','int8'}) && ismatrix(h) && 
numel(size(a))==3
    % 3D image , 2D kernel  - stack behavior
    b = imagesbuiltinImfilter(a, h, boundary, outputShape, do_fcn);
  else
    % 根据滤波器核的尺寸输入Pad
    a = padImage(a,pad,boundary);
    b = filterPartOrWhole(a, finalSize, h, pad, sameSize, convMode);
  end
end

  运行结果如下图所示:

在这里插入图片描述

  从图中可以看出,看出均值滤波、中值滤波和高斯滤波三种图像平滑技术对于添加了不同噪声的图片的滤波效果有所不同。

  • 均值滤波:典型的线性滤波算法,具有消除边缘尖锐特征,图像模糊化的效果。
  • 中值滤波:一种统计排序滤波器,可以一定程度克服线性滤波器带来的图像细节模糊的缺点,由实际效果图可以看出其对于消除椒盐噪声非常有效,并且可以保护边缘信息。
  • 高斯滤波:对图像进行加权平均,由于高斯滤波模板的权值与位置分布有关,所以可以有效抑制服从正态分布的噪声,如高斯噪声。

总结

  感谢观看,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹

在这里插入图片描述

  也欢迎你,关注我。👍 👍 👍

  原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉

更多专栏订阅:

  • 😀 【LeetCode题解(持续更新中)】
  • 🌼 【鸿蒙系统】
  • 👑 【Python脚本笔记】
  • 🚝 【Java Web项目构建过程】
  • 💛 【微信小程序开发教程】
  • 【JavaScript随手笔记】
  • 🤩 【大数据学习笔记(华为云)】
  • 🦄 【程序错误解决方法(建议收藏)】
  • 🚀 【软件安装教程】



订阅更多,你们将会看到更多的优质内容!!

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

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

相关文章

Obsidium v1.5.4壳 逆向分析

样本是使用这个壳进行打包的 来进行逆向 进入X32 DBG中 进来一看就是经典花指令 混淆解析器 可以在CE中查找指令地址 来得到当前真正执行的指令 对SEH链进行劫持 马上就来个int 1进入异常处理函数 无视异常 直接进去 观察Zwcontinue函数传进去的Context结构体 结构体偏移…

HFP event

0 Preface/Foreword NOTE&#xff1a;在来电提示音在响时候&#xff0c;每3s会进入一次。 也就是说&#xff1a;协议栈&#xff0c;没3s会调用一次app_hfp_event_callback。 回调函数在hfp初始化时候通过btif_hf_register_callback注册。 提示音调节&#xff1a; iPhone6s iO…

Leetcode编程练习

面试题-消失的数字 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& …

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候&#xff0c;Richard Li曾花费“巨资”请了华为前战略专家给我们培训&#xff0c;讲授IPD这门课的模式都很IPD&#xff0c;当时完全没重视&#xff0c;光想着不可能靠这个能把产品做好&#xff0c;这样做产品必定是一批…

RS2057XH功能和参数介绍及规格书

RS2057XH 是一款由润石科技&#xff08;Runic Semiconductor&#xff09;生产的模拟开关芯片&#xff0c;其主要功能和参数如下&#xff1a; 产品特点&#xff1a; 低电压操作&#xff1a;支持低至1.8V的工作电压&#xff0c;适用于低功耗应用。 高带宽&#xff1a;具有300MHz的…

Matlab 手写板设计

1、介绍 MATLAB手写板可以作为一个很好的数据输入口&#xff0c;其可以获取该手写板上任意字母、数字&#xff0c;甚至可以制作样本数据。具体用途体现在如下几方面&#xff1a; 数学公式输入&#xff1a;手写板允许用户直接用手写方式输入复杂的数学公式&#xff0c;这对于使…

C/C++ BM32 合并二叉树

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 树的题目大概率是要用到递归的&#xff0c;将一个树的问题拆分成子树的问题&#xff0c;不断拆分。 这题也用到了递归的思想。 题目 已知两颗二叉树&#xff0c;将它们合并成一颗…

基于springboot+vue+Mysql的租房网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Java17 --- SpringCloud之Nacos

目录 一、下载nacos并运行 1.1、创建9001微服务作为提供者 1.2、创建80微服务作为消费者 二、naocs配置中心规则与动态刷新 2.1、创建3377微服务 2.2、在nacos中创建配置文件 三、nacos数据模型之Namespace-Group-Datald 3.1、DatalD方案 3.2、Group方案 3.3、Name…

产业观察:电机驱动成为人形机器人的动力核心

前不久&#xff0c;波士顿动力发布一则“再见&#xff0c;液压Atlas”视频&#xff0c;宣告其著名的液压驱动双足人形机器人Atlas正式退役。这则视频引起全球所有Atlas粉丝的高度关注。然而紧接着&#xff0c;波士顿动力便又推出了全部由电机驱动的新一代Atlas机器人&#xff0…

数据结构相关

数据结构相关 文章目录 数据结构相关[TOC](文章目录)前言一、数据结构介绍二、不同的逻辑结构的存储方案(Java实现)2.1 线性结构&#xff1a;线性表、数组2.2 线性结构&#xff1a;栈2.3 线性结构&#xff1a;队列2.4 树形结构&#xff1a;树 三、一些常见的3.1 布隆过滤器Bloo…

自动化工具

一、介绍一些自动化的工具 puppet和chef用的是Ruby语言http协议&#xff0c;淘汰 saltstack Python语言 c/s ssh协议&#xff0c;5% ansible 无cilent ssh协议 用Python开发 95% 二、ansible简介 2.1 ansible自动化运维工具特点 Ansible 与 Saltstack 均是基于…

Day_1

1. 环境搭建 技术选型 后端项目结构 sky-take-out maven父工程&#xff0c;统一管理依赖版本&#xff0c;聚合其他子模块 sky-common 子模块&#xff0c;存放公共类&#xff0c;例如&#xff1a;工具类、常量类、异常类等 sky-pojo 子模块&#xff0c;存放实体类、VO、DTO…

【爬虫】爬取A股数据写入数据库(一)

1. 对东方财富官网的分析 步骤&#xff1a; 通过刷新网页&#xff0c;点击等操作&#xff0c;我们发现https://datacenter-web.eastmoney.com/api/data/v1/get?请求后面带着一些参数即可以获取到相应数据。我们使用python来模拟这个请求即可。 我们以如下选择的页面为切入点…

GiantPandaCV | FasterTransformer Decoding 源码分析(三)-LayerNorm介绍

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;FasterTransformer Decoding 源码分析(三)-LayerNorm介绍 作者丨进击的Killua 来源丨https://zhuanlan.zhihu.com/p/669440844 编辑丨GiantPandaC…

ollama + Anythingllm的安装

Ollama官网&#xff1a;https://ollama.com Anythingllm 官网下载&#xff1a;https://useanything.com/download 在Linux下如果直接运行./AnythingLLMDesktop.AppImage 报错的话&#xff0c;可以尝试以下命令&#xff1a; ./AnythingLLMDesktop.AppImage --appimage-extract …

微信公众号排名 SEO的5个策略

随着微信公众号在社交媒体领域的持续发展和普及&#xff0c;如何提升公众号的搜索排名&#xff0c;成为许多运营者关注的焦点。公众号排名SEO&#xff0c;即针对微信公众号进行搜索引擎优化&#xff0c;旨在提高公众号在搜索结果中的曝光率和点击率。下面&#xff0c;我们将深入…

什么是期货?期货的基础知识有哪些?

期货是一种标准化的远期合约&#xff0c;允许买卖双方在未来特定时间以预定价格交易货物或金融资产。也是一种金融衍生品&#xff0c;它为市场参与者提供了一种管理价格波动风险和进行投资的工具。 期货的基础知识有哪些 期货市场是一个复杂的金融环境&#xff0c;对于初学者来…

系统镜像地址

系统镜像 Linux 官网下载地址&#xff1a;Downloadhttps://www.centos.org/download/ 阿里云镜像下载地址&#xff1a;https://mirrors.aliyun.com/centos/https://mirrors.aliyun.com/centos/?spma2c6h.13651104.d-2001.6.6554320cwFqB8E 清华大学镜像下载地址&#xff1…

你对AI的所有疑虑,厚德云替你解答!

遇到难题不要怕&#xff01;厚德提问大佬答&#xff01; 厚德提问大佬答 你是否对AI绘画感兴趣却无从下手&#xff1f;是否有很多疑问却苦于没有大佬解答带你飞&#xff1f;从此刻开始这些问题都将迎刃而解&#xff01;你感兴趣的话题&#xff0c;厚德云替你问&#xff0c;你解…