图像复原MATLAB实现
前言:本篇博客先介绍滤波器滤除噪声,再介绍滤波器复原,侧重于程序的实现。
一:三种常见的噪声
二:空间域滤波
空间域滤波复原是在已知噪声模型的基础上,对噪声的空间域进行滤波。
空间域滤波复原方法主要包括:
均值滤波器
算术均值滤波器
几何均值滤波器
谐波均值滤波器
逆谐波均值滤波器
顺序统计滤波器
中值滤波器
最大值/最小值滤波器
2.1算数均值滤波器
img=imread('D:/picture/ZiXia.jpg');
img=rgb2gray(img);
figure,imshow(img);//原图
img_noise=double(imnoise(img,'gaussian',0.06));
figure,imshow(img_noise,[]);//含有高斯噪声的图
img_mean=imfilter(img_noise,fspecial('average',));//滤波后的图
figure;imshow(img_mean,[]);
2.2几何均值滤波器
img=imread('cameraman.tif');
img=rgb2gray(img);
figure,imshow(img);
img_noise=double(imnoise(img,'gaussian',0.06));
figure,imshow(img_noise,[]);
img_mean=exp(imfilter(log(img_noise+),fspecial('average',)));
figure;imshow(img_mean,[]);
2.3谐波均值滤波器
2.4逆谐波均值滤波器
采用逆谐波均值滤波器对附加胡椒噪声图像进行滤波的matlab程序如下:
img=imread('cameraman.tif'); figure,imshow(img);
[M,N]=size(img);R=imnoise2('salt & pepper',M,N,0.1,);
img_noise=img;img_noise(R==)=;
img_noise=double(img_noise); figure,imshow(img_noise,[]);
Q=1.5;
img_mean=imfilter(img_noise.^(Q+),fspecial('average',))./imfilter(img_noise.^Q,fspecial('average',));
figure;imshow(img_mean,[]);
采用逆谐波均值滤波器对附加盐噪声图像进行滤波的matlab程序如下:
img=imread('csboard.tif');figure,imshow(img);
[M,N]=size(img);R=imnoise2('salt & pepper',M,N,,0.1);
img_noise=img;img_noise(R==)=;
img_noise=double(img_noise); figure,imshow(img_noise,[]);
Q=-1.5;
img_mean=imfilter(img_noise.^(Q+),fspecial('average',))./imfilter(img_noise.^Q,fspecial('average',));
figure;imshow(img_mean,[]);
2.5中值滤波器
img=imread('cameraman.tif');
img_noise=double(imnoise(img,'salt & pepper',0.06));
img_mean=imfilter(img_noise,fspecial('average',));
img_median=medfilt2(img_noise);%一次中值滤波
img_median2=medfilt2(img_median);%二次中值滤波
2.6最大值,最小值滤波器
利用最大值滤波器消除胡椒噪声污染图像的matlab程序如下。
img=imread('csboard.tif');
[M,N]=size(img);
R=imnoise2('salt & pepper',M,N,0.1,);
img_noise=img;
img_noise(R==)=;
img_noise=double(img_noise);
imwrite(uint8(img_noise),'csbord_pepper.jpg');
img_max=imdilate(img_noise,ones(,));
imwrite(uint8(img_max),'cameraman_saltpepper_max.jpg');
利用最小值滤波器消除盐噪声污染图像的matlab程序如下。
img=imread('csboard.tif');
[M,N]=size(img);
R=imnoise2('salt & pepper',M,N,,0.1);
img_noise=img;
img_noise(R==)=;
img_noise=double(img_noise);
imwrite(uint8(img_noise),'csbord_salt.jpg');
img_min=imerode(img_noise,ones(,));
imwrite(uint8(img_min),'cameraman_saltpepper_min.jpg');
2.7带阻滤波器
I=imread('pout.tif');
[m,n]=size(I);
J=I;
for i=:m
for j=:n
J(i,j)=I(i,j)+*sin(*i)+*sin(*j);%增加周期性噪声
end
end
IF=fftshift(fft2(I));
JF=fftshift(fft2(J));
IF=log(+abs(IF));
JF=log(+abs(JF)); subplot()%显示频谱
imshow(IF,[])
subplot()
imshow(JF,[])
%高斯带阻滤波器构造
fbrf=ones(m,n);
for i=:m
for j=:n
fbrf(i,j)=-exp(-0.5*(((i-m/)^+(j-n/)^-^)/(sqrt(i.^+j.^)*))^);%20为带阻中心,5为带宽
end
end
H=fbrf;
%频率域滤波
f=fftshift(fft2(J));
out=f.*H;%频率域滤波
out=ifft2(ifftshift(out));
out=abs(out);
out=out/max(out(:));%归一化【,】
subplot()
imshow(out,[]);
subplot()
imshow(J,[])
2.8带通滤波器
2.9陷波滤波器
clear;
close all;
src = im2double(imread('D:/picture/ZiXia.jpg'));
src = rgb2gray(src);
subplot()
imshow(src);
title('原始图像');
[w h] = size(src);
srcf = fft2(src);
srcf = fftshift(srcf);
subplot()
imshow(srcf);
% 低通滤波
% flt = zeros(size(src));
% rx1 = w/;
% ry1 = h/;
% r = min(w,h)/;
% for i = :w
% for j = :h
% if(rx1-i)^ +(ry1 - j)^ <= r*r
% flt(i,j) = ;
% end
% end
% end
% 陷波滤波
flt = ones(size(src));
r = min(w,h)/;
rx1 = r
ry1 =h/
for i = :w
for j = :h
if(rx1-i)^ +(ry1 - j)^ <= r*r
flt(i,j) = ;
end
if(w-rx1-i)^ +(h-ry1 - j)^ <= r*r
flt(i,j) = ;
end
end
end
subplot()
imshow(flt);
title('滤波器图像');
dfimg = srcf.*flt;
dfimg = ifftshift(dfimg);
dimg = ifft2(dfimg,'symmetric');
subplot()
imshow(dimg):title('滤波后');
2.9逆滤波
image_o=imread('D:/picture/lenagray.jpg');
subplot(,,);
imshow(image_o);
title('原图像');
%频率域退化图像,退化函数H(u,v)=exp(-0.0025*( (u-M/).^+(v-N/).^).^(/) )
%傅里叶变换
f=im2double(image_o);
F=fft2(f);
F=fftshift(F);
%执行退化
[M,N]=size(F);
[u,v]=meshgrid(:M,:N);%生成二维坐标系
H=exp(-0.0025* ( (u-M/).^+(v-N/).^).^(/) );
F=F.*H;
%傅里叶反变换
X=ifftshift(F);
x=ifft2(X);
x=uint8(abs(x)*);
subplot(,,);
imshow(x);
%
title('退化图像'); image_d=x;
%直接逆滤波图像复原 ff=im2double(image_d);%将图像灰度值归一化到0-1之间 % 傅里叶变换
f_Id=fft2(ff);
f_Id=fftshift(f_Id);
fH_Id=f_Id;
[M,N]=size(fH_Id);
% 逆滤波
threshold=;
if threshold>M/
%全滤波
fH_Id=fH_Id./(H+eps);
else
%对一定半径范围内进行滤波
for i=:M
for j=:N
if sqrt((i-M/).^+(j-N/).^)<threshold
fH_Id(i,j)=fH_Id(i,j)./(H(i,j)+eps);
end
end
end
end % 执行傅立叶逆变换
fH_Id1=ifftshift(fH_Id);
f_new=ifft2(fH_Id1);
f_new=uint8(abs(f_new)*);
subplot(,,);
imshow(f_new);
title('滤波半径=78的逆滤波复原图像');
2.10维纳滤波
直接截图了,没敲
图像复原MATLAB实现的更多相关文章
- Atitit MATLAB 图像处理 经典书籍attilax总结
Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...
- 图像质量评价指标之Matlab实现
在图像处理算法研究中,很多时候需要有客观评价指标来对算法的性能进行评价. 比如,在图像复原.图像滤波算法研究中,需要采用客观评价指标来定量的来测试算法恢复出的图像相对于参考图像的好坏程度. 本文介绍文 ...
- [家里蹲大学数学杂志]第057期图像复原中的改进 TV 模型
$\bf 摘要$: 本文给出了王大凯等编的<图像处理中的偏微分方程方法>第 6.2 节的详细论述. $\bf 关键词$: 图像复原; TV 模型; matlab 编程 1. 前言 图像在形 ...
- Matlab图像处理教程
虽然典型算法的开发是基于理论支持的,但这些算法的实现几乎总是要求参数估计,并常常进行算法修正与候选求解方案的比较. MATLAB由LINPACK和EISPACK项目开发,最初用于矩阵处理.今天,MAT ...
- 数字图像处理实验(13):PROJECT 05-04,Parametric Wiener Filter 标签: 图像处理MATLAB 2017-05-27 10:59
实验要求: Objective: To understand the high performance of the parametric Wiener Filter in image restora ...
- 数字图像处理学习笔记之一 DIP绪论与MATLAB基础
写在前面的话 数字图像处理系列的学习笔记是作者结合上海大学计算机学院<数字图像处理>课程的学习所做的笔记,使用参考书籍为<冈萨雷斯数字图像处理(第二版)(MATLAB版)>,同 ...
- 数字图像处理原理与实践(MATLAB版)勘误表
本文系<数字图像处理原理与实践(MATLAB版)>一书的勘误表. [内容简单介绍]本书全面系统地介绍了数字图像处理技术的理论与方法,内容涉及几何变换.灰度变换.图像增强.图像切割.图像去噪 ...
- [00]数字图像处理-matlab速成
原本听的是mooc武汉大学的数字图像处理课程,但是无奈老师读ppt的能力太强,不太适应,后面的课程对于实验方面的要求甚低,无奈之下到处找课程,终于找到了一个适合自己的教程<王伟强-数字图像处理& ...
- Matlab 绘制三维立体图(以地质异常体为例)
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
随机推荐
- linux操作练习题
linux操作练习题 一.总结 一句话总结: 多练练一下子就会了,很简单的 1.在当前目录下建立文件exam.c,将文件exam.c拷贝到/tmp这个目录下,并改名为 shiyan.c? touch ...
- 02-Nov-2017 07:11:56.475 信息 [http-nio-8080-exec-10] com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource. Initializing c3p0 pool...
报错: 02-Nov-2017 07:11:56.475 信息 [http-nio-8080-exec-10] com.mchange.v2.c3p0.impl.AbstractPoolBackedD ...
- hive 总结二
本文参考:黑泽君相关博客 本文是我总结日常工作中遇到的坑,结合黑泽君相关博客,选取.补充了部分内容. 查询函数(Hive高级) NVL(cloumn,replace_with) 如果cloumn为NU ...
- 第二十一篇:spring怎么做缓存
项目背景:你可能遇情景:1.一个做统计的页面,每次刷新需要调接口做查询 ,是联表查询,查出来的数据还需要做一些计算或者加工,不算页面上的图表插件,刷新一次,延迟个几秒钟才出的来2. 一个统计接口如此 ...
- 石子合并问题 /// 区间DP oj2025
Description 在一个圆形操场的四周摆放着n堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的两堆石子合并成新的一堆,并将新得的这堆石子数记为该次合并的得分. 试设计一个算法,计算出 ...
- 数据类中引用virtual
public class City { [Key] public int CityID { set; get; } [Display(Name = "城市名称")] [Requir ...
- 论文翻译——Fast-R-CNN(端到端开篇, End to end)
快速的区域卷积网络方法(Fast R-CNN) 论文地址:https://arxiv.org/abs/1504.08083 摘要: 本文提出一种基于快速的区域卷积网络方法(Fast R-CNN) ...
- 廖雪峰Java11多线程编程-2线程同步-4wait和notify
wait和notify synchronized解决了多线程竞争的问题 我们可以在synchronized块中安全的对一个变量进行修改,但是它没有解决多线程协调的问题. 例如设计一个TaskQueue ...
- Oracle使用语句块之循环插入数据
1.业务要求: 将oracle表A的整表的数据一次性导入到表B中 , 以A_ID为外键关联. (*******如果开发环境和实际生产环境的数据一致,而且数据量比较小情况,可以直接手动添加数据; ** ...
- html 引入公共的头部和底部