图像处理作业(四)

题目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. 实验结果

 

  

图1  实验运行效果

 

为了比较自定义函数wienerFilter和系统自带的wiener2函数维纳滤波的效果,将两张图做差得到如下图像:

图2  自定义函数与wiener2函数结果差值图像

 

可以看出,除了在边缘上灰度值有略微的差别,在图像其他部分,自定义函数都实现了较好的滤波效果,与自带函数基本一致。

未经允许禁止转载~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值