西交大数字图像处理第六次作业Word文件下载.docx
《西交大数字图像处理第六次作业Word文件下载.docx》由会员分享,可在线阅读,更多相关《西交大数字图像处理第六次作业Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
编程思路:
首先利用imnoise函数给图像添加高斯噪声,之后分别利用算术平均值滤波器和中值滤波器进行滤波并观察效果。
(2)MATLAB函数:
g=imnoise(f,type,parameters)
函数功能:
使用函数imnoise来用噪声污染一幅图像、
调用格式:
J=imnoise(I,type)
J=imnoise(I,type,parameters)
参数Type对应的噪声类型如下:
'
gaussian'
高斯白噪声
localvar'
0均值白噪声
poisson'
泊松噪声
salt&
pepper'
盐椒噪声
speckle'
乘性噪声
(3)处理结果:
1)添加高斯噪声
lena.bmp原始图像lena添加高斯噪声(u=0,s^2=0.01)
lena添加高斯噪声(u=0,s^2=0.05)lena添加高斯噪声(u=0,s^2=0.1)
lena添加高斯噪声(u=0.1,s^2=0.01)lena添加高斯噪声(u=0.5,s^2=0.01)
2)图像恢复(选取被均值为0,方差为0.01的高斯噪声污染的图像为例)
利用算术均值滤波器恢复图像(5x5模板)
lena添加高斯噪声(u=0,s^2=0.01)算术均值滤波的结果
利用中值滤波器恢复图像(5x5模板)
lena添加高斯噪声(u=0,s^2=0.01)中值滤波的结果
(4)结果分析及总结:
①首先通过imnoise函数分别产生了被不同均值和方差的高斯噪声污染的图像。
当高斯噪声均值不变为0时,随着方差增加,图像噪声越严重;
当高斯噪声方差不变时,均值会影响到整个图像的灰度值,使整个图像变亮。
与理论上均值和方差对图像的影响一致。
②分别使用算术均值滤波器和中值滤波器对加噪图像进行恢复。
两种方法在一定程度上都可以降低噪声。
算术均值滤波器降低噪声的同时也模糊了图像。
2、推导维纳滤波器并实现下边要求;
(a)实现模糊滤波器如方程Eq.(5.6-11).
(b)模糊lena图像:
45度方向,T=1;
(c)再模糊的lena图像中增加高斯噪声,均值=0,方差=10pixels以产生模糊图像;
(d)分别利用方程Eq.(5.8-6)和(5.9-4),恢复图像。
1)维纳滤波器的推导:
图像的退化模型为:
(1)
其中,s(n1,n2)为原始图像,b(n1,n2)为退化函数,w(n1,n2)为噪声函数,x(n1,n2)为退化
的图像。
并假设s与w不相关,w为0均值的平稳随机过程。
图像的复原模型为:
(2)
其中,
为恢复的图像,
为恢复滤波器。
误差度量为:
(3)
基于正交性原理,若要求误差最小,则必有下式成立:
(4)
将(3)式带入(4)式有:
(5)
即
(6)
换元得:
(7)
等式两端同时取傅里叶变换得:
(8)
(9)
公式(8)中
(10)
公式(10)两端同时取傅里叶变换得:
(11)
(12)
公式(12)两端同时取傅里叶变换:
(13)
将(11)式和(13)式带入(8)式得
(14)
将符号化成与书中一致的表示
(15)
故表达式由下式给出
(16)
2)约束最小二乘方滤波
对于约束最小二乘方滤波,期望是找一个最小准则函数C,定义如下:
(17)
其约束为
(18)
其中,
是欧几里得向量范数,
是未退化图像的估计。
这个最佳问题在频率域中的解决由下面的表达式给出:
(19)
其中,
是一个参数,必须对它进行调整以满足式(18)的条件,P(u,v)是函数
(20)
的傅里叶变换。
1)imfilter
功能:
对任意类型数组或多维图像进行滤波。
用法:
B=imfilter(A,H)
B=imfilter(A,H,option1,option2,...)
或写做g=imfilter(f,w,filtering_mode,boundary_options,size_options)
其中,f为输入图像,w为滤波掩模,g为滤波后图像。
filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。
boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。
具体参数选项见下表:
选项
描述
filtering_mode
‘corr’
通过使用相关来完成,该值为默认。
‘conv’
通过使用卷积来完成。
boundary_options
‘X’
输入图像的边界通过用值X(无引号)来填充扩展,其默认值为0。
‘replicate’
图像大小通过复制外边界的值来扩展。
‘symmetric’
图像大小通过镜像反射其边界来扩展。
‘circular’
图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
size_options
‘full’
输出图像的大小与被扩展图像的大小相同
‘same’
输出图像的大小与输入图像的大小相同。
这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。
2)fspecial
fspecial函数用于建立预定义的滤波算子。
h=fspecial(type)
h=fspecial(type,para)
其中type指定算子的类型,para指定相应的参数;
type
'
average'
averagingfilter为均值滤波,参数为hsize代表模板尺寸,默认值为[33]
disk'
circularaveragingfilter为圆形区域均值滤波,参数为radius代表区域半径,默认值为5.
Gaussianlowpassfilter为高斯低通滤波,有两个参数,hsize表示模板尺寸,默认值为[33],sigma为滤波器的标准值,单位为像素,默认值为0.5.
laplacian'
laplacianfilter为拉普拉斯算子,参数alpha用于控制算子形状,取值范围为[0,1],默认值为0.2。
log'
LaplacianofGaussianfilter
为拉普拉斯高斯算子,有两个参数,hsize表示模板尺寸,默认值为[33],sigma为滤波器的标准差,单位为像素,默认值为0.5.
motion'
motionfilter为运动模糊算子,有两个参数,表示摄像物体逆时针方向以theta角度运动了len个像素,len的默认值为9,theta的默认值为0;
prewitt'
Prewitthorizontal
edge-emphasizingfilter
用于边缘增强,大小为[33],无参数
sobel'
Sobelhorizontal
用于边缘提取,无参数
unsharp'
unsharpcontrastenhancementfilter为对比度增强滤波器。
参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2.
(a)实现模糊滤波器如方程Eq.(5.6-11).
模糊滤波器的频域表达式为:
故实现该滤波器,只需先将输入图像进行傅里叶变换并移至图像中心,之后将图像的傅
里叶变换和模糊滤波器的傅里叶变换进行阵列相乘,将得到的结果经过傅里叶反变换返
回到空间域即可实现该滤波器。
具体程序见附件mohu_filter.m
(b)模糊lena图像:
(a=0.1,b=0.1;
T=1)
lena.bmp原始图像lena运动模糊的结果(a=0.1,b=0.1;
lena.bmp原始图像lena运动模糊的结果(调用MATLAB中的函数)
(c)再模糊的lena图像中增加高斯噪声,均值=0,方差=10pixels以产生模糊图像;
lena运动模糊的结果(a=0.1,b=0.1;
T=1)添加高斯噪声的结果(均值为0,方差为0.01)
lena运动模糊的结果(MATLAB版)添加高斯噪声的结果(MATLAB版)
维纳滤波的结果:
lena运动模糊+高斯噪声.bmp维纳滤波结果(K=0.06)
维纳滤波结果(K=0.01)维纳滤波结果(K=0.5)
lena运动模糊+高斯噪声(MATLAB版)维纳滤波结果(MATLAB版)
约束最小二乘方滤波的结果:
lena运动模糊+高斯噪声(MATLAB版)约束最小二乘滤波结果(MATLAB版)
(3)结果分析及总结:
①首先分别通过自己编写的模糊函数和MATLAB中提供的imfilter和fspecial函数配合使用对图像lena进行了模糊滤波。
发现套用书上的公式图像是斜向下45度运动模糊,而MATLAB中函数模糊的结果是斜向上45度运动模糊,不过这不是重点可以接受,模糊的基本效果还是一致的。
之后调用imnoise函数对两幅图像加入高斯噪声,得到第二问的结果。
②之后分别使用自己编写的函数和MATLAB中提供的deconvwnr函数进行维纳滤波。
调用MATLAB中函数滤波后的图像得到了一定的改善,运动模糊的影响基本被消除,但噪声的影响仍然较大,导致图像质量下降;
对于自己编写的维纳滤波函数,难点在于寻找令信噪比最大的K值,报告中显示了部分K值对应的滤波结果,其中K=0.06,为信噪比最大时的滤波结果,从结果看,视觉上的效果并不是很理想,要想达到更好的效果可能需要寻找更加合适的K值。
③最后采用MATLAAB提供的deconvreg函数进行约束最小二乘方滤波。
从滤波后的结果看,约束最小二乘方滤波得到了比维纳滤波更好的结果,尤其是对噪声的滤除。
由于实在是没看懂书上的公式应该怎么实现,所以只好调用函数了。
尤其实P(u,v)的维数和其他几个矩阵的维数不同,怎么遍历啊?
附录
【参考文献】
[1]冈萨雷斯.数字图像处理(第三版)北京:
电子工业出版社,2011
[2]周品.MATLAB数字图像处理北京:
清华大学出版社,2012
[3]杨杰.数字图像处理及MATLAB实现北京:
电子工业出版社,2010
【源代码】
add_gaussian_noise.m(题目1添加高斯噪声)
I=imread('
lena.bmp'
);
figure
(1);
imshow(I);
title('
源图像lena.bmp'
imwrite(I,'
lena原始图像.bmp'
I2=imnoise(I,'
0.5,0.01);
figure
(2);
imshow(I2);
加入gaussian噪声后的lena.bmp'
imwrite(I2,'
lena加入gaussian噪声后(u=0.5,s^2=0.01).bmp'
suanshujunzhi_filter.m(题目1算术均值滤波恢复图像)
lena_gaussian_noise.bmp'
lena加入gaussian噪声后(u=0,s^2=0.01).bmp'
n=5;
h=1/n^2.*ones(n,n);
I2=conv2(I,h,'
same'
I2=uint8(I2);
算术均值滤波的结果(5x5)'
算术均值滤波的结果(5x5).bmp'
median_filter.m(题目1中值滤波恢复图像)
a=ones(n,n);
p=size(I);
x1=double(I);
x2=x1;
fori=1:
p
(1)-n+1
forj=1:
p
(2)-n+1
c=x1(i:
i+(n-1),j:
j+(n-1));
e=c(1,:
foru=2:
n
e=[e,c(u,:
)];
end
mm=median(e);
x2(i+(n-1)/2,j+(n-1)/2)=mm;
end
I2=uint8(x2);
中值滤波的结果(5x5)'
中值滤波的结果(5x5).bmp'
mohu_filter.m(题目2运动模糊滤波器)
lena.bmp原始图像'
f=double(I);
F=fft2(f);
F=fftshift(F);
[M,N]=size(F);
a=0.1;
b=0.1;
T=1;
foru=1:
M
forv=1:
NH(u,v)=(T/(pi*(u*a+v*b)))*sin(pi*(u*a+v*b))*exp(-sqrt(-1)*pi*(u*a+v*b));
G(u,v)=H(u,v)*F(u,v);
G=ifftshift(G);
g=ifft2(G);
g=256.*g./max(max(g));
g=uint8(real(g));
imshow(g);
运动模糊化lena.bmp'
imwrite(g,'
lena运动模糊的结果.bmp'
Wiener_filter.m(题目2维纳滤波器自编版)
lena运动模糊+高斯噪声.bmp'
lena运动模糊+高斯噪声'
g=double(I);
G=fft2(g);
G=fftshift(G);
[M,N]=size(G);
K=0.0259;
F(u,v)=1/H(u,v)*(abs(H(u,v)))^2/((abs(H(u,v)))^2+K)*G(u,v);
F=ifftshift(F);
f=ifft2(F);
f=256.*f./max(max(f));
f=uint8(real(f));
imshow(f);
维纳滤波的将结果'
imwrite(f,'
维纳滤波的结果(K=0.0259).bmp'
wiener_filter_k.m(题目2维纳滤波器寻找信噪比最大的K值)
i=1;
formatlong
fork=0.01:
0.01:
0.11
foru=1:
F(u,v)=(1/H(u,v))*((abs(H(u,v)))^2/((abs(H(u,v)))^2+k))*G(u,v);
F=ifftshift(F);
f=ifft2(F);
f=256.*f./max(max(f));
f=uint8(real(f));
figure;
imshow(f);
title('
维纳滤波的结果'
e=f-uint8(g);
SNR(i)=sum(sum(g.^2))/sum(sum(e.^2));
i=i+1;
idx=find(max(SNR))
wiener_filter_matlab.m(题目2维纳滤波器MATLAB版)
H=fspecial('
50,45);
I1=imfilter(I,H,'
circular'
'
conv'
imshow(I1);
运动模糊后的lena.bmp(角度为45度)'
imwrite(I1,'
lena运动模糊(调用matlab中的函数).bmp'
I2=imnoise(I1,'
0,0.01);
figure
(2)
加噪并模糊的lena.bmp'
lena运动模糊+高斯噪声(调用matlab中的函数0.bmp'
figure(3);
noise=imnoise(zeros(size(I)),'
NSR=sum(noise(:
).^2)/sum(im2double(I(:
)).^2);
I3=deconvwnr(I2,H,NSR);
imshow(I3);
imwrite(I3,'
lena维纳滤波的结果(调用MATLAB中的函数).bmp'
yueshuzuixiaercheng_filter_matlab.m(题目2约束最小二乘滤波(MATLAB版))
h=fspecial('
I1=imfilter(I,h,'
lena运动模糊+高斯噪声(MATLAB版).bmp'
V=0.0001;
NoisePower=V*prod(size(I));
[g,LAGRA]=deconvreg(I1,h,NoisePower);
约束最小二乘滤波的结果(MATLAB版)'
约束最小二乘滤波的结果(MATLAB版).bmp'