matlab编程实现自适应滤波器

  • 一、自适应均值滤波器
    • 1. 原理部分:
    • 2. 程序代码
    • 3. 结果对比
  • 二、自适应中值滤波
    • 1. 原理部分
    • 2.程序代码
    • 3. 结果对比

一、自适应均值滤波器

1. 原理部分:

加入噪声:
原理: 将图片灰度化,然后将图片像素归一化到[0,1]之间,然后添加均值为0,方差为0.1的高斯噪声,乘以255映射回图片原来的灰度级,用max(0,min(t1,255))操作将超出[0,255]的纠正。效果如图:

随机变量最简单的统计量是均值和方差,这些适当的参数是自适应局部滤波器的基础。均值给出了计算均值的区域中灰度平均值的度量,而方差给出了这个区域的平均对比度的度量


2. 程序代码

主函数:

clear;clc;
%% 导入原图像,并添加高斯噪声
image=imread("1.jpg");
image=rgb2gray(image); %灰度化
[m,n,~]=size(image);
% y=0+0.2*randn(m,n/2);   %只添加一半
y=0+0.2*randn(m,n);       %全范围加上噪声
%先将其double化,再除以255 便于后面计算
t1=double(image)/255;
%加上噪声
% t1(:,(n/2+1):n)=t1(:,(n/2+1):n)+y;
t1(:,:)=t1(:,:)+y;
t1 = max(0,min(t1,1));  %处理到[0,1]
% t1(:,:)=t1(:,:)+y2;
%将像素范围扩大至0--255
t1=t1*255;
%转换为uint8类型  包含噪声的图片
t2=uint8(t1);
figure("color",[1,1,1])
subplot(1,2,1),imshow(image),title('原图');
subplot(1,2,2),imshow(t2),title('加入均值为0,标准差为0.2的高斯噪声后');%% 计算噪声方差
t2_reshape=reshape(t1,1,1,length(t1(:)));
global_means=mean(t2_reshape);
global_vars=var(t2_reshape,1); %% 自适应均值滤波器
image_with_noise=t1;
image_expand=padarray(image_with_noise, [3 3]); %扩展周围一圈
image1=double(image);
image_init=padarray(image1, [3 3]);
%扩展周围一圈,因为滤波器为7x7,可以有镜像扩充、对称扩充、常数扩充等等imagemean=image_expand; %存储每个位置的局部均值
imagevar=image_expand;  %存储每个位置的局部方差[width,height,z]=size(image_expand);
s=7;    %滤波器阶数
for i=1:width-s+1for j=1:height-s+1box=image_expand(i:i-1+s,j:j-1+s);boxs=reshape(box,1,1,length(box(:)));means=mean(boxs);   %求均值imagemean(i+(s-1)/2,j+(s-1)/2)=means;vars=var(boxs,1);   %求方差imagevar(i+(s-1)/2,j+(s-1)/2)=vars;end
end
image_expand=image_expand(3+1:width-3,3+1:height-3);
imagemean=imagemean(3+1:width-3,3+1:height-3);   %去掉扩充的边缘
imagevar=imagevar(3+1:width-3,3+1:height-3); %去掉扩充的边缘
noise = mean2(imagevar);%估计全局噪声方差%% 书上公式计算得到的滤波结果
image_new=image_expand-(noise./imagevar.*(image_expand-imagemean));
image_new = max(0,min(image_new,255));  %处理到[0,255]
image_new=uint8(image_new);%% matlab源码做了改进,效果差距不是很大
image_new_default=imagemean + (max(0, imagevar - noise) ./max(imagevar, noise)) .* (image_expand - imagemean);
image_new_default=uint8(image_new_default);
%% 画图
figure("color",[1,1,1])
subplot(2,2,1);
imshow(image);
imshow(t2);
title('原图像');
output=mean_filter(image_expand,7);
subplot(2,2,2);
imshow(output);
title('均值滤波处理后结果');subplot(2,2,3);
imshow(image_new);
title('自适应均值滤波处理后结果');subplot(2,2,4);
imshow(image_new_default);
title('修改后的自适应均值滤波处理后结果');% figure("color",[1,1,1])
% image_global_var=image_expand-(global_vars./imagevar.*(image_expand-imagemean));
% image_global_var = max(0,min(image_global_var,255));  %处理到[0,255]
% image_global_var=uint8(image_global_var);
% imshow(image_global_var);
% title('global var自适应均值滤波处理后结果');

子函数:

