目前比较经典的图像去噪算法主要有以下三种:
 
均值滤波算法:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度
的平均值来代替每个像素的灰度。有效抑制加性噪声,但容易引起图像模糊,
可以对其进行改进,主要避开对景物边缘的平滑处理。

[cpp] view plaincopy
  1. %x是需要滤波的图像,n是模板大小(即n×n)
  2. function d=avg_filter(x,n)
  3. a(1:n,1:n)=1;   %a即n×n模板,元素全是1
  4. [height, width]=size(x);   %输入图像是hightxwidth的,且hight>n,width>n
  5. x1=double(x);
  6. x2=x1;
  7. for i=1:hight-n+1
  8. for j=1:width-n+1
  9. c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘
  10. s=sum(sum(c));                 %求c矩阵中各元素之和
  11. x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将与模板运算后的各元素的均值赋给模板中心位置的元素
  12. end
  13. end
  14. %未被赋值的元素取原值
  15. d=uint8(x2);

中值滤波:基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号
处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,
一般为方形邻域,也可以为圆形、十字形等等,然后将邻域中各像素的灰度
值排序,取其中间值作为中心像素灰度的新值,这里领域被称为窗口,当窗
口移动时,利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂
度低,但其对点、线和尖顶多的图像不宜采用中值滤波。很容易自适应化

[cpp] view plaincopy
  1. %自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)
  2. function d=mid_filter(x,n)
  3. [height, width]=size(x);   %输入图像是p×q的,且p>n,q>n
  4. x1=double(x);
  5. x2=x1;
  6. for i=1:height-n+1
  7. for j=1:height-n+1
  8. c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)
  9. e=c(1,:);      %是c矩阵的第一行
  10. for u=2:n
  11. e=[e,c(u,:)];     %将c矩阵变为一个行矩阵
  12. end
  13. mm=median(e);      %mm是中值
  14. x2(i+(n-1)/2,j+(n-1)/2)=mm;   %将模板各元素的中值赋给模板中心位置的元素
  15. end
  16. end
  17. %未被赋值的元素取原值
  18. d=uint8(x2);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

另一个版本:

[plain] view plaincopy
  1. a=imread('lena_0.005.bmp');
  2. a=double(a);
  3. [dep,wide]=size(a);
  4. new_image=ones(size(a));
  5. for i=3:dep-2
  6. for j=3:wide-2
  7. new_image(i,j)=median([a(i-2,j-2) a(i-2,j-1) a(i-2,j) a(i-2,j+1) a(i-2,j+2) a(i-1,j-2) a(i-1,j-1) a(i-1,j) a(i-1,j+1) a(i-1,j+2) a(i,j-2) a(i,j-1) a(i,j) a(i,j+1) a(i,j+2) a(i+1,j-2) a(i+1,j-1) a(i+1,j) a(i+1,j+1) a(i+1,j+2) a(i+2,j-2) a(i+2,j-1) a(i+2,j) a(i+2,j+1) a(i+2,j+2)]);
  8. end
  9. end
  10. for i=3:dep-2 %处理每一行的最头上两个和最边上2个
  11. new_image(i,1)=new_image(i,3);
  12. new_image(i,2)=new_image(i,3);                                                                                                      new_image(i,wide)=new_image(i,wide-2);
  13. new_image(i,wide-1)=new_image(i,wide-2);
  14. end
  15. new_image(1,:)=new_image(3,:); %把第三行的所有元素赋值给第一行
  16. new_image(2,:)=new_image(3,:);
  17. new_image(dep,:)=new_image(dep-2,:);%把倒数第二行的所有元素值赋给最后一行
  18. new_image(dep-1,:)=new_image(dep-2,:);
  19. figure
  20. imshow(uint8(a))
  21. figure
  22. imshow(uint8(new_image))
  23. % imwrite(uint8(new_image),'lena_0.005_median_5.bmp','bmp')

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5

Wiener
维纳滤波:使原始图像和其恢复图像之间的均方误差最小的复原方法,
是一种自适应滤波器,根据局部方差来调整滤波器效果。对于去除高斯噪声
效果明显。

另: 高斯滤波函数:

[cpp] view plaincopy
  1. %自编的高斯滤波函数,S是需要滤波的图象,n是均值,k是方差
  2. function d=gaussfilt(k,n,s)
  3. Img = double(s);
  4. n1=floor((n+1)/2);%计算图象中心
  5. for i=1:n
  6. for j=1:n
  7. b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*k))/(4*pi*k);
  8. end
  9. end
  10. %生成高斯序列b。
  11. Img1=conv2(Img,b,'same'); %用生成的高斯序列卷积运算,进行高斯滤波
  12. d=uint8(Img1);

主函数:

[cpp] view plaincopy
  1. %此为程序主文件,包含主要功能单元,以及对子函数进行调用
  2. try
  3. %实验步骤一:彩色、灰度变换
  4. h=imread('photo.jpg'); %读入彩色图片
  5. c=rgb2gray(h); %把彩色图片转化成灰度图片,256级
  6. figure,imshow(c),title('原始图象'); %显示原始图象
  7. g=imnoise(c,'gaussian',0.1,0.002); %加入高斯噪声
  8. figure,imshow(g),title('加入高斯噪声之后的图象'); %显示加入高斯噪声之后的图象
  9. %实验步骤二:用系统预定义滤波器进行均值滤波
  10. n=input('请输入均值滤波器模板大小\n');
  11. A=fspecial('average',n); %生成系统预定义的3X3滤波器
  12. Y=filter2(A,g)/255;           %用生成的滤波器进行滤波,并归一化
  13. figure,imshow(Y),title('用系统函数进行均值滤波后的结果'); %显示滤波后的图象
  14. %实验步骤三:用自己的编写的函数进行均值滤波
  15. Y2=avefilt(g,n);     %调用自编函数进行均值滤波,n为模板大小
  16. figure,imshow(Y2),title('用自己的编写的函数进行均值滤波之后的结果'); %显示滤波后的图象
  17. %实验步骤四:用Matlab系统函数进行中值滤波
  18. n2=input('请输入中值滤波的模板的大小\n');
  19. Y3=medfilt2(g,[n2 n2]);   %调用系统函数进行中值滤波,n2为模板大小
  20. figure,imshow(Y3),title('用Matlab系统函数进行中值滤波之后的结果'); %显示滤波后的图象
  21. %实验步骤五:用自己的编写的函数进行中值滤波
  22. Y4=midfilt(g,n2);      %调用自己编写的函数进行中值滤波,
  23. figure,imshow(Y4),title('用自己编写的函数进行中值滤波之后的结果');
  24. %实验步骤六:用matlab系统函数进行高斯滤波
  25. n3=input('请输入高斯滤波器的均值\n');
  26. k=input('请输入高斯滤波器的方差\n');
  27. A2=fspecial('gaussian',k,n3);      %生成高斯序列
  28. Y5=filter2(A2,g)/255;              %用生成的高斯序列进行滤波
  29. figure,imshow(Y5),title('用Matlab函数进行高斯滤波之后的结果');    %显示滤波后的图象
  30. %实验步骤七:用自己编写的函数进行高斯滤波
  31. Y6=gaussfilt(n3,k,g); %调用自己编写的函数进行高斯滤波,n3为均值,k为方差
  32. figure,imshow(Y6),title('用自编函数进行高斯滤波之后的结果');      %显示滤波后的图象
  33. catch           %捕获异常
  34. disp(lasterr);     %如果程序有异常,输出
  35. end

