Wiener滤波器---MATLAB

Wiener滤波器---MATLAB_第1张图片

%% Wiener滤波器
clc,clear,close all  % 清理命令区、清理工作区、关闭显示图形
warning off       % 消除警告
feature jit off      % 加速代码运行
[filename ,pathname]=...
    uigetfile({'*.bmp';'*.tif';'*.jpg';},'选择图片'); %选择图片路径
str=[pathname filename]; % 合成路径+文件名
im = imread(str);        % 读图
im = imnoise(im,'gaussian',0,1e-3); % 原图像 + 白噪声

SNR = 0.0001;   % 信噪比
resim = Wiener(im, 1.2, 30,SNR);       % 逆滤波
figure,
subplot(121),imshow(im);title('原始图像')
colormap(jet)  % 颜色
shading interp % 消隐
subplot(122),imshow(resim,[]);title('Wiener滤波图像')
colormap(jet)  % 颜色
shading interp % 消隐
function resim = Wiener(ifbl, LEN, THETA, SNR)
% Wiener滤波器
%函数输入: 
%         ifbl:  输入的图像矩阵
%         LEN:   模糊旋转长度,模糊的像素个数
%         THETA: 模糊旋转角
%         SNR:信噪比
%函数输出: 
%         resim: 重构滤波图像

ifbl = medfilt2(abs(ifbl));%中值滤波
fbl = fft2(ifbl); % 转化到频域
% 点扩展函数PSF
PSF = fspecial('motion',LEN,THETA);
% 转化PSF函数到期望的维数 光传递函数OTF
OTF = psf2otf(PSF,size(fbl));
OTFC = conj(OTF);   % 共轭操作
modOTF = OTF.*OTFC; % 平方 
% 检测是否存在0值,若为0,则置为0.000001
for i = 1:size(OTF, 1)
    for j = 1:size(OTF, 2)
        if OTF(i, j) == 0
            OTF(i, j) = 0.000001;
        end
    end
end
% 使用Wiener滤波器公式,去模糊图像
debl = ((modOTF./(modOTF+SNR))./(OTF)).*fbl;
lbed = ifft2(debl);    % 傅里叶反变换
resim = lbed;          % 重构滤波图像

你可能感兴趣的:(数据可视化,MATLAB可视化,可视化,matlab,图论,几何学,矩阵,线性代数)