图像处理与分析实验指导文档格式.docx
《图像处理与分析实验指导文档格式.docx》由会员分享,可在线阅读,更多相关《图像处理与分析实验指导文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
2002.
实验要求(设计要求)
按下列步骤设计和实现直方图均衡化:
列出原始图像的灰度级,其中L是灰度级的个数.
统计各灰度级的像素数目.
计算原始图像直方图各灰度级的频数,其中n为原始图像总的像素数目.
计算累积分布函数.
应用以下公式计算映射后的输出图像的灰度级,P为输出图像灰度级的个数:
其中,INT为取整符号
6.统计映射后各灰度级的像素数目.
7.计算输出直方图.
8.用的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像.
实验(设计)仪器设备和材料清单
1.计算机1台/每人
考核形式
1.验收调试结果;
2.实验报告
实验报告要求
1.技术路线;
2.MATLAB程序;
3.运行结果;
4.心得体会
思考题
1.直方图均衡化的目的是使图像直方图尽可能地分布均匀,你有什么改进的思路
2.你是如何理解步骤5的
附录一:
MATLAB数字图像处理
MATLAB简介
1.1主要用途及特点
主要用途:
算法研究
主要特点:
语句功能强大;
不能生成可执行文件.
1.2MATLAB工作环境
1.2.1Matlab桌面
桌面包括5个子窗口:
命令窗口,工作空间窗口,当前目录窗口,历史命令窗口,一个或多个图形窗口(仅在用户显示图形式出现).
命令窗口是用户在提示符(>
>
)处键入MATLAB命令和表达式的地方,也是显示那些命令输出的地方.
工作空间窗口显示对话中创建的变量和它们的某些信息.
当前目录窗口显示当前目录的内容(即路径).
历史命令窗口包含用户已在命令窗口中输入的命令的纪录.
使用MATLAB编辑器创建M文件
1.2.3获得帮助
(1)help
(2)look
数字图像的读取,显示,保存,数据类型和图像类型,数据类型间的转换,图像类型间的转换
2.1图像的读取
语法:
imread('
filename'
)
说明:
读取图像
格式名称
描述
可识别扩展符
TIFF
加标记的图像文件格式
.tif,.tiff
JPEG
联合图像专家组
.jpg,.jpeg
GIF
图形交换格式
.gif
BMP
Windows位图
.bmp
PNG
可移植网络图形
.png
XWD
XWindow转储
.xwd
[M,N]=size('
给出一幅图像的行数和列数
2.2图像的显示
imshow(f,G)
imshow(f,[lowhigh])
imshow(f,[])
G是显示该图像的灰度级数;
小于或等于low的值都显示为黑色,大于或等于high的值都显示为白色.
[]自动将变量low设置为f的最小值,将high设置为f的最大值.
2.3图像的保存
imwrite(f,'
)
练习1
f=imread('
saturn.tif'
);
pillsetc.png
[M,N]=size(f);
g=imread('
trees.tif'
);
imshow(f);
figure,imshow(g);
%显示另一幅图像
imwrite(f,'
s2.jpg'
数据类型
名称
double
双精度浮点数,范围为-10exp(308)~10exp(308),8字节
uint8
无符号8比特整数,1字节
uint16
无符号16比特整数,2字节
uint32
无符号32比特整数,4字节
int8
有符号8比特整数,1字节
int16
有符号16比特整数,2字节
int32
有符号32比特整数,4字节
single
单精度浮点数,范围为-10exp(38)~10exp(38),4字节
char
字符
logical
值为0或1
四种常用类型:
double,uint8,char,logical.
图像类型
亮度图像
uint8类范围为[0255],double类归一化为[01]
二值图像
图像取值只有0和1的逻辑数组
索引图像
RGB图像
彩色图像
6数据类与图像类型间的转换
数据类间的转换
B=data_class_name(A)
举例:
若A是8位图像,则B=double(A)转换为双精度图像.
图像类型间的转换
函数名称
将输入转换为
有效的输入图像数据类
im2uint8
Logical,uint8,uint16和double
im2uint16
mat2gray
im2double
im2bw
uint8,uint16和double
练习2
f=[12;
34];
g=mat2gray(f);
%矩阵数据归一化,数据都变成0-1间的数
gb=im2bw(g,0.6)%0.6isathreshold(二值化的阀值)
亮度变换与空间滤波
3.1亮度变换函数
3.1.1基本亮度变换函数
g=imadjust(f,[low_inhigh_in],[low_outhigh_out],gamma)
将图像f中的亮度值影响到g中的新值,即将low_in至high_in之间的值映射到low_out至high_out之间的值,low_in以下的值映射为low_out,high_in以上的值映射为high_out.
参数gamma指定了映射曲线的形状.
练习3
pout.tif'
imshow(f);
g1=imadjust(f,[01],[10]);
%f的矩阵必须是double型数据,此语句使原图像黑白颠倒。
figure,imshow(g1);
g2=imadjust(f,[0.50.75],[10],0.5);
%f的矩阵必须是double型数据
figure,imshow(g2);
对比度拉伸变换
对数变换方法:
g=c*log(1+double(f))
对数变换的一项主要应用是压缩动态范围,常用于傅里叶频谱显示.
练习4
F=fft2(f);
%FourierTransform
FC=fftshift(F);
%将变换原点移到频率矩形的中心.
imshow(abs(FC),[]);
S2=log(1+abs(FC));
figure,imshow(S2,[]);
对比度拉伸方法:
g=1./(1+(m./(double(f)+eps).^E)
eps是浮点数的相对精度,可避免f出现0值时的溢出现象.
3.2直方图处理与函数绘图
3.2.1生成并绘制图像的直方图
h=imhist(f,b)
p=imhist(f,b)/num1(f)
b是用于形成直方图的灰度级的个数.P是归一化直方图.
练习5
imhist(f);
直方图均衡化
g=histeq(f,nlev)
nlev是为输出图像制定的灰度级数.
练习6
tire.tif'
figure,imhist(f);
ylim('
auto'
%自动设定y轴坐标范围和刻度
g=histeq(f,256);
figure,imshow(g);
figure,imhist(g);
3.3空间滤波
3.3.1线性空间滤波
g=imfilter(f,w,filtering_mode,boundary_options,size_options)
w为滤波掩模
选项
滤波类型
'
corr'
滤波器通过使用相关来完成.该值是默认值.
conv'
滤波器通过使用卷积来完成
边界选项
P
输入图像的边界通过用值P来扩展.P的默认值为0.
replicate'
图像大小通过复制外边界的值来扩展.
symmetric'
图像大小通过反射其边界来扩展.
circular'
图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
大小选项
full'
输出图像的大小与被扩展图像的大小相同
same'
输出图像的大小与输入图像的大小相同
练习7
w=ones(31);
%单位矩阵掩模
gd=imfilter(f,w);
imshow(gd,[]);
3.3.2非线性空间滤波
略.
3.4图像处理工具箱的标准空间滤波器
3.4.1线性空间滤波器
w=fspecial('
type'
parameter)
见下表
练习8
‘d:
/pic/33.jpg’
w4=fspecial('
laplacian'
0)
w8=[111;
1-81;
111];
g4=f-imfilter(f,w4,'
g8=f-imfilter(f,w8,'
figure,imshow(g4);
figure,imshow(g8);
3.4.2非线性空间滤波器
g=ordfilt2(f,order,domain)
使用邻域的一组排序元素中的第oder个元素来代替f中的每个元素,而该邻域则由domain中的非零元素指定.
g=medfilt2(f,[mn],padopt)
中值滤波器.padopt指定了三个可能的边界填充选项之一.
zeros'
(默认值).
镜像反射.
indexed'
double类图像,以1填充,否则以0填充.
练习9
eight.tif'
fn=imnoise(f,'
salt&
pepper'
0.2);
%加椒盐噪声
figure,imshow(fn);
gm=medfilt2(fn);
imshow(fn);
figure,imshow(gm);
J=wiener2(I,[mn],noise)
进行二维适应性去噪过滤处理(维纳滤波).
练习10
I=imread('
J=imnoise(I,'
gaussian'
0,0.005);
%加高斯噪声
K=wiener2(J,[55]);
imshow(J)
figure,imshow(K)
频域处理
在MATLAB中计算并可视化二维DFT
练习11
S=abs(F);
%计算傅里叶频谱
imshow(S,[]);
figure,imshow(abs(FC),[]);
频域滤波
注意事项
假设函数f(x,y)和h(x,y)的大小分别为A×
B和C×
D,为了避免卷积运算造成的折叠误差(即混叠失真),必须通过对f和g补零,构造两个大小均为P×
Q的扩充寒暑,才能在频率域中进行运算.其中,P,Q必须满足:
DFT滤波的基本步骤
对f和g进行补零.
对f和g分别进行傅里叶变换,得到频域F和H.
将变换乘以滤波函数
G=H.*F;
获得G的傅里叶逆变换的实部:
g=real(ifft2(G));
讲左上部的矩形修建为原始大小:
g=g(1:
size(f,1),1:
size(f,2));
练习12:
根据DFT滤波的基本步骤,进行编程实现.
从空间滤波器获得频率滤波器
H=fft2(h,M,N)
M,N是滤波器的行数和列数,由被滤波的图像大小决定,是补零
的结果.
H=freqz2(h,R,C)
计算FIR滤波器的频率响应.
练习13
h=[111;
H=freqz2(h,50,50);
在频率域中直接生成滤波器
练习题14:
编程实现在频率域中生成巴特沃兹低通滤波器(或高通滤波器,或高通强调滤波器).
形态学图像处理
5.1膨胀和腐蚀
5.1.1膨胀
A2=imdilate(A,B)
B是结构元(由0和1组成的矩阵).
练习15
A=imread('
broken_text.tif'
B=[010;
111;
010];
A2=imdilate(A,B);
imshow(A);
figure,imshow(A2);
5.1.2结构元的生成
se=strel(shape,parameter)
见下表.
5.1.3腐蚀
A2=imerode(A,B)
练习16
wirebond_mask.tif'
se=strel('
disk'
10);
A2=imerode(A,se);
figure,imshow(A2);
5.2膨胀和腐蚀的组合
5.2.1开运算和闭运算
C=imopen(A,B)和C=imclose(A,B)
练习17
shapes.tif'
square'
20);
fo=imopen(f,se);
figure,imshow(fo);
fc=imclose(f,se);
figure,imshow(fc);
击中击不中变换
C=bwhitmiss(A,B1,B2)
练习18
B1=strel([0000;
0111;
0110]);
B2=strel([1111;
1000;
1000]);
g=bwhitmiss(f,B1,B2);
imshow(g);
形态学函数
g=bwmorph(f,operation,n)
该函数可基于膨胀,腐蚀和查找表的组合实现许多有用的操作,n是一个用于指定将被重复操作次数的正整数.Operation说明见下表.
练习19
fingerprint_cleaned.tif'
G1=bwmorph(f,'
thin'
1);
G2=bwmorph(f,'
Ginf=bwmorph(f,'
Inf);
Fs=bwmorph(f,'
tskel'
figure,imshow(G1);
figure,imshow(G2);
figure,imshow(Ginf);
figure,imshow(Fs);
5.3标记连通分量
[L,num]=
conn用于指定连接类型(4连接获8连接),num给出所找到的连接分量总数,L成为标记矩阵.
练习20
objects.tif'
[L,n]=bwlabel(f);
[r,c]=find(L==3);
rbar=mean(r);
cbar=mean(c);
plot(cbar,rbar,'
Marker'
'
o'
MarkerEdgeColor'
k'
MarkerFaceColor'
'
MarkerSizer'
*'
w'
5.4形态学重构
out=imreconstruct(marker,mask)
由重构做开运算
练习21
f=imread('
book_text_bw.tif'
fe=imerode(f,ones(51,1));
fo=imopen(f,ones(51,1));
fobr=imreconstruct(fe,f);
figure,imshow(fe);
figure,imshow(fo);
figure,imshow(fobr);
填充孔洞
g=imfill(f,'
holes'
清除边界对象
g=imclearborder(f,conn)
图像分割
6.1点,线和边缘检测
6.1.1点检测
点检测模板w:
-1
8
检测方法:
g=abs(imfilter(double(f),w))>
=T
练习22
moon.tif'
w=[-1-1-1;
-18-1;
-1-1-1];
g=abs(imfilter(double(f),w));
T=max(g(:
));
T=T*0.9;
g=g>
=T;
线检测
水平模板,+45度模板,垂直模板,-45度模板.
练习23
w=[2-1-1;
-12-1;
-1-12];
figure,imshow(g);
使用edge函数的边缘检测
[g,t]=edge(f,'
method'
parameter)
g是一个逻辑数组,其值为:
在f中检测到边缘的位置为1,其他位置为零;
t是edge是用的阈值;
method为边缘监测器方法,可选为:
'
sobel'
prewit'
roberts'
log'
(LoG),'
zerocoss'
canny'
等;
parameter包含两部分:
T为指定的阈值,第二部分为dir(检测边缘的首选方向:
horizontal'
vertical'
both'
),或sigma(标准方差),或H(指定的滤波函数).
练习24
rice.tif'
[gsobel,t]=edge(f,'
figure,imshow(gsobel);
[glog,t]=edge(f,'
figure,imshow(glog);
[gcanny,t]=edge(f,'
figure,imshow(gcanny);
6.2使用Hough变换的线检测
练习25
设计与实现一个基于Hough变换的直线检测器.
6.3阈值处理
6.3.1全局阈值处理
T=graythresh(f)
T是阈值,归一化为0至1之间的值.
6.3.2局部阈值处理
通过一个形态学顶帽算子并对得到的结果使用graythresh来计算.
练习26
cell.tif'
T=graythresh(f);
G=f>
6.4基于区域的分割
6.4.1区域生长
6.4.2区域分裂和合并
练习27
设计与实现一个基于区域生长的分割程序.
6.5使用分水岭变换的分割
练习28
f=im