苏州大学数字图像Matlab上机实验要点.docx
《苏州大学数字图像Matlab上机实验要点.docx》由会员分享,可在线阅读,更多相关《苏州大学数字图像Matlab上机实验要点.docx(14页珍藏版)》请在冰豆网上搜索。
苏州大学数字图像Matlab上机实验要点
《数字图像处理与分析》
实验报告
专业计算机科学与技术
年级10级
姓名
学号
任课老师龚声蓉
指导老师蒋德茂
实验室理工楼243机房
学期2013(春)
苏州大学计算机科学与技术学院统一印制
二零一三年六月
实验一:
空域及频域增强
一.实验目的
(1)了解图像变换的意义和手段;
(2) 熟悉傅里叶变换的基本性质;
(3)通过本实验掌握利用MATLAB编程实现数字图像的傅立叶变换及滤波锐化和复原处理;
(4)了解平滑处理的算法和用途,学习使用均值滤波、中值滤波和拉普拉斯锐化进行图像增强处理的程序设计方法。
二.实验内容
Matlab编程:
实现Butterworth低通滤波和Butterworth高通滤波。
提示:
预设Butterworth的阶等于2,d0=10。
使用cameraman.tif作为原图像。
要求:
使用subplot函数按3行2列分别显示
(1)原始图
(2)傅里叶频谱(3)Butterworth低通滤波(4)低通滤波图(5)Butterworth高通滤波(6)高通滤波图
三.实验分析
(1)Roberts算子用来实现消除图像模糊地增强的方法,即“锐化”。
此处理加强图像的边界和细节。
Roberts算子提出的是在2*2的邻域上计算对角导数产生的偏导数在图像处理中心点上用均值或是绝对值求和的形式结合起来。
但是此算法增强噪声的缺陷也在图像中体现了。
(2)巴特沃思滤波器去的频率和通过的频率之间没有明显的不连续性,图像的模糊程度降低,而且也没有振铃效应,这是由于在低频和高频之间,滤波器平滑过渡的缘故。
四.程序及实验结果
程序代码:
clc,clearall;
I=imread('cameraman.tif');
I=im2double(I);
subplot(3,2,1);imshow(I,[]);%在一张图里依次显示,三行两列
title('原始图');
F=fft2(I);
G=fftshift(F);
subplot(3,2,2);imshow(log(1+abs(G)),[]);
title('傅里叶频谱');
[m,n]=size(G);
c1=floor(m/2);%中心行坐标
c2=floor(n/2);%中心列坐标
d0=10;
fori=1:
m
forj=1:
n
d=sqrt((i-c1)^2+(j-c2)^2);
h=1/(1+(d/d0)^4);
A(i,j)=h*G(i,j);
end
end
subplot(3,2,3);imshow(log(1+abs(A)),[]);
title('Butterworth低通滤波');
d0=10;
fori=1:
m
forj=1:
n
d=sqrt((i-c1)^2+(j-c2)^2);
h=1/(1+(d/d0)^4);
A(i,j)=h*G(i,j);
end
end
f=ifftshift(A);
i=real(ifft2(f));
subplot(3,2,4);imshow(i,[]);
title('低通滤波图');
d0=10;
fori=1:
m
forj=1:
n
d=sqrt((i-c1)^2+(j-c2)^2);
h=1/(1+(d0/d)^4);
A(i,j)=h*G(i,j);
end
end
subplot(3,2,5);imshow(log(1+abs(A)),[]);
title('Butterworth高通滤波');
d0=40;
fori=1:
m
forj=1:
n
d=sqrt((i-c1)^2+(j-c2)^2);
h=1/(1+(d0/d)^4);
B(i,j)=h*G(i,j);
end
end
f=ifftshift(B);
i=real(ifft2(f));
subplot(3,2,6);imshow(i,[]);
title('高通滤波图');
实验结果:
实验二:
图像编码与压缩
一.实验目的
(1)了解图像编码与压缩过程;
(2)实践算数编码及解码的Matlab编程实现;
二.实验内容
Matlab编程:
算术编码及解码。
提示:
已知字符事件出现的概率如下表
表:
数据出现的概率和取值范围
字符
概率
范围
a
0.4
[0.0,0.4)
b
0.4
[0.4,0.8)
c
0.2
[0.8,1.0)
要求:
(1)对输入的字符序列(如‘aabbc’)进行算术编码。
(2)对得到的编码进行解码。
三.实验分析
(1)算术编码方法是将被编码的一则消息或符号串(序列)表示成0和1之间的一个间隔(Interval),即对一串符号直接编码成[0,1]区间上的一个浮点小数。
(2)解码是编码的逆过程。
四.程序及实验结果
程序代码:
clc
clearall
closeall
string_s=input('请按要求输入字符串:
');
[j,k]=size(string_s);
pa=0.4;pb=0.4;pc=0.2;
disp(['输入的字符串是:
',string_s])
formatlong
fori=1:
k
ifi==1
switch1
casestring_s(i)=='a'
a1=0;
a2=0+pa;
casestring_s(i)=='b'
a1=pa;
a2=pa+pb;
casestring_s(i)=='c'
a1=pa+pb;
a2=1;
end
l=a2-a1;
end
if(i>=2)&(i<=k)
switch1
casestring_s(i)=='a'
aa=a1;
ab=a1+l*pa;
a1=aa;a2=ab;
casestring_s(i)=='b'
aa=a1+l*pa;
ab=a1+l*(pa+pb);
a1=aa;a2=ab;
casestring_s(i)=='c'
aa=a1+l*(pa+pb);
ab=a1+l*(pa+pb+pc);
a1=aa;a2=ab;
end
l=a2-a1;
end
end
disp('编码区间的起始值是:
');disp(a1)
disp('编码区间的终止值是:
');disp(a2)
disp('本程序选择区间中点做为编码是:
');disp((a1+a2)/2)
disp('--------------------------------------------------------------')
disp('是否要译码,请选择:
')
disp('1、译码')
disp('2、不译码?
')
disp('说明:
输入相应的数字进行选择')
disp('--------------------------------------------------------------')
YN=input('您的选择是:
');
ifYN==1
bm=(a1+a2)/2;
SuansuJiema(bm,k)
end
ifYN==2
disp('您选择了不译码。
')
end
functionSuansuJiema(bm,num)
formatlong
pa=0.4;pb=0.4;pc=0.2;
i=1;ym={};
ym{1}
(1)=YM(bm);
bm0=bm;
whilei>=1&iswitch1
caseym{1}(i)=='a'
bm0=(bm0-0)/pa;
caseym{1}(i)=='b'
bm0=(bm0-pa)/pb;
caseym{1}(i)=='c'
bm0=(bm0-pa-pb)/pc;
end
i=i+1;
ym{1}(i)=YM(bm0);
end
disp('--------------------------------------------------------------')
disp(['译码结果是:
',ym{1}])
disp('--------------------------------------------------------------')
functionym=YM(A)
pa=0.4;pb=0.4;pc=0.2;
switch1
case0<=A&Aym='a';
casepa<=A&Aym='b';
casepa+pb<=A&A<1
ym='c';
caseA>=1|A<0
disp('该码字为错误编码')
end
实验结果:
实验三:
图像分割
一.实验目的
(1)了解图像编码与压缩过程;
(2)实践算数编码及解码的Matlab编程实现;
二.实验内容
Matlab编程:
图像分割。
按照教科书P181所示的极小值点阈值选取方法,编写MATLAB程序实现图像分割的功能。
提示及要求:
1.请用7点平滑法来对原始图直方图数据进行平滑处理。
2.对于离散的数据,可用差分来替代微分。
3.要求按照下图的多子图格式显示4幅图像,可使用subplot()函数。
4.imhist(I)命令可以显示图像I的直方图。
5.[counts,x]=imhist(I)命令可以把直方图的数据传入counts和x中,其中counts是直方图的纵坐标数据,x是直方图的横坐标数据。
6.plot(x,y)命令可以显示对应x与y的曲线图,x为横轴数据,y为纵轴数据。
7.q=im2bw(I,yuzhi/255)命令可以把图像I依据阈值yuzhi的值转换为二值图。
8.在程序运行过程中要求在MATLAB命令行显示最终计算得到的阈值结果。
三.实验分析
四.程序及实验结果
程序代码:
%针对兔子图用极小值点阈值法进行图像分割
clc,clearall,closeall;
I=imread('rabbit.png');
figure,subplot(2,2,1),imshow(I,[]);
subplot(2,2,2),imhist(I);
[h,x]=imhist(I);
f=h;%f用于存放平滑后的数据
fori=4:
253
f(i)=(h(i-3)+h(i-2)+h(i-1)+h(i)+h(i+1)+h(i+2)+h(i+3))/7;
end
subplot(2,2,3),plot(x,f);
g=h;%g用于存放1阶导数
fori=1:
255
g(i)=h(i+1)-h(i);
end
k=g;%k用于存放2阶导数
fori=1:
255
k(i)=g(i+1)-g(i);
end
fori=1:
256
ifg(i)==0&k(i)>0
yuzhi=i
end
end
q=im2bw(I,yuzhi/255);
subplot(2,2,4),imshow(q);
试验结果:
实验4:
利用Hough变换检测直线
一.实验目的
Matlab也提供了几个Hough变换的函数:
hough、houghpeaks、houghlines,这些函数大大简化了编程复杂度。
请使用这几个函数来编程实现对下图直线划痕的检测。
要求程序的每一句都必须加注释说明。
二.实验内容
1.读入图像 选取有较多直线及部分曲线以作对比的图像作为实验素材。
3.实现Houg变换,检测出图像中的直线 Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。
它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线的识别。
先前对边缘图像进行二值化处理,然后再用hough变换提取直线,最后用颜色标记之。
三.实验分析
四.程序实验结果
实验代码
clear,clc;%清屏
I=imread('划痕2.png');subplot(2,2,1);%显示原来的图像
imshow(I);title('原图像');%原图像名字
Img=edge(I,'prewitt');%利用prewitt算子提取边缘
subplot(2,2,2);Imshow(Img);
title('提取边缘后');%显示提取边缘的图片
[H,T,R]=hough(Img);%hough变换
subplot(2,2,3);imshow(sqrt(H),[]);
title('hough变换');%显示hough变换的结果
P=houghpeaks(H,15,'threshold',ceil(0.3*max(H(:
))));%寻找最大点
lines=houghlines(Img,T,R,P,'FillGap',10,'MinLength',20);%返回找到的直线
subplot(2,2,4);imshow(I);
title('最终结果');%显示标出划痕后的图像
holdon;
max_len=0;
fork=1:
length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:
1),xy(:
2),'LineWidth',2,'Color','green');
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%用不同的颜色显示
end
实验结果: