《数字图像处理》作业题目.docx
《《数字图像处理》作业题目.docx》由会员分享,可在线阅读,更多相关《《数字图像处理》作业题目.docx(13页珍藏版)》请在冰豆网上搜索。
《数字图像处理》作业题目
数字图像处理作业
班级:
Y100501
******
学号:
*********
一、编写程序完成不同滤波器的图像频域降噪和边缘增强的算法并进行比较,得出结论。
频域降噪。
对图像而言,噪声一般分布在高频区域,而图像真是信息主要集中在低频区,所以,图像降噪一般是利用低通滤波的方法来降噪。
边缘增强。
图像的边缘信息属于细节信息,主要由图像的高频部分决定,所以,边缘增强一般采取高通滤波,分离出高频部分后,再和原频谱进行融合操作,达到边缘增强,改善视觉效果,或者为进一步处理奠定基础的目的。
1频域降噪,主程序如下:
I=imread('lena.bmp');%读入原图像文件
J=imnoise(I,'gaussian',0,0.02);%加入高斯白噪声
A=ilpf(J,0.4);%理想低通滤波
figure,subplot(222);imshow(J);title('加噪声后的图像');
subplot(222);imshow(A);title('理想低通滤波');
B=blpf(J,0.4,4);%巴特沃斯低通滤波
subplot(223);imshow(B);title('巴特沃斯低通滤波');
C=glpf(J,0.4);%高斯低通滤波
subplot(224);imshow(C);title('高斯低通滤波');
用到的滤波器函数的程序代码如下:
functionO=ilpf(J,p)%理想低通滤波,p是截止频率
[f1,f2]=freqspace(size(J),'meshgrid');
hd=ones(size(J));
r=sqrt(f1.^2+f2.^2);
hd(r>p)=0;
y=fft2(double(J));
y=fftshift(y);
ya=y.*hd;
ya=ifftshift(ya);
ia=ifft2(ya);
O=uint8(real(ia));
functionO=blpf(J,d,n)%巴特沃斯低通滤波器,d是截止频率,n是阶数
[f1,f2]=freqspace(size(J),'meshgrid');
hd=ones(size(J));
r=f1.^2+f2.^2;
fori=1:
size(J,1)
forj=1:
size(J,2)
t=r(i,j)/(d*d);
hd(i,j)=1/(t^n+1);
end
end
y=fft2(double(J));
y=fftshift(y);
ya=y.*hd;
ya=ifftshift(ya);
ia=ifft2(ya);
O=uint8(real(ia));
functionO=glpf(J,D)%高斯滤波器,D是截止频率
[f1,f2]=freqspace(size(J),'meshgrid');
r=f1.^2+f2.^2;
Hd=ones(size(J));
fori=1:
size(J,1)
forj=1:
size(J,2)
t=r(i,j)/(D*D);
Hd(i,j)=exp(-t);
end
end
Y=fft2(double(J));
Y=fftshift(Y);
Ya=Y.*Hd;
Ya=ifftshift(Ya);
ia=ifft2(Ya);
O=uint8(real(ia));
运行结果如图1所示。
从结果可以看出,三种滤波器都可以对图像进行降噪,经滤波器滤波后,图像更噪声部分得到抑制,但是细节部分变得模糊。
这是因为,细节信息分布在高频部分,降噪会对图像起到平滑作用,细节部分减弱。
2边缘增强,程序如下:
J=imread('moon.tif');
figure
subplot(121),imshow(J);title('原始图像');
[f1,f2]=freqspace(size(J),'meshgrid');
r=f1.^2+f2.^2;
D=0.3;
Hd=ones(size(J));
fori=1:
size(J,1)
forj=1:
size(J,2)
t=r(i,j)/(D*D);
Hd(i,j)=1-exp(-t);%高斯高通滤波
end
end
Y=fft2(double(J));
Y=fftshift(Y);
Ya=Y.*Hd;%高斯高通滤波
%Ya=ifftshift(Ya);
ia=Y+1.4*Ya;%原始图像频谱加上1.4倍的高频频谱
Ya=ifftshift(ia);
ia=ifft2(Ya);
O=uint8(real(ia));
subplot(122),imshow(O);title('边缘增强后的图像');
运行结果如下图示:
边缘增强采用高斯高通滤波器将高频频谱过滤出来然后乘以1.4倍以后与原图像频谱详加,然后对所得频谱进行反变换得到增强后的图像。
也可以采用其他滤波器,比如巴特沃斯滤波器或者理想高通滤波器等。
从结果可以看出高频加强后图像细节增强,边缘部分更容易分辨。
二、编写程序完成不同锐化方法的图像锐化的算法并进行比较,得出结论。
图像锐化可以分为空域和频域锐化两大类,在此着重讨论空域。
频域锐化可以参考上题中边缘增强部分。
1.拉普拉斯变换锐化。
f=imread('lena.bmp');
w=fspecial('laplacian',0);%生成模版
f2=im2double(f);
g2=imfilter(f2,w,'replicate');
g=f2-g2;
g1=1.3*f2-g2;%高频提升
figure,subplot(131);imshow(f);title('原始图片');
subplot(132);imshow(g);title('标准拉普拉斯锐化');
subplot(133);imshow(g1);title('高频提升锐化');
运行结果如下图所示:
2.梯度算子锐化。
程序如下:
f=imread('coins.png');
h1=fspecial('prewitt');
h2=fspecial('sobel');
h3=fspecial('log');
f2=im2double(f);
g1=imfilter(f2,h1,'replicate');
g2=imfilter(f2,h2,'replicate');
g3=imfilter(f2,h3,'replicate');
figure,subplot(221);imshow(f);title('原始图片');
subplot(222);imshow(g1);title('prewitt算子梯度锐化');
subplot(223);imshow(g2);title('sobel算子梯度锐化');
subplot(224);imshow(g2);title('log算子梯度锐化');
运行结果如下如所示:
从运行结果可以看出,拉普拉斯变换锐化效果明显,高频提升后边缘信息更加清晰,但是也同时可以看出,拉普拉斯锐化会产生很多噪声。
相比较一下,梯度算子没有引入噪声,边缘信息明显,很适合计算机自动检测和识别。
三、编写程序完成同态滤波的算法,得出结论。
同态滤波是把频率过滤和灰度变换结合起来的一种图像处理方法,它依靠图像的照度/反射率模型作为频域处理的基础,利用压缩亮度范围和增强对比度来改善图像的质量。
同态滤波的maitlab实现如下:
clear;
img0=imread('tun.jpg');
%img0=rgb2gray(I);%彩色图像转化为灰度图像
[M,N]=size(img0);
img=double(img0);
img=log(1+img);%取对数
img=fft2(img);%傅立叶变换
img=fftshift(img);%将频域原点移到图像中心
fori=1:
M
forj=1:
N
D(i,j)=sqrt(((i-floor(M/2))^2+(j-floor(N/2))^2));%求距离
end
end
c=4;%锐化参数,可调
Do=150;%一般是方差(滤波器的高通截止频率)
H=(2.0-0.5)*(1-exp(-c*(D.^2/(Do^2))))+0.5;%滤波器函数
whos;
himg=img.*H;
himg=ifftshift(himg);
gimg=ifft2(himg);%逆傅立叶变换
gimg=exp(gimg);%取指数
G=real(gimg);
img=G;
img_min=min(img(:
));img_max=max(img(:
));
img=(img-img_min)/(img_max-img_min);
img=imadjust(img,[01],[01],0.3);
w1=fspecial('gaussian',[5,5],2.3);
img_new=imfilter(img,w1);%高斯滤波
J=histeq(img_new);%直方图均衡化处理
im2=histeq(img);
figure,subplot(121),imshow(img0);title('原始图像');%显示原始图像
subplot(122);imshow(J);title('同态滤波后的图像');%滤波处理过的图像
运行结果如下图示:
程序中为了得到更好的视觉效果,同态滤波后,有进行了空域高斯滤波和直方图均衡化处理。
通过运行结果我们可以看出,经同态滤波后,图像中原本很暗的岩壁更加清晰,图像的亮度范围减小,对比对增强,细节信息增强,视觉效果更好。
四、编写程序完成不同分割方法的图像分割的算法并进行比较,得出结论。
图像分割是图像处理的重要领域,是计算机进一步处理的基础。
笔者完成了两个比较有代表性的图像分割算法,一个是基于灰度的阈值分割,一个是基于边缘信息的分割,分水岭算法进行的图像分割。
1.Otsu法阈值分割图像
clearall
I=imread('coins.png');
subplot(1,2,1),imshow(I);
title('原始图像')
level=graythresh(I);%确定灰度阈值
BW=im2bw(I,level);
subplot(1,2,2),imshow(BW);
title('Otsu法阈值分割图像');
运行结果如下图示:
从运行结果可以看出,Otsu法阈值分割图像对于前景目标和背景灰度差别较大、目标灰度范围较小,的情况下可以实现较为理想的分割。
在一定的领域具有重要应用。
但对背景和目标灰度分布不明显的情况下分割效果不理想。
2.分水岭算法图像分割。
I=imread('rice.png');
f=double(I);
hv=fspecial('prewitt');
hh=hv.';
gv=abs(imfilter(f,hv,'replicate'));
gh=abs(imfilter(f,hh,'replicate'));
g=sqrt(gv.^2+gh.^2);%计算梯度
df=bwdist(f);%计算到最近不为0的点的距离
L1=watershed(df);%分水岭算法
em=L1==0;
im=imextendedmax(f,20);%计算大于某阈值的极大值
g2=imimposemin(g,im|em);%使用形态重构修改强度图像g,使得它在im|em非零的地方只有区域极小值。
L2=watershed(g2);
wr2=L2==0;
f(wr2)=255;
figure,subplot(121);imshow(I);title('原始图像');
subplot(122),imshow(uint8(f));title('分割结果');
运行结果如下图示:
由运行结果可以看出,分水岭算法可以较好的实现图像的分割。
分水岭算法是图像分割的一种重要方法,但是此方法对噪声比较敏感,容易造成过分割现象。
需要进行一定的预处理。
本程序在进行自动标记后效果明显,分割效果比较理想。
五、编写程序完成不同压缩方法的图像压缩的算法并进行比较,得出结论。
图像压缩算法有有损压缩和无损压缩两大类。
无损编码主要是熵编码,典型的有哈夫曼编码,还有利用图像空间冗余的游程编码。
有损编码主要是变换域编码,如DCT变换编码,小波压缩编码等。
笔者完成了而至图像的游程编码和灰度图像的DCT变换编码。
1.游程编码matlab程序如下:
tu1=imread('lena.bmp');%读入图像
tu2=tu1(1:
65536);%将原始图像写成一维的数据并设为tu2
tu2length=length(tu2);%计算tu2的长度
fori=1:
1:
tu2length%for循环,目的在于转换为二值图像
iftu2(i)>=120
tu2(i)=255;
elsetu2(i)=0;
end
end
tu3=reshape(tu2,256,256);%重建二维数组图像,并设为tu3
figure,subplot(121);imshow(tu3);title('原始二值图像');
X=tu3(:
);%令X为新建的二值图像的一维数据组
j=1;
tu4
(1)=1;
forz=1:
1:
(length(X)-1)%游程编码程序段
ifX(z)==X(z+1)
tu4(j)=tu4(j)+1;
else
data(j)=X(z);%data(j)代表相应的像素数据
j=j+1;
tu4(j)=1;
end
end
data(j)=X(length(X));%最后一个像素数据赋给data
tu4length=length(tu4);%计算游程编码后的所占字节数,记为tu4length
%下面程序是游程编码解压
l=1;
form=1:
tu4length
forn=1:
1:
tu4(m);
rec_tu(l)=data(m);
l=l+1;
end
end
rec2_tu=reshape(rec_tu,256,256);%重建二维二维图像数组
subplot(122);imshow(rec2_tu);title('恢复后的图像');%显示解压后的图像
运行结果如下图示:
压缩后数据如下(whos命令):
NameSizeBytesClass
tu41x382630608double
由图可以看出,对于二值图像(或灰度变化不大的灰度图像)可以无失真的压缩,压缩前图像为256*256大小,压缩后为1*3826,压缩效果比较明显。
如果灰度变化较大,则压缩效果不明显,甚至可能会比原来图像还大。
2.DCT变换压缩。
I=imread('lena.bmp');
I=im2double(I);%转换图像矩阵为双精度型。
T=dctmtx(8);%产生二维DCT变换矩阵
B=blkproc(I,[8,8],'P1*x*P2',T,T');%二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个
mask=[11100000
11000000
10000000
00000000
00000000
00000000
00000000
00000000];
B2=blkproc(B,[88],'P1.*x',mask);%只保留DCT变换的10个系数
I2=blkproc(B2,[88],'P1*x*P2',T',T);%重构图像
figure,subplot(1,2,1);imshow(I);title('原始图像');
subplot(1,2,2);imshow(I2);title('压缩图像');
运行结果如下图所示:
从运行结果可以看出,对图像压缩后会产生一定的失真,因为程序主要保留低频系数,所以图像细节部分有失真,但失真不是很明显。
本程序只保留了左上角6个系数,理论上压缩比约达到11:
1。
可见DCT变换编码可以大幅压缩图像。
如果改善滤波的模版,对于高频系数进行阈值处理,而不是简单置零,则可以在保证具有较大压缩比的前提下改善视觉效果。