太原理工大学数字图像处理实验.docx
《太原理工大学数字图像处理实验.docx》由会员分享,可在线阅读,更多相关《太原理工大学数字图像处理实验.docx(34页珍藏版)》请在冰豆网上搜索。
太原理工大学数字图像处理实验
本科实验报告
课程名称:
数字图像处理
实验项目:
实验一空域图像增强技术
实验地点:
起点机房
专业班级:
通信1002学号:
学生:
指导教师:
2013年6月1日
实验一空域图像增强技术
一、实验目的
1结合实例学习如何在视频显示程序中增加图像处理算法;
2理解和掌握图像的线性变换和直方图均衡化的原理和应用;
3了解平滑处理的算法和用途,学习使用均值滤波、中值滤波和拉普拉斯锐化进行图像增强处理的程序设计方法;
4了解噪声模型及对图像添加噪声的基本方法。
二、实验原理
1灰度线性变换就是将图像中所有点的灰度按照线性灰度变换函数进行变换。
2直方图均衡化通过点运算将输入图像转换为在每一级上都有相等像素点数的输出图像。
按照图像概率密度函数PDF的定义:
通过转换公式获得:
3均值(中值)滤波是指在图像上,对待处理的像素给定一个模板,该模板包括了其周围的临近像素。
将模板中的全体像素的均值(中值)来代替原来像素值的方法。
4拉普拉斯算子如下:
拉普拉斯算子首先将自身与周围的8个像素相减,表示自身与周围像素的差异,再将这个差异加上自身作为新像素的灰度。
三、实验步骤
1启动MATLAB程序,对图像文件分别进行灰度线性变换(参考教材50页,例4.1)、直方图均衡化(参考教材56页,例4.6)、均值滤波(参考教材60页,例4.9)、中值滤波(参考教材64页,例4.11)和梯度锐化操作(参考教材66页,例4.12)。
添加噪声,重复上述过程观察处理结果。
2记录和整理实验报告
四、实验仪器
1计算机;
2MATLAB程序;
3记录用的笔、纸。
五、实验报告容
1、对图像文件进行灰度线性变换
程序:
I=imread('RX01.jpg');
subplot(1,2,1);imshow(I);title(‘原图’);
I=double(I);
[M,N]=size(I);
fori=1:
M
forj=1:
N
ifI(i,j)<=30
I(i,j)=I(i,j);
elseifI(i,j)<=150
I(i,j)=(200-30)/(150-30)*(I(i,j)-30)+30;
else
I(i,j)=(255-200)/(255-150)*(I(i,j)-150)+200;
end
end
end
end
subplot(122);imshow(uint8(I));
结果:
加椒盐噪声再处理的结果:
2、直方图均衡化
II=imread('RX02.jpg');
subplot(221);imshow(I);
subplot(222);imhist(I)
I1=histeq(I);
subplot(223);imshow(I1);
subplot(224);imhist(I1);
结果:
加椒盐噪声再处理的结果:
3、均值滤波
I=imread('45.gif');
[M,N]=size(I);
x=1;
II1=zeros(M,N);
fori=1:
16
II(:
:
i)=imnoise(I,'gaussian',0,0.01);
II1=II1+double(II(:
:
i));
ifor(or(i==1,i==4),or(i==8,i==16));
subplot(2,2,x);imshow(uint8(II1/i));title(num2str(x));
x=x+1;
end;
end
结果:
加椒盐噪声再处理的结果:
4、中值滤波
I=imread('34.gif');
J=imnoise(I,'salt&pepper',0.02);
subplot(231),imshow(I);title('原始图像');
subplot(232),imshow(J);title('添加椒盐噪声图像')
k1=medfilt2(J);
k2=medfilt2(J,[5,5]);
k3=medfilt2(J,[7,7]);
k4=medfilt2(J,[9,9]);
subplot(233),imshow(k1);title('3x3模板中值滤波');
subplot(234),imshow(k2);title('5x5模板中值滤波');
subplot(235),imshow(k3);title('7x7模板中值滤波');
subplot(236),imshow(k4);title('9x9模板中值滤波');
结果:
5、梯度锐化操作
I=imread('20.gif');
subplot(131);imshow(I)
H=fspecial('Sobel');
H=H';
TH=filter2(H,I);
subplot(132),imshow(TH,[]);
H=H';
TH=filter2(H,I);
subplot(133),imshow(TH,[])
结果:
加椒盐噪声再处理的结果:
六、思考题
1.设定不同的斜率值和截距,显示效果会怎样?
答:
设定不同的斜率值和截距,可对任一灰度区间进行扩展和压缩。
2.直方图均衡化是什么意思?
它的主要用途是什么?
答:
直方图均衡化就是通过变换函数将原图像的直方图修正为平坦的直方图,以此来修正原图像之灰度值。
它的主要用途是达到清晰图像的目的。
3.均值(中值)滤波的模板大小对处理效果有什么影响?
答:
模板尺寸越大,噪声减小的效果越显著。
当所用平滑模板尺寸增大时,对噪声的消除效果也有所增强,但同时会带来图像的模糊,边缘细节逐步减少
本科实验报告
课程名称:
数字图像处理
实验项目:
实验二图像几何变换
实验地点:
起点机房
专业班级:
通信1002学号:
学生:
指导教师:
2013年6月1日
实验二图像几何变换
一、实验目的
1结合实例学习如何在视频显示程序中增加图像处理算法;
2理解和掌握图像的平移、垂直镜像变换、水平镜像变换、缩放和旋转的原理和应用;
二、实验原理
1初始坐标为(
)的点经过平移(
,
),坐标变为(
,
),两点之间的关系为:
,以矩阵形式表示为:
2图像的镜像变换是以图象垂直中轴线或水平中轴线交换图像的变换,分为垂直镜像变换和水平镜像变换,两者的矩阵形式分别为:
3图像缩小和放大变换矩阵相同:
当
时,图像缩小;
时,图像放大。
4图像旋转定义为以图像中某一点为原点以逆时针或顺时针方向旋转一定角度。
其变换矩阵为:
该变换矩阵是绕坐标轴原点进行的,如果是绕一个指定点(
)旋转,则现要将坐标系平移到该点,进行旋转,然后再平移回到新的坐标原点。
三、实验步骤
1启动MATLAB程序,对图像文件分别进行生成、失真和校正;(参考教材100页,例5.8,例5.9)
2记录和整理实验报告
四、实验仪器
1计算机;
2MATLAB程序;
3记录用的笔、纸。
五、实验报告容
1生成原始图像,失真图像
f=checkerboard(24);
figure
(1);imshow(f);title('原始图像');
s=0.7;
theta=pi/6;
T=[s*cos(theta)s*sin(theta)0
-s*sin(theta)s*cos(theta)0
001];
tform=maketform('affine',T);
g1=imtransform(f,tform,'nearest');
figure
(2);imshow(g1);title('失真图像');
结果:
选择连接点:
cpselect(g1,f);
还原并输出结果:
六、思考题
1.改变水平和垂直的偏移量,观察显示?
2.改变缩放比例,看看效果如何?
3.改变旋转角度,显示效果会怎么样?
本科实验报告
课程名称:
数字图像处理
实验项目:
实验三图像压缩编码技术
实验地点:
起点机房
专业班级:
学号:
学生:
指导教师:
2013年6月9日
实验三图像压缩编码技术
一、实验目的
1、理解有损压缩和无损压缩的概念;
2、理解图像压缩的主要原则和目的;
3、了解几种常用的图像压缩编码方式;
4、利用MATLAB程序进行图像压缩编码。
二、实验原理
1、图像压缩原理
图像压缩主要目的是为了节省存储空间,增加传输速度。
图像压缩的理想标准是信息丢失最少,压缩比例最大。
不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。
压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。
信息的冗余量有许多种,如空间冗余,时间冗余,结构冗余,知识冗余,视觉冗余等,数据压缩实质上是减少这些冗余量。
高效编码的主要方法是尽可能去除图像中的冗余成分,从而以最小的码元包含最大的图像信息。
编码压缩方法有许多种,从不同的角度出发有不同的分类方法,从信息论角度出发可分为两大类。
(1)冗余度压缩方法,也称无损压缩、信息保持编码或熵编码。
具体说就是解码图像和压缩编码前的图像严格相同,没有失真,从数学上讲是一种可逆运算。
(2)信息量压缩方法,也称有损压缩、失真度编码或烟压缩编码。
也就是说解码图像和原始图像是有差别的,允许有一定的失真。
应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下3类:
(1)无损压缩编码种类
哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempelzev编码。
(2)有损压缩编码种类
预测编码,DPCM,运动补偿;
频率域方法:
正交变换编码(如DCT),子带编码;
空间域方法:
统计分块编码;
模型方法:
分形编码,模型基编码;
基于重要性:
滤波,子采样,比特分配,向量量化;
(3)混合编码。
有JBIG,H.261,JPEG,MPEG等技术标准。
本实验主要利用MATLAB程序进行赫夫曼(Huffman)编码和行程编码(RunLengthEncoding,RLE)。
三、实验步骤
1打开计算机,启动MATLAB程序;
2选择一幅图像,并进行赫夫曼和行程编码压缩处理;
3将原图像在Photoshop软件中打开,分别以不同的位图文件格式进行“另保存”,比较它们的数据量。
4记录和整理实验报告
四、实验仪器
1计算机;
2MATLAB、Photoshop等程序;
3移动式存储器(软盘、U盘等)。
4记录用的笔、纸。
五、实验报告容
1、霍夫曼编码
主程序
X=imread('5.gif');
data=uint8(X);
[zipped,info]=huffencode(data);
unzipped=huffdecode(zipped,info);
subplot(121);imshow(X);
subplot(122);imshow(unzipped);
cr=info.ratio
whosIunzippedzipped
子程序:
huffencode
function[zipped,info]=huffencode(vector)
if~isa(vector,'uint8')
error('inputargumentmustbeauint8vector');
end
[m,n]=size(vector);
vector=vector(:
)';
f=frequency(vector);%计算各符号出现的概率
symbols=find(f~=0);
f=f(symbols);
[f,sortindex]=sort(f);
%将符号按照出现的概率大小排序
symbols=symbols(sortindex);
len=length(symbols);
symbols_index=num2cell(1:
len);
codeword_tmp=cell(len,1);
whilelength(f)>1%生产Huffman树,得到码字编码表
index1=symbols_index{1};
index2=symbols_index{2};
codeword_tmp(index1)=addnode(codeword_tmp(index1),uint8(0));
codeword_tmp(index2)=addnode(codeword_tmp(index2),uint8
(1));
f=[sum(f(1:
2))f(3:
end)];
symbols_index=[{[index1,index2]}symbols_index(3:
end)];
[f,sortindex]=sort(f);
symbols_index=symbols_index(sortindex);
end
codeword=cell(256,1);
codeword(symbols)=codeword_tmp;
len=0;
forindex=1:
length(vector)%得到整个图像所有比特数
len=len+length(codeword{double(vector(index))+1});
end
string=repmat(uint8(0),1,len);
pointer=1;
forindex=1:
length(vector)%对输入图像进行编码
code=codeword{double(vector(index))+1};
len=length(code);
string(pointer+(0:
len-1))=code;
pointer=pointer+len;
end
len=length(string);
pad=8-mod(len,8);
%非8整数倍时,最后补pad个0
ifpad>0
string=[stringuint8(zeros(1,pad))];
end
codeword=codeword(symbols);
codelen=zeros(size(codeword));
weights=2.^(0:
23);
maxcodelen=0;
forindex=1:
length(codeword)
len=length(codeword{index});
iflen>maxcodelen
maxcodelen=len;
end
iflen>0
code=sum(weights(codeword{index}==1));
code=bitset(code,len+1);
codeword{index}=code;
codelen(index)=len;
end
end
codeword=[codeword{:
}];
%计算压缩后的向量
cols=length(string)/8;
string=reshape(string,8,cols);
weights=2.^(0:
7);
zipped=uint8(weights*double(string));
%码表存储到一个稀疏矩阵
huffcodes=sparse(1,1);
forindex=1:
nnz(codeword)
huffcodes(codeword(index),1)=symbols(index);
end
%填写解码时所需的结构信息
info.pad=pad;
info.huffcodes=huffcodes;
info.ratio=cols./length(vector);
info.length=length(vector);
info.maxcodelen=maxcodelen;
info.rows=m;
info.cols=n;
%huffdecode函数对输入矩阵vector进行Huffman编码,
%返回解压后的图像数据
End
huffdecode
functionvector=huffdecode(zipped,info,image)
if~isa(zipped,'uint8')
error('inputargumentmustbeauint8vector');
end
%产生0,1序列,每位占一个字节
len=length(zipped);
string=repmat(uint8(0),1,len.*8);
bitindex=1:
8;
forindex=1:
len
string(bitindex+8.*(index-1))=uint8(bitget(zipped(index),bitindex));
end
string=logical(string(:
)');
len=length(string);
%开始解码
weights=2.^(0:
51);
vector=repmat(uint8(0),1,info.length);
vectorindex=1;
codeindex=1;
code=0;
forindex=1:
len
code=bitset(code,codeindex,string(index));
codeindex=codeindex+1;
byte=decode(bitset(code,codeindex),info);
ifbyte>0
vector(vectorindex)=byte-1;
codeindex=1;
code=0;
vectorindex=vectorindex+1;
end
end
%vector=reshape(vector,info.rows,info.cols);
%函数addnode添加节点
End
frequency
functionf=frequency(vector)
if~isa(vector,'uint8')
error('inputargumentmustbeauint8vector');
end
f=repmat(0,1,256);
len=length(vector);
forindex=0:
255
f(index+1)=sum(vector==uint8(index));
end
f=f./len;
%函数decode返回码字对应的符号
End
decode
functionbyte=decode(code,info)
byte=info.huffcodes(code);
end
addnode
functioncodeword_new=addnode(codeword_old,item)
codeword_new=cell(size(codeword_old));
forindex=1:
length(codeword_old)
codeword_new{index}=[itemcodeword_old{index}];
end
%函数frequency计算各符号出现的概率
End
2、行程编码
主程序:
I=imread('5.gif');%读入图像数据
[zipped,info]=RLEncode(I);%调用RLE进行编码
unzipped=RLEdecode(zipped,info);%调用解码程序进行编码
%显示原始图像和经编码解码后的图像,显示压缩比,并计算均方根误差得erms=0,表示ELE是无失真编码
subplot(121);imshow(I);
subplot(122);imshow(unzipped);
%erms=compare(I(:
),unzipped(:
))
cr=info.ratio
whosIunzippedzipped
子程序:
RLEncode
function[zipped,info]=RLEncode(vector)
[m,n]=size(vector);
vector=vector(:
)';
L=length(vector);
c=vector
(1);e(1,1)=c;e(1,2)=0;%e(:
1)存放灰度,e(:
2)存放行程
t1=1
forj=1:
L
if((vector(j)==c))
e(t1,2)=double(e(t1,2))+1;
else
c=vector(j);
t1=t1+1;
e(t1,1)=c;
e(t1,2)=1;
end
end
zipped=e;
info.rows=m;
info.cols=n;
[m,n]=size(e);
info.ratio=m*n/(info.rows*info.cols);
RLEecode
functionunzipped=RLEecode(zip,info)
zip=uint8(zip);
[m,n]=size(zip);
unzipped=[];
fori=1:
m
section=repmat(zip(i,1),1,double(zip(i,2)));
unzipped=[unzippedsection];
end
unzipped=reshape(unzipped,info.rows,info.cols);%程序结束
六、思考题
1.图像中哪些信息是主要的,哪些信息是次要的?
答:
需要传达给别人的部分是主要的。
其他是次要的。
例如肖像图片,肖像部分是主要的,其背景是次要的。
为了证明当时的场景,场景就是主要的了,而人物就变成次要的。
描述风景,人物是次要的,背景是主要的。
主要和次要是相对的。
没有绝对的主要,也没有绝对的次要。
2.简述赫夫曼编码和行程编码的原理。
答:
赫夫曼编码:
先统计数据中各字符出现的概率,再按字符出现频率高低的顺序分别赋以由短到长的代码,从而保证文件整体的大部分字符是由较短的编码所构成。
行程编码:
行程编码又称行程长度编码(RunLengthEncoding,RLE),是一种熵编码,其编码原理是将具有相同值的连续串用其串长和一个代表值来代替,该连续串就称为行程,串长称为行程长度。
本科实验报告
课程名称:
数字图像处理
实验项目:
实验四图像分割
实验地点:
起点机房
专业班级:
通信1002学号:
学生:
指导教师:
2013年6月9日
实验四图像分割
一、实验目的
理解和掌握图像分割的基本理论和算法,练习使用形态学、区域、边界和阀值的方法结合图像增强复原的相关知识点对图像进行分割处理。
二、实验原理
1、膨胀和腐蚀是二值形态学的基本操作,其中膨胀是是将与目标区域的背景点合并到该目标物中,使目标物边界向外部扩的处理;而腐蚀则是一种消除连通域的边界点,使边界向收缩的处理。
贴标签是对不同连通域区分