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

请添加图片描述

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

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

  • 🚀 个人简介:一个正在努力学技术的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随手笔记】
  • 🤩 【大数据学习笔记(华为云)】
  • 🦄 【程序错误解决方法(建议收藏)】
  • 🚀 【软件安装教程】



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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jetson实操(二):jetson nano发送短信到指定用户

文章目录 一、准备工作二、代码实现 一、准备工作 腾讯云网址&#xff1a;点击 注&#xff1a;需先申请“短信签名”和“短信正文”&#xff0c;按照要求填写申请即可&#xff0c;腾讯云的审核效率还是很快的&#xff0c;一般在1-2个小时内就会有结果&#xff0c;链接&…

2024-2034年,量子密码市场年增长率将达29.3%

Visiongain发布了一份新报告&#xff0c;题为《2024-2034年量子密码市场报告》&#xff1a;按组件&#xff08;软件、硬件&#xff09;、软件&#xff08;加密算法、密钥管理解决方案等&#xff09;、硬件&#xff08;量子密钥分发&#xff08;QKD&#xff09;设备、量子随机数…

CkickHouse JDBC 使用整理

1. pom 引入 <dependency><groupId>com.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.4.6</version></dependency><dependency><groupId>org.roaringbitmap</groupId><arti…

BeautifulSoup库TapTap评论爬虫

最近在写关于评论数据主题建模和情感分析的作业&#xff0c;本来想用八爪鱼直接爬TapTap的评论数据&#xff0c;但是自动识别网页总是定位错误&#xff0c;还是回归BeautifulSoup和Request来进行评论内容的爬取&#xff0c;具体操作步骤如下 导入所需的库 import re import r…

定制旁通式孔板流量计需要哪些技术参数

旁通式孔板流量计又称桥式孔板流量计&#xff0c;本产品含有直管&#xff0c;直管中安装有孔板&#xff0c;该孔板两侧的直管壁上分别设置一个测量管&#xff0c;其特征是&#xff1a;所述直管和一个桥管并联式连接&#xff0c;二者内管相互连通&#xff0c;并且所述直管和桥管…

mars3d的config,json文件配置谷歌影像地图的tilingScheme属性

mars3d的config,json文件配置tilingScheme属性说明&#xff1a; 1.cesium加载谷歌影像地图的时候需要配置tilingScheme参数&#xff0c;如以下代码&#xff1a; var viewer new Cesium.Viewer("cesiumContainer", { animation: false, //是否显示动画控件 baseLaye…

64位Office API声明语句第118讲

跟我学VBA&#xff0c;我这里专注VBA, 授人以渔。我98年开始&#xff0c;从源码接触VBA已经20余年了&#xff0c;随着年龄的增长&#xff0c;越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友&#xff0c;都来学习VBA,利用VBA,起码可以提高…

文件夹加密软件哪个好?文件夹加密软件排行榜

许多人给小编说&#xff0c;我们公司想实现文件私自发出呈乱码状态&#xff0c;这说明公司逐渐认识到文件加密的重要性。 目前&#xff0c;加密软件已经广泛应用于企业办公、商业贸易、个人应用等多个领域&#xff0c;成为保护数据安全和隐私的重要手段。 为了保护企业机密&am…

【driver2】设备读写,同步和互斥,ioctl,进程休眠,时间和延时,延缓

文章目录 1.实现设备读写&#xff1a;write函数中一个进程写没问题&#xff0c;两进程写&#xff1a;第一个进程运行到kzalloc时&#xff0c;第二个进程也执行了kzalloc&#xff0c;只第二个进程地址保存在c中&#xff0c;第一个进程分配内存空间地址丢失造成内存泄漏。第一个进…

sqlalchemy 分表实现方案

1.需求及场景概述 现有系统中因历史数据量过大,产生了将历史数据进行按月存储的要求,系统和数据库交互使用的是sqlalchemy,假设系统的原来的历史记录表(record)如下: 为了将历史数据按月分表存储,我们需要以此表为基础按月创建对应的月表来进行分表存储,同时又要使用or…

学华为沟通,汇总5大项目沟通技巧

高效沟通在项目管理中的重要性不容小觑&#xff0c;它是确保项目顺利进行、提升团队协作效率、实现项目目标的关键因素。如果沟通不畅&#xff0c;往往容易导致成员对项目目标理解不一致&#xff0c;或信息传递不及时不准确&#xff0c;导致项目工作方向偏差&#xff0c;增加项…

前端工程化05-初始前端工程化Node基本介绍安装配置基础知识

6、初始前端工程化 6.1、工程化概述 虽然前几篇我的目录标题写的前端工程化&#xff0c;但是那些东西并不属于前端工程化的内容&#xff0c;更倾向于是js、jq当中的东西&#xff0c;下面我们将接触真正的前端工程化。 前端工程化开发其实现在是离不开一个东西的&#xff0c;…

Matlab 手写板设计

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

电子书制作神器,简单操作

​随着数字化时代的到来&#xff0c;电子书籍越来越受到人们的喜爱。而一款优秀的电子翻页书制作软件&#xff0c;则能够帮助你轻松制作出专业级的电子书&#xff0c;让你的阅读体验更加丰富多彩。 今天&#xff0c;我们就来为大家推荐一款优秀的电子翻页书制作软件——FLBOOK在…

Burp和Proxifier抓包微信小程序

1、Burp设置代理 2、浏览器下载证书 3、安装证书 4、Proxifier设置代理 5、Proxifier设置Proxification Rule 6、Burp查看抓包数据 打开一个小程序&#xff0c;可以看到WeChatAppEx的流量先经过Proxifier&#xff0c;再经过127.0.0.1:8080到Burp

如何使用ArcGIS Pro进行选房分析

无论是研究城市规划布局还是寻找理想的住房&#xff0c;都需要综合考虑购物、医疗、教育和休闲等多方面因素&#xff0c;此时我们的GIS软件就可以派上用场了&#xff0c;这里为大家介绍一下如何使用 ArcGIS Pro 进行选房分析&#xff0c;希望能对你有所帮助。 数据来源 教程所…

性能优化 | el-table中内嵌大量el-input控件导致渲染卡顿的问题

场景 项目中有一个应用场景&#xff0c;用户需要在表单中大量使用选择框以及输入框填写数据&#xff08;每一行大概有三十几个输入框&#xff09;&#xff0c;当选择框与输入框达到一定数量的时候&#xff0c;页面会出现输入不连续、卡顿的现象&#xff0c;如下图&#xff1a;…

LoRa无线通讯入门

本文图片来自于深入浅出讲解LoRa通信技术&#xff0c;LoRa技术介绍&#xff0c;LoRa开发与应用&#xff0c;物联网学习必备知识点&#xff01;_哔哩哔哩_bilibili LoRa无线通讯 LoRa&#xff08;Long Range&#xff09;是一种低功耗广域网&#xff08;LPWAN&#xff09;技术&a…

【春招特供】Unity面试题总结 | Unity基础篇

物体发生碰撞的必要条件&#xff1f; 两个物体都必须带有碰撞器&#xff08;Collider&#xff09;&#xff0c;其中一个物体还必须带有Rigidbody刚体&#xff0c;而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。 2. Unity3d中的碰撞器和触发器的区别&#xff1f; 碰…

颠覆传统?「一束光子,两种频率」的量子纠缠!

在最新的研究中&#xff0c;科学家们开发了一种革命性的量子纠缠方式——“频域光子数路纠缠”&#xff08;frequency-domain photon number-path entanglement&#xff09;。这一量子物理学的重大进展涉及到一个创新性的工具&#xff1a;频率分束器&#xff08;frequency beam…