题目1. 以lena图像为例,编程实现小波域维纳滤波(具体算法见十二讲ppt)小波变换可以使用matlab自带的dwt2.
1. 基于小波的维纳滤波算法原理
假设图像的观测模型 ,满足最大后验概率模型,即求解
在维纳滤波中 和 都满足高斯分布。
而模型中方差的估计由如下式子给出:
2. 算法步骤
Step1:
首先需要对原始图像进行高斯噪声的叠加,得到一张带有噪声的图像,再调用编写的wienerFilter函数进行维纳滤波的处理。
Step2:
在主要的wienerFilter函数中,首先使用matlab自带的dwt2函数进行噪声图像的小波分解,分解的尺度为3次,如下述代码所示:
[CA,CH,CV,CD] = dwt2(img_noise,'bior2.2');
[CA2,CH2,CV2,CD2] = dwt2(CA,'bior2.2');%再对低通CA进行分解
[CA3,CH3,CV3,CD3] = dwt2(CA2,'bior2.2');
其中,CA, CH, CV,CD分别为低频分量,水平高频,垂直高频,对角线高频。而高频的值(CH, CV,CD)包含在一个元组中。
Step3:
再对每次迭代产生的CH,CV,CD三个高频分量进行方差 的估计,此时调用的是编写的calParameter函数,其计算的代码如下。
function CX = calParameter(CX)
%CALPARAMETER :模型中方差的估计
% CX为传入的高频分量
Yi = sort(CX(:));
[col,cow] = size(CX);
M=col*cow;
HH= CX(:);% 将二维矩阵扁平化
m = median(abs(HH));%取中值
sigma_n = m/0.6745;% 计算的得到sigma_n
sigma = sum(sum(Yi.^2))/(M) - sigma_n*sigma_n;
CX = CX*(sigma/(sigma_n^2+sigma));
end
Step4:
计算完CH,CV,CD三个高频分量之后,利用matlab自带的idwt函数进行小波逆变换,与低频进行重构复原。
3. 代码
(1)main函数测试代码
Main函数用于调用,其代码如下所示:
clc;
img = imread('lena.jpg');
imshow(img);
title('原始图像');
img_nose=imnoise(img,'gaussian',0,0.01);% 对原始图像添加高斯噪声
imshow(img_nose);
result=wienerFilter(img_nose);
imshow(uint8(result));
title('自定义函数wienerFilter维纳滤波');
K1=wiener2(img_nose,[3 3]);
imshow(K1);
title('自带的wiener2函数滤波效果');
imshow(uint8(result)-K1,[]);
title('差值图像');
(2)完整的wienerFilter函数
function X0 = wienerFilter(img_noise)
%wienerFilter 用于对图像进行维纳滤波
% 1. 使用dwt2函数进行小波分解,分解三次后
[CA,CH,CV,CD] = dwt2(img_noise,'bior2.2');
[CA2,CH2,CV2,CD2] = dwt2(CA,'bior2.2');%再对低通CA进行分解
[CA3,CH3,CV3,CD3] = dwt2(CA2,'bior2.2');
% (cA, (cH, cV, cD))分别为低频分量,水平高频,垂直高频,对角线高频。而高频的值包含在一个元组中
% 2 . 再进行维纳滤波,使用自定义的calParameter函数对方差进行估计等
CH3=calParameter(CH3);
CV3=calParameter(CV3);
CD3=calParameter(CD3);
CH2=calParameter(CH2);
CV2=calParameter(CV2);
CD2=calParameter(CD2);
CH=calParameter(CH);
CV=calParameter(CV);
CD=calParameter(CD);
% 3. 计算完CH,CV,CD三个高频分量之后,利用idwt小波逆变换,与低频进行重构复原。
X2 = idwt2(CA3,CH3,CV3,CD3,'bior2.2');
X1 = idwt2(X2(1:131,1:131),CH2,CV2,CD2,'bior2.2');
X0 = idwt2(X1,CH,CV,CD,'bior2.2'); %X0为重建完成的图像
end
(3)模型方差估计的calParameter函数
function CX = calParameter(CX)
%CALPARAMETER :模型中方差的估计
% CX为传入的低频高频分量
Yi = sort(CX(:));
[col,cow] = size(CX);
M=col*cow;
HH= CX(:);% 将二维矩阵扁平化
m = median(abs(HH));%取中值
sigma_n = m/0.6745;% 计算的得到sigma_n
sigma = sum(sum(Yi.^2))/(M) - sigma_n*sigma_n;
CX = CX*(sigma/(sigma_n^2+sigma));
end
4. 实验结果
![](https://i-blog.csdnimg.cn/blog_migrate/7607932e84370960d0c3dc4776292446.png)
为了比较自定义函数wienerFilter和系统自带的wiener2函数维纳滤波的效果,将两张图做差得到如下图像:
![](https://i-blog.csdnimg.cn/blog_migrate/3874a94ab1f7e2a5160556a333a11734.png)
可以看出,除了在边缘上灰度值有略微的差别,在图像其他部分,自定义函数都实现了较好的滤波效果,与自带函数基本一致。
未经允许禁止转载~