MATLAB 滤波函数的源代码相关推荐

  1. 写一个matlab 滤波函数

    在 Matlab 中,可以使用内置的滤波函数来对数据进行滤波处理. 例如,你可以使用 filter 函数来实现一个低通滤波器,其中 b 和 a 分别表示滤波器的输入和输出系数. y = filter( ...

  2. dvhop的matlab画图函数,DV-Hop 源代码 matlab 出各种图

    应用背景 在无线传感器网络(Wireless Sensor Network, WSN)应用中,位置信息对于网络中的节点来说,具有十分重要的.基础的作用,例如在传感器网络技术广泛应用的环境监测.远程医疗 ...

  3. 查看matlab中函数源代码的方法

    有几种方法可以实现查看matlab里自带函数的源代码: 在命令窗口中输入: (1).type 函数名(如 type rgb2gray 或者 type rgb2gray.m):即可在命令窗口中显示此函数 ...

  4. matlab如何查看函数源代码,通达信fft函数,如何查看matlab fft函数源代码

    Q1:如何查看matlab fft函数源代码 n要取最接近数据长度的2的整数次方,命令是2^nextpow2(n),其中n是实际数据长度,因为这样的n可以使fft更快.比如,n=1021,执行n=2^ ...

  5. MATLAB中滤波函数、频率响应函数以及频率响应函数不同表达形式的转换

    一.理论公式 频率响应函数的表达式: 对应的z变换的多项表达式: Z变换的零极点表达形式: Z变换的二阶因子级联形式: 二.滤波函数filter filter函数,仅可以用于零状态响应系统. y=fi ...

  6. Matlab中一维和二维滤波函数及其典型用法【随时更新】

    Matlab中一维和二维滤波函数及其典型用法[随时更新] 一维滤波函数 均值滤波器movmean 中值滤波器movmedian 二维滤波函数 用fspecial预定义各种二维滤波器 主要用于自查,如果 ...

  7. matlab freqz函数使用

    Matlab freqz函数使用 (2012-10-22 13:42:03) 转载▼ 标签: 杂谈 freqz函数计算线性系统的频率响应,包括幅频响应和相频响应,基本输入为线性系统的AMMA模型系数向 ...

  8. bilareralFilter双边滤波函数

    C++: void **bilateralFilte**r(InputArray src, OutputArray dst, int d, double sigmaColor, double sigm ...

  9. Matlab参考函数

    附录1 常用命令 附录1.1 管理用命令 函数名 功能描述 函数名 功能描述 addpath 增加一条搜索路径 rmpath 删除一条搜索路径 demo 运行Matlab演示程序 type 列出.M文 ...

  10. matlab图像处理函数大全

    1.图像的变换   ① fft2:fft2函数用于数字图像的二维傅立叶变换,如:i=imread('104_8.tif'); j=fft2(i); ②ifft2::ifft2函数用于数字图像的二维傅立 ...

最新文章

  1. 京东11·11:撬动数据中心的支点——京东阿基米德
  2. 光纤有什么优势?还有哪些挑战需要面对呢?
  3. 用 JavaScript 验证只能输入数字,并做数字加总
  4. hibernate开发优缺点
  5. Ubuntu环境搭建三:VIM配置
  6. Spring IOC学习心得之IOC容器的初始化过程
  7. 165体重_身高165的女性体重多少比较合适?过胖和过瘦都不太好
  8. 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)...
  9. 图文详解——将本地项目上传到码云(gitee)远程仓库
  10. mysql打开数据库的sql语句_数据库MySQL——SQL语句(命令)
  11. (NCRE网络技术)IP地址规划设计技术-知识点
  12. html5在线裁剪,HTML5和JQuery裁剪图像实时预览缩略图并上传
  13. html项目符号实心圆圈,HTML基础 ul type 项目符号为圆圈与方块
  14. matlab读取bin文件
  15. openlayers6 解决调用百度地图之瓦片偏移、坐标偏移、无限拖动裂缝偏移问题
  16. ET钱包2月25日早报 | 过去24小时EOS区块链活跃度指数蝉联榜首
  17. Hikaril过一段时间就出错,Possibly consider using a shorter maxLifetime value问题
  18. 2021-11-05 微信小程序实现登录功能
  19. Vue-axios使用QS(QueryString)插件,Vue-axios无法发送参数给后端(包含但不限于php)。
  20. 保证系统三高:高可用、高性能、高扩展

热门文章

  1. Vue项目中使用富文本编辑器
  2. QT QML 3D模型查看器
  3. 使用Poedit汉化wordpress主题
  4. 转:C#数字、16进制字符串和字节之间互转 bin2hex
  5. 35岁的程序员:第25章,离职
  6. 《信息系统设计与分析》读书笔记
  7. 劲舞团显示正在登录message 服务器,[新手]劲舞团2.0之表情和message系统
  8. 疲劳检测方法总结_计算机视觉
  9. android vlc m3u8,Exoplayer播放m3u8文件Android
  10. 【今日头条测试开发笔试】部分题目总结