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

devtools/2024/9/23 1:00:33/

请添加图片描述

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

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

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

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

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

请添加图片描述

文章目录

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


前言

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

一、原理

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

二、实现过程

1、中值滤波

  代码:

matlab">	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 中值滤波函数源码分析:

matlab">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 tfb = medianfiltermex(a, [mn(1) mn(2)]);else
%取出mn矩阵中位数对应的下标orderorder = (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;elseb = imlincomb(0.5, b, 0.5, b2); %取出平均中间值end
end

2、均值滤波

  代码:

matlab">	a=[1 1 1                               %对高斯躁声算术均值滤波1 1 11 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、高斯滤波

  代码:

matlab">	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 高斯滤波函数源码分析:

matlab">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函数的核心源码分析如下:

matlab">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);elsechange_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 behaviorif isequal(class_of_a,'logical')b = round(b);endb = 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 behaviorb = imagesbuiltinImfilter(a, h, boundary, outputShape, do_fcn);else% 根据滤波器核的尺寸输入Pada = padImage(a,pad,boundary);b = filterPartOrWhole(a, finalSize, h, pad, sameSize, convMode);end
end

  运行结果如下图所示:

在这里插入图片描述

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

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

总结

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

在这里插入图片描述

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

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

更多专栏订阅:

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



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


http://www.ppmy.cn/devtools/35442.html

相关文章

Sentinel流量防卫兵

1、分布式服务遇到的问题 服务可用性问题 服务可用性场景 服务雪崩效应 因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程&#xff0c;就叫服务雪崩效应导致服务不可用的原因&#xff1a; 在服务提供者不可用的时候&#xff0c;会出现大量重试的情况&…

被苹果商店打回20多个包,App Store都干了啥!

本次被拒的App涉及金融、教育、游戏等各个领域&#xff0c;其中既有首发产品也有更新产品&#xff0c;原因多涉及疑似切支付、马甲包等问题&#xff1b;不过也有部分开发者反映遭到”误伤”&#xff0c;正常包体也被打回。 从今年1月底开始&#xff0c;许多开发者发现在向苹果…

Android 学习 鸿蒙HarmonyOS 4.0 第五章(TS中的循环语句)

PS&#xff1a;在有关TS的博客中呢&#xff0c;我想声明一点&#xff0c;如果是零基础没有开发经验的小伙伴&#xff0c;直接学鸿蒙会有些吃力&#xff0c;可以先学一下TS&#xff0c;比较好入手一些&#xff0c;鸿蒙主推的开发语音是ArkTS&#xff0c;是TS的超集&#xff0c;先…

PostgreSQL SUM踩坑

空集合的SUM()将返回NULL&#xff0c;而不是零。 示例SQL SELECT SUM (amount) FROM payment WHERE customer_id 2000;如果没有查询到数据,那么返回的将是NULL sum ------null (1 row)解决方案 如果您希望SUM()函数在没有匹配行的情况下返回0而不是NULL&#xff0c;可以使用…

Java中的ThreadLocal为什么使用弱引用

ThreadLocal中为什么使用弱引用 补个概念&#xff1a; ThreadLocalMap中的key就是Entry&#xff0c;Entry是一个弱引用&#xff0c;关联了当前ThreadLocal对象。需要存储的数据为值。调用set方法要传入两个参数ThreadLocal对象和要存入ThreadLocal对象的数据。 如下图&#xf…

将子进程(exe)界面嵌入到主进程(另一exe)界面中——Qt

前言 近期项目中&#xff0c;要将子进程界面嵌入到主进程中&#xff0c;双方都是自己开发的&#xff0c;之前有过研究&#xff0c;曾经写过一篇文章 将外部exe嵌入到界面中(Windows)——Qt_startf_useshowwindow-CSDN博客&#xff0c;如今发现不好用&#xff0c;界面是嵌入了…

MySQL 迁移到 Oracle 需要注意的问题

MySQL /Oracle 常见问题 1. VARCHAR/VARCHAR2/NVARCHAR 差异&#xff1a; MySQL 的 VARCHAR 是以字符为单位计算的&#xff0c;Oracle 的 VARCHAR 是 以字节为单位计算的&#xff0c;所以对中文的存储 Oracle 是 MySQL 的 2 倍 (GBK)和 3 倍(UTF8) 2. NULL 差异 A. MySQL…

「云渲染平台」3D模型渲染是CPU还是GPU?

​在数字艺术创作和工程设计这两个领域中&#xff0c;将三维模型转换成逼真的二维图像的过程被称为模型渲染&#xff0c;这是一种对计算资源要求极高的技术活动。在渲染三维模型时&#xff0c;CPU和GPU各自承担着不同的任务。现在&#xff0c;让我们来了解在模型渲染的过程中&a…