%自编写均值滤波器
function output=mean_filter(image,n)
%输入image为原始图像,n为滤波器规模n*n,输出为滤波后的图像output
[h,w]=size(image);
imaged=double(image); %转换为double类型
imagedd=imaged;  %初始化滤波结果的规模
a=ones(n,n);
for i=1:h-n+1for j=1:w-n+1pattern=imaged(i:i+n-1,j:j+n-1).*a;means=sum(sum(pattern));imagedd(i+(n-1)/2,j+(n-1)/2)=means/(n*n);end
end
output=uint8(imagedd);
end

3. 结果对比

二、自适应中值滤波

1. 原理部分




2.程序代码

主程序:

gray=imread('5.png');
gray=rgb2gray(gray);   %灰度化
%% 加入噪声
gray_noise=imnoise(gray,'salt & pepper',0.5);
%% 中值滤波
M1 = medfilt2(gray_noise,[3,3]);
%% 自适应中值滤波
f1 = adaptive_median_filter(gray_noise,11);
%%
figure("color",[1,1,1]);
subplot(131)
imshow(gray_noise)
title("gray with noise")
subplot(132)
imshow(M1)
title("中值滤波")
subplot(133)
imshow(f1)
title("自适应中值滤波")

子函数:

function f = adaptive_median_filter (g, Smax)
%% 判断邻域是否合理
if (Smax <= 1) || (Smax/2 == round(Smax/2)) || (Smax ~= round(Smax)) error ('SMAX must be an odd integer > 1.')
end
%%
f = g;
f(:) = 0;
%% 标记是否已处理过
alreadyProcessed = false (size(g));
%% 开始自适应滤波
for k = 3:2:Smax zmin = ordfilt2(g, 1, ones(k, k),'symmetric');zmax = ordfilt2(g, k * k, ones(k, k), 'symmetric'); zmed = medfilt2(g, [k k], 'symmetric');
%% 判断是否进入进程B    processUsingLevelB  = (zmed > zmin) & (zmax > zmed) & ~alreadyProcessed;
%% 若g不是脉冲,保留原值zB = (g > zmin) & (zmax > g); outputZxy = processUsingLevelB & zB;
%% 若是脉冲,用Zmed替换outputZmed = processUsingLevelB & ~zB; f (outputZxy) = g(outputZxy); f (outputZmed) = zmed(outputZmed);
%% 已处理记录alreadyProcessed = alreadyProcessed | processUsingLevelB;
%% 是否退出if all (alreadyProcessed (:)) break; end
end
%% 大于窗口尺寸后,Zxy替换成Zmed输出
f (~alreadyProcessed) = zmed (~alreadyProcessed);
end

3. 结果对比

噪声密度0.2:

噪声密度0.5:

  1. 由图可知,当脉冲噪声的空间密度过大时,中值滤波的性能就不是很好,自适应中值滤波可以处理具有更大概率的脉冲噪声。
  2. 自适应中值滤波平滑非脉冲噪声时试图保留细节,这是 中值滤波器做不到的。

