(a) 编写一个给图像中添加高斯噪声的程序,程序的输入参数为噪声的均值与方差。
(b) 编写程序实现公式(5.6-11)所示的污损滤波;
(c) 如图5.26(b)所示,对图像5.26(a) 进行+45o 方向,T = 1 的污损滤波;
(d) 对污损后的图像加入均值为0,方差为10 的高斯噪声;
(e) 编写程序使用公式(5.8-6)所示的参数维纳滤波对图像进行恢复。
1、高斯噪声
高斯噪声是指概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等等。
在空间域和频率域中,由于高斯噪声在数学上的易处理性,故实践中常用这种噪声模型。
高斯随机变量z的PDF由上式给出,其中z表示灰度值,u表示z的均值,σ表示z的方差。当z服从高斯分布时,其值有大约70%落在范围[(u-σ),(u+σ)]内,有大约95%落在范围[(u-2σ),(u+2σ)]内。
在MATLAB中,通常使用randn()函数来产生标准正态分布的随机数或矩阵。
2、污损滤波
通过均匀线性运动模糊对图像进行污损滤波。假定图像只在x方向以给定的速度x0(t)=at/T 做匀速直线运动。当 t=T 时,图像位移的总距离为a,则有
若允许y分量也随着变化,按 y0=bt/T 给出的运动,则退化函数变为
3、参数维纳滤波
维纳滤波又称最小均方滤波,是一种综合了退化函数和噪声统计特征进行复原处理的方法。它是一种基于最小均方误差准则、对平稳过程的最优估计器。这种滤波器的输出与期望输出之间的均方误差为最小,因此,维纳滤波是一个最佳滤波系统,可用于提取被平稳噪声所污染的信号。
该方法建立在图像和噪声都是随机变量的基础上,目标是找到未污染图像f的一个估计,使它们之间的均方误差最小。这种误差度量为:
当未退化图像的功率谱未知或者是不能估计时,通常使用的一种方法是由下面的表达式来近似:
其中,K是一个加到|H(u,v)|2的所有项上的特定常数。
% --------------------------实验要求------------------------------------------
img = imread('Fig5.26(a).jpg'); % 原图像
img_fouling = fouling_filter(img,0.1,0.1,1); % 污损滤波
img_gaussian_10 = gaussian_noise(img_fouling,0,10); % 高斯噪声
img_wiener = wiener_filter(img,img_gaussian_10,0.1); % 维纳滤波
subplot(3,1,1);imshow(img);title('原图像');
subplot(3,1,2);imshow(img_fouling);title('污损滤波: +45°,T=1');
subplot(3,1,3);imshow(img_gaussian_10); title('高斯噪声: 均值0,方差10');
figure;
imshow(img_wiener);title('维纳滤波图像');
% ------------------------ 高斯噪声比较-----------------------------------------
img_gaussian_100 = gaussian_noise(img_fouling,0,100); % 均值0,方差100
img_gaussian_1000 = gaussian_noise(img_fouling,0,1000); % 均值0,方差1000
figure;
subplot(2,1,1);imshow(img_gaussian_100); title('高斯噪声: 均值0,方差100(仅作对比)');
subplot(2,1,2);imshow(img_gaussian_1000);title('高斯噪声: 均值0,方差1000(仅作对比)');
% ------------------------ 调整合适参数-----------------------------------------
img_fouling = fouling_filter(img,0.01,0.01,1); % 污损滤波
img_gaussian_10 = gaussian_noise(img_fouling,0,10); % 高斯噪声
img_wiener = wiener_filter(img,img_gaussian_10,0.1); % 维纳滤波
figure;
subplot(3,1,1);imshow(img_fouling);title('污损滤波: +45°,T=1');
subplot(3,1,2);imshow(img_gaussian_10);title('高斯噪声: 均值0,方差10');
subplot(3,1,3);imshow(img_wiener);title('调整参数后的维纳滤波图像');
% ------------------------MATLAB自带函数------------------------------------
psf = fspecial('motion',25,45);
mf = imfilter(img,psf,'circular','conv');
noise = imnoise(img,'gaussian',0,10);
mfn = mf + noise;
nsr = sum(noise(:).^2)/sum(mf(:).^2);
img_out = deconvwnr(mfn,psf,nsr);
figure;
subplot(3,1,1);imshow(mf);title('Matlab自带污损滤波');
subplot(3,1,2);imshow(mfn);title('Matlab添加高斯噪声');
subplot(3,1,3);imshow(img_out);title('Matlab自带维纳滤波');
% -------------------------------------------END-----------------------------------------------
% --------------------------------------污损滤波-----------------------------------------------
function img_fouling = fouling_filter(img,a,b,T)
[M,N] = size(img);
F = fft2(img);
for u = 1:M
for v = 1:N
K(u,v) = pi * (u * a + v * b);
H(u,v) = T * sin(K(u,v)) * exp(-1j * K(u,v))/K(u,v);
G(u,v) = H(u,v) * F(u,v);
end
end
img_fouling = ifft2(G);
img_fouling = uint8(abs(img_fouling));
end
% ----------------------------------给图像添加高斯噪声-----------------------------------
function img_noise = gaussian_noise(img,mean,var)
[M,N] = size(img);
add_noise = mean + randn(M,N)*sqrt(var);
img_noise = img + uint8(add_noise);
end
% --------------------------------------维纳滤波-----------------------------------------------
function img_wiener = wiener_filter(img_src,img_degradation,K)
[M,N] = size(img_src);
S = fft2(img_src);
G = fft2(img_degradation);
for u = 1:M
for v = 1:N
H(u,v) = G(u,v)/S(u,v);
F(u,v) = 1/H(u,v)*(abs(H(u,v)))^2/((abs(H(u,v)))^2+K)*G(u,v);
end
end
img_wiener = ifft2((F));
img_wiener = uint8(abs(img_wiener));
end