赞
踩
本人第一次写博客,有生疏或者错误欢迎批评交流,提前谢谢包容~。(matlab版本2021a)
本文主要用大作业要求的均值滤波、中值滤波、高斯低通滤波器、巴特沃斯低通滤波器、小波变换等方法进行图像的去噪处理
重点结构为main.m和tiSgrcfilter.m,函数有点多,建议先看这两个m文件
- %main.m
- clear;
- clc;
- close all;
- %% 输入图像
- barbara= imread('原始图像/barbara.png');lena= imread('原始图像/lena.png');peppers256= imread('原始图像/peppers256.png');
- lena_salt = imread('椒盐噪声/lena_salt-pepper.png');peppers256_salt = imread('椒盐噪声/peppers256_salt-pepper.png');barbara_salt = imread('椒盐噪声/barbara_salt-pepper.png');
- lena_gaussian=imread('高斯噪声/lena_gaussian.png');peppers256_gaussian=imread('高斯噪声/peppers256_gaussian.png');barbara_gaussian=imread('高斯噪声/barbara_gaussian.png');
- peppers256_speckle=imread('乘性噪声/peppers256_speckle.png');lena_speckle=imread('乘性噪声/lena_speckle.png');barbara_speckle=imread('乘性噪声/barbara_speckle.png');
- %% 加入噪声及滤波器
- %lena salt
- [g]=tiSgrcfilter(lena,lena_salt);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(1,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %lena gaussian
- [g]=tiSgrcfilter(lena,lena_gaussian);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(2,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %lena speckle
- [g]=tiSgrcfilter(lena,lena_speckle);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(3,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %barbara_salt
- [g]=tiSgrcfilter(barbara,barbara_salt);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(4,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %barbara_gaussian
- [g]=tiSgrcfilter(barbara,barbara_gaussian);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(5,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %barbara_speckle
- [g]=tiSgrcfilter(barbara,barbara_speckle);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(6,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %peppers256_salt
- [g]=tiSgrcfilter(peppers256,peppers256_salt);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(7,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %peppers256_gaussian
- [g]=tiSgrcfilter(peppers256,peppers256_gaussian);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(8,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
- %peppers256_speckle
- [g]=tiSgrcfilter(peppers256,peppers256_speckle);
- [M,N,a]=size(g);
- for i=1:a
- m=g(:,:,i);
- [PSNR(9,i),o(i)]=tiSgrc_psnr(lena,M,N,g(:,:,i));
- end
-
- %% 数据处理
- figure;
- x=1:1:6;
- [M1,N1]=size(PSNR);
- ylim([0 40]) %y轴显示的范围,根据需要调整
- ylabel('PSNR数值','FontName', '宋体','FontSize',18)
- bar1=PSNR';
- GO = bar(bar1,1,'EdgeColor','black');
- % 图例
- legend({'lena salt','lena gaussian','lena speckle','barbara salt','barbara gaussian','barbara speckle','peppers256 salt','peppers256 gaussian','peppers256 speckle'},'fontsize',18);
- set(gca,'Xticklabel', ["均值滤波","中值滤波","高斯低通滤波","Butterworth低通滤波器","小波变换","PCA"]) ;%gca 坐标的句柄
- xlabel('滤波器','fontsize',18,'FontName','宋体','Fontweight','bold');
- title("各滤波器针对不同噪声不同图像效果对比",'Fontsize',20);

图1中除了两个重要的文件外,还用到了psnr评估标准,如下
如果只是想知道效果,那么PSNR具体是什么不用太留意,知道PSNR越高说明去噪效果越好即可。
- %tiSgrc_psnr.m
- function [PSNR,o]=tiSgrc_psnr(H,height,width,g)%H原始图像,height图像矩阵行,width图像矩阵列,g去噪后图像的图像\
- o=0;
- p=0;
- for i=1:height
- for j=1:width
- o=o+(double(H(i,j))-double(g(i,j)))^2;
- end
- end
- p=255^2/(o/(height*width));
- p=double(p);
- p1=log(p);
- p1=p1/log(10);
- PSNR=p1*10;
小结
本次上传的代码比较简单,可以做一个初学者的了解进行,但是深入研究还是需要具体的理论分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。