matlab编程实现自适应均值滤波和自适应中值滤波相关推荐

  1. NR基础篇下——中值滤波、多级中值滤波、多级中值混合滤波、加权中值滤波、中值有理滤波

    上一篇分享了一些均值滤波相关的算法,均值滤波作为一种线性滤波器,在滤除噪声的同时也会导致边缘模糊问题.而且均值滤波对高斯噪声的效果很好,但是对于椒盐噪声的效果就很一般.但是中值滤波作为一种顺序滤波器, ...

  2. 均值滤波、中值滤波、混合中值滤波C++源码实例

    1.均值滤波 含义:把每个像素都用周围的8个像素来做均值操作 . 均值滤波器有什么用处呢? 主要还是平滑图像的用处, 有的图像的锐度很高,用这样的均值算法,可以把锐度降低.使得图像看上去更加自然.(只 ...

  3. python手写均值滤波锐化_中值滤波,均值滤波,锐化滤波原理

    1 北京理工大学珠海学院实验报告 ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 班级 学号 姓名 指导教师 成绩 实验题目 实验时间 1. 题目概 ...

  4. python VTK(十五) ----图像平滑 均值滤波 高斯平滑 中值滤波 各向异性滤波

    均值滤波vtkImageConvolve #!/usr/bin/env python # -*- coding:utf-8 -*- import vtk reader = vtk.vtkJPEGRea ...

  5. c语言均值滤波步骤,关于中值滤波算法,以及C语言实现

    中值滤波是一种非线性的图像平滑方法,与均值滤波器以及其他线性滤波器相比,它能够很好地滤除脉冲噪声,同时又能够保护目标图像边缘.它是一种邻域运算, 类似于卷积,但计算的不是加权求和,而是把邻域中的像素按 ...

  6. java 中值滤波_matlab图像处理-中值滤波原理(示例代码)

    中值滤波原理 ??中值滤波本质上是一种统计排序滤波器.对于原图像中某点(i,j),中值滤波以该点为中心的邻域内的所有像素的统计排序中值作为(i,j)点的响应. ??中值不同于均值,是指排序队列中位于中 ...

  7. 数字图像处理——中值滤波中心加权中值滤波

    引言:在处理图像时,线性滤波将破坏边缘,而且不能有效滤除脉冲噪声.非线性滤波基于对输入信号序列的一种非线性映射关系,常可把某一特定的噪声近似映射为零而保留信号的重要特征,因而可以在一定程度上克服线性滤 ...

  8. c++ openvc4.5.5 学习笔记(五)图像平滑滤波几种基本方法(平均滤波blur、高斯平滑滤波GaussianBlur、中值滤波medianBlur、双边滤波bilateralFilter )

    平滑,也称为模糊,是一种简单而经常使用的图像处理操作. 要执行平滑操作,我们将对我们的图像应用过滤器.最常见的滤波器类型是线性的,其中输出像素的值(i.e. g(i,j)),被确定为输入像素值的加权和 ...

  9. Opencv之图像滤波:5.中值滤波(cv2.medianBlur)

    之前介绍的均值滤波.方框滤波.高斯滤波,都是线性滤波方式.由于线性滤波的结果是所有像素值的线性组合,因此含有噪声的像素也会被考虑进去,噪声不会被消除,而是以更柔和的方式存在.这时使用非线性滤波效果可能 ...

  10. python实现中值滤波_Python实现中值滤波去噪方式

    中值滤波器去噪: 中值滤波的主要原理是将数字图像中的某点用该点的邻域中各个像素值的中值所来代替,这样就能让目标像素周围能够更好的接近真实值,比如一张白纸上有一个黑点时,黑点的像素值比较大,经过中值滤波 ...

最新文章

  1. 基于简化点云地图的语义边缘对齐的单目定位方法
  2. hdu 1081 To The Max(最大子段和的升级版,二维)
  3. 四旋翼飞行器旋转矩阵公式推导!
  4. 不同版本Eclipse对JDK版本要求
  5. 【python】排序算法的稳定性冒泡排序(画图详细讲解)
  6. 腾讯汤道生:开源已成为许多技术驱动型产业重要的创新推动力
  7. CSS3 Media Queries在iPhone4和iPad上的运用
  8. 自己整理的openresty安装步骤
  9. 如何分析堆外内存使用情况_堆上与堆外的内存使用情况
  10. javascript之继承
  11. Deformable 3D shape registration based on local similarity transforms
  12. php 文件锁 重发请求,PHP使用文件锁解决高并发问题示例
  13. 区块链技术与微服务架构之间有什么关系?
  14. 【信息安全导论】HIT2022春季学期《信息安全导论》复习概要
  15. Python3.6实现付费酷狗音乐免费下载(已用tkinter封装GUI)
  16. 用CCS分析解读CC3200 SDK工具包的blinky流水灯文件
  17. 熊出没机器人光头强_熊出没:光头强的最强发明,第2件砍树神器,最后1件价值千万!...
  18. OA系统(海信集团)双因素身份认证解决方案
  19. 小学信息技术信息与计算机课件,小学信息技术ppt课件
  20. UC/OS-II(一)资料绪论

热门文章

  1. Grads画等值线(一)-----心得感言
  2. 宝宝树CEO王怀南上市前夕内部信:市场需要有价值的好公司
  3. 如何将浏览器设置对应的国家?
  4. 软件下载去哪下,选择什么样的软件?
  5. 关于keystore 证书转*.x509.pem 和*.pk8
  6. coreseek php接口,筹建coreseek(sphinx+mmseg3)详细安装配置+php之sphinx扩展安装+php调用示例...
  7. 计算机入门基础知识大全
  8. Ios html 离线浏览,离线iOS应用的HTML 5制作指南(2)
  9. 【设计模式-手写源码-附1】-简单工厂模式-基于魔兽争霸冰封王座
  10. 【编写DockerFile构建自己的容器】