Matlab---图像滤波之各种滤波器汇总实现
来源:互联网 发布:sql定义变量 编辑:程序博客网 时间:2024/06/03 09:20
1 打开图片
所有的滤波原始图片均使用下面的操作方式打开(只处理灰度图像):
% 读取图像 可以处理彩色多通道图片(转化为灰度图像) [FileName,PathName,FilterIndex] = uigetfile({'*.png;*.jpg;*.jpeg';'*.*'},'选择一幅待处理图片'); filename = fullfile(PathName, FileName) ; SrcImg = imread(filename); % setappdata(0,'SrcData',SrcImg); % 获取图像的信息 [m n channels] = size(SrcImg); if(channels > 1) % 将彩色图象转为灰度图像 SrcImg = rgb2gray(SrcImg); % 将灰度图像数据保存到SrcImg变量中,即后面滤波需要用到的原始数据,此时没有加噪声 setappdata(0,'SrcImg',SrcImg); imshow(SrcImg); else % 将灰度图像数据保存到SrcImg变量中,即后面滤波需要用到的原始数据,此时没有加噪声 setappdata(0,'SrcImg',SrcImg); imshow(SrcImg); end
2 创建我们需要的噪声
对原始图像进行加噪声处理,即操作SrcImg
:
% 获取原始图像数据 SrcImg = getappdata('SrcImg'); % 变换 f = mat2gray(SrcImg,[0 255]); % 获取图像大小信息 [M,N] = size(f); %% 高斯噪声 a = 0; b = 0.08; n_gaussian = a + b .* randn(m,n); g_gaussian = f + n_gaussian; % show image figure(); imshow(g_gaussian,[0 1]); % 保存图片 imwrite(g_gaussian,'gaussianNoise.jpg','jpg'); xlabel('Ruselt of Gaussian noise'); %% 瑞利噪声 a = -0.2; b = 0.03; n_rayleigh = a + (-b .* log(1 - rand(M,N))).^0.5; g_rayleigh = f + n_rayleigh; % show image figure(); imshow(g_rayleigh,[0 1]); imwrite(g_rayleigh,'rayleighNoise.jpg','jpg'); xlabel('Ruselt of rayleigh noise'); %% 伽马噪声 a = 25; b = 3; n_Erlang = zeros(M,N); for j=1:b n_Erlang = n_Erlang + (-1/a)*log(1 - rand(M,N)); end g_Erlang = f + n_Erlang; % show image figure(); imshow(g_Erlang,[0 1]); imwrite(g_Erlang,'erlangNoise.jpg','jpg'); xlabel('Ruselt of erlang noise'); %% 均匀噪声 a = 0; b = 0.3; n_Uniform = a + (b-a)*rand(M,N); g_Uniform = f + n_Uniform; % show image figure(); imshow(g_Uniform,[0 1]); imwrite(g_Uniform,'uniformNoise.jpg','jpg'); xlabel('Ruselt of uniform noise'); %% 椒盐噪声 a = 0.05; b = 0.05; x = rand(M,N); g_sp = zeros(M,N); g_sp = f; g_sp(find(x<=a)) = 0; g_sp(find(x > a & x<(a+b))) = 1; % show image figure(); imshow(g_sp,[0 1]); imwrite(g_sp,'saltNoise.jpg','jpg'); xlabel('Ruselt of salt pepper noise');
加噪结果:
原始图像:
椒盐噪声:
高斯噪声:
均匀噪声:
伽马噪声:
瑞利噪声:
3 开始滤波处理(空域和频域)
开始滤波了,通过上面的创建噪声并保存下了各种噪声的图像,接下来要用各种滤波方式将各种噪声降低,显然先要打开各个噪声图像,打开方式同第一节,这里不对各个滤波方式和原理讲解。
低通滤波:f为加噪图像
f = mat2gray(f,[0 255]); [M,N] = size(f); P = 2*M; Q = 2*N; fc = zeros(M,N); for x = 1:1:M for y = 1:1:N fc(x,y) = f(x,y) * (-1)^(x+y); end end F = fft2(fc,P,Q); H_1 = zeros(P,Q); H_2 = zeros(P,Q); for x = (-P/2):1:(P/2)-1 for y = (-Q/2):1:(Q/2)-1 D = (x^2 + y^2)^(0.5); D_0 = 100; H_1(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^2); H_2(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^6); end end G_1 = H_1 .* F; G_2 = H_2 .* F; g_1 = real(ifft2(G_1)); g_1 = g_1(1:1:M,1:1:N); g_2 = real(ifft2(G_2)); g_2 = g_2(1:1:M,1:1:N); for x = 1:1:M for y = 1:1:N g_1(x,y) = g_1(x,y) * (-1)^(x+y); g_2(x,y) = g_2(x,y) * (-1)^(x+y); end end %% 显示图像 figure(); imshow(g_2,[0 1]);
高斯平滑:f为加噪图像
f=double(f); f=fft2(f); f=fftshift(f); [m,n]=size(f); d0=80; m1=fix(m/2); n1=fix(n/2); for i=1:m for j=1:n d=sqrt((i-m1)^2+(j-n1)^2); h(i,j)=exp(-d^2/2/d0^2); end end g=f.*h; g=ifftshift(g); g=ifft2(g); g=mat2gray(real(g)); %% 显示图像 figure(); imshow(g);
自适应中值滤波:f为噪声图像
f = mat2gray(f,[0 255]); [M,N] = size(f); g_sp = f; x = linspace(-0.2,1.2,358); h = hist(g_sp,x)/(M*N); Histogram = zeros(358,1); for y = 1:256 Histogram = Histogram + h(:,y); end %% S_max = 7; w = zeros(S_max,S_max); w(round(S_max/2),round(S_max/2)) = 1; g_Ex = imfilter(g_sp,w,'symmetric','full'); g_Admf = zeros(M,N); S = 3; for x = 4:M+3 for y = 4:N+3 % A for S = 3:2:S_max S_xy = zeros(S,S); for s = 1:1:S for t = 1:1:S S_xy(s,t) = g_Ex(x+s-round(S/2),y+t-round(S/2)); end end z_min = min(S_xy(:)); z_max = max(S_xy(:)); z_med = median(S_xy(:)); A_1 = z_med - z_min; A_2 = z_med - z_max; if ((A_1>0)&&(A_2<0)) % B B_1 = g_Ex(x,y) - z_min; B_2 = g_Ex(x,y) - z_max; if((B_1>0)&&(B_2<0)) g_Admf(x-3,y-3) = z_med;break; else g_Admf(x-3,y-3) = z_med; break; end end if(S >= S_max) g_Admf(x-3,y-3) = z_med; break; end end end end %% 显示结果 figure(); imshow(g_Admf,[0,1]);
维纳滤波:
afterFilter = wiener2(f,[7 7]); figure(); imshow(afterFilter);
最大值滤波、中值滤波、最小值滤波:调节参数即可,5相当于中值滤波
afterFilter = ordfilt2(f,5,ones(3,3)); figure(); imshow(afterFilter); 复合滤波: ```matlab afterFilter1 = ordfilt2(f,5,ones(3,3)); h_gaosi1=fspecial('gaussian',3,1); afterFilter2 = imfilter(afterFilter1,h_gaosi1); afterFilter3 = wiener2(afterFilter2,[7 7]); figure(); imshow(afterFilter3);
部分结果:
1 0
- Matlab---图像滤波之各种滤波器汇总实现
- Matlab---图像滤波之各种滤波器汇总实现
- 图像滤波处理:均值、中值滤波器实现
- 图像滤波处理:频域滤波器实现
- 图像滤波处理:空间滤波器实现
- [图像]中值滤波(Matlab实现)
- 图像滤波与滤波器基础知识
- [图像]高斯滤波(Matlab实现)
- Matlab图像处理之均值滤波
- matlab实现图像滤波——高斯滤波
- matlab实现图像滤波——高斯滤波
- 图像滤波—高斯滤波——MATLAB实现
- 图像处理--图像滤波与滤波器
- 【Matlab学习笔记】【图像滤波去噪】以-4,-8为中心的拉普拉斯滤波器
- 图像算法之十二:非局部均值滤波及其Matlab实现
- matlab图像滤波
- [matlab 图像处理] 滤波
- matlab图像滤波
- 细谈struts2(十)ognl概念和原理详解
- JavaScript学习笔记三
- Eclipse连接虚拟机数据库IO接口错误问题
- Qt error : "No Target Architecture"
- Jersey下载 文件名中文不显示
- Matlab---图像滤波之各种滤波器汇总实现
- 配置vagrant和一下命令集合
- MySQL权限篇之REFERENCES以及外键级联操作
- js html/body/div tag test
- 细谈struts2(十一)OGNL表达式的基本语法和用法
- hadoop生态系统学习之路(四)MR支持的输入文件格式以及输出文件格式
- 细谈struts2(十二)struts2国际化底层大揭秘
- HDU 1242 Rescue(bfs+优先队列)
- 细谈struts2(十三)struts2实现文件上传和下载详解