视觉检测技术 - MATLAB数字图像处理

更新时间:2024-02-02 03:35:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

视觉检测技术实验指导书 ——图像处理与分析部分

实验一:图像预处理实验(验证性实验)

一、实验目的与要求:

目的:通过本次实验,学生可以掌握图像读取、显示和保存的方法,掌握空间域增强方法和频率域增强方法。

要求:上机运行,调试通过。

二、实验方案:

1) 对附录中的练习1~11、练习13,进行上机运行和调试。 2) 对上述练习,改变一些函数的参数,观察运行结果的变化。

三、实验结果与数据处理

对每个练习,要求学生获得相应的实验结果。 四、结论

可以是对某些MATLAB函数如何使用的认识,也可以是学生的实验后的心得体会。

五、问题与讨论

1)在显示傅里叶频谱前,为什么常常进行对数变换? 2)对实验中遇到的问题,进行讨论。

实验二:形态学处理、图像分割、表达与描述实验(验证性实验)

一、实验目的与要求:

目的:要求学生掌握形态学处理、图像分割和图像表达与描述的基本方法,掌握相关的MATLAB函数。

要求:上机运行,调试通过。

二、实验内容:

1) 对附录中的练习15~24、练习26、练习28~32,进行上机运行和调试。 2)对上述练习,改变一些函数的参数,观察运行结果的变化。

三、实验结果与数据处理

对每个练习,要求学生获得相应的实验结果。 四、结论

可以是对某些MATLAB函数如何使用的认识,也可以是学生的实验后的心得体会。

五、问题与讨论

1)在形态学处理中,结构元选取的原则是什么?举例说明。 2)对实验中遇到的问题,进行讨论。

实验三:直方图均衡化实验(设计性实验)

实验名称:直方图均衡化实验 实验项目性质:设计性实验 计划学时:2

一、 实验目的与要求

1.目的:通过本次实验,加深学生对直方图均衡化的基本原理的理解,加强学

生的算法设计和编程实现的能力。

2、要求:根据直方图均衡化的原理,设计直方图均衡化的算法,并编程实现直

方图均衡化的功能。

二、 预习与参考

1.R. C. Gonzalez, R. E. Woods。《数字图像处理》(第二版)。北京:电子工业出

版社,2003。 2.《图像处理与分析实验指导书》的附录。 2.R. C. Gonzalez, R. E. Woods, S. L. Eddins。《数字图像处理》(MATLAB版)。

北京:电子工业出版社,2005。 3.徐飞,施晓红。《Matlab应用图像处理》。西安:西安电子科技大学出版社,

2002。 三、实验方案

此方案为参考方案,鼓励学生提出自己的方案。 实现直方图均衡化的实现步骤:

1. 列出原始图像的灰度级fj,j?0,1,?,L?1,其中L是灰度级的个数。 2. 统计各灰度级的像素数目nj,j?0,1,?,L?1。

3. 计算原始图像直方图各灰度级的频数Pf(fj)?nj/n,j?0,1,?,L?1,其中n为原始图像总的像素数目。

4. 计算累积分布函数C(f)??j?0Pf(fj),j?0,1,?,k,?L?1。

5. 应用以下公式计算映射后的输出图像的灰度级gi,i?0,1,?,k,?,P?1,P为输出图像灰度级的个数:

gi?INT[(gmax?gmin)C(f)?gmin?0.5] 其中,INT为取整符号

6.统计映射后各灰度级的像素数目ni,i?0,1,?,k,?,P?1。 7.计算输出直方图Pg(gi)?ni/n,i?0,1,?,P?1。

8.用fj和gi的映射关系修改原始图像的灰度级,从而获得直方图近似为均匀分布的输出图像。

四、实验(设计)仪器设备和材料清单 1.计算机1台/每人 五、考核形式 1.验收调试结果; 2.实验报告 六、实验报告要求 1.技术路线;

k2.MATLAB程序; 3.运行结果; 4.心得体会 七、思考题

1.直方图均衡化的目的是使图像直方图尽可能地分布均匀,你有什么改进的思

路?

2.你是如何理解步骤5的?

3. 对实验中遇到的问题,进行讨论。

附录一:MATLAB数字图像处理

1 MATLAB简介

1.1 主要用途及特点 主要用途:算法研究

主要特点:语句功能强大;不能生成可执行文件。

1.2 MATLAB工作环境 1.2.1 Matlab桌面

桌面包括5个子窗口:命令窗口、工作空间窗口、当前目录窗口、历史命令窗口、一个或多个图形窗口(仅在用户显示图形式出现)。

命令窗口是用户在提示符(>>)处键入MATLAB命令和表达式的地方,也是显示那些命令输出的地方。

工作空间窗口显示对话中创建的变量和它们的某些信息。 当前目录窗口显示当前目录的内容(即路径)。

历史命令窗口包含用户已在命令窗口中输入的命令的纪录。

1.2.2 使用MATLAB编辑器创建M文件

1.2.3 获得帮助

(1)help <函数名> (2)lookfor <关键词>

2 数字图像的读取、显示、保存、数据类型和图像类型、数据类型间的转换、图像类型间的转换

2.1 图像的读取

语法:imread ( ‘filename’ ) 说明:读取图像 格式名称 描述 可识别扩展符 TIFF 加标记的图像文件格式 .tif, .tiff JPEG 联合图像专家组 .jpg, .jpeg GIF 图形交换格式 .gif BMP Windows位图 .bmp PNG 可移植网络图形 .png XWD X Window 转储 .xwd 语法:[M, N]=size ( ‘filename’ ) 说明:给出一幅图像的行数和列数

2.2 图像的显示

语法:imshow ( f, G)

imshow (f, [low high]) imshow (f, [ ])

说明:G是显示该图像的灰度级数;

小于或等于low的值都显示为黑色,大于或等于high的值都显示为白色。

[ ]自动将变量low设置为f的最小值,将high设置为f的最大值。

2.3 图像的保存

语法:imwrite ( f, ‘filename’) 说明:保存图像

练习1

f = imread ( ‘saturn.tif’); [M, N] = size( f );

g = imread ( ‘trees.tif’ ); imshow ( f );

figure, imshow (g); %显示另一幅图像 imwrite (f, ‘s2.jpg’)

>> f=imread('pout.tif'); >> imshow(f);

>> g=imread('trees.tif'); >> figure,imshow(g);

2.4 数据类型 名称 描述 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。

2.5 图像类型 名称 描述 亮度图像 uint8类范围为[0 255]、double类归一化为[0 1] 二值图像 图像取值只有0和1的逻辑数组 索引图像 索引图像 RGB图像 彩色图像 2. 6 数据类与图像类型间的转换

2.6.1 数据类间的转换

语法:B = data_class_name ( A )

举例:若A是8位图像,则B = double ( A )转换为双精度图像。

2.6.2 图像类型间的转换 函数名称 将输入转换为 有效的输入图像数据类 im2uint8 uint8 Logical, uint8, uint16和double im2uint16 uint16 Logical, uint8, uint16和double mat2gray double double im2double double Logical, uint8, uint16和double im2bw logical uint8, uint16和double 练习2

f=[1 2; 3 4]; g=mat2gray(f);

gb=im2bw(g, 0.6) %0.6 is a threshold

3 亮度变换与空间滤波

3.1 亮度变换函数

3.1.1 基本亮度变换函数

语法:g=imadjust(f, [low_in high_in], [low_out high_out],gamma)

说明:将图像f中的亮度值影响到g中的新值,即将low_in至high_in之间的值映射到low_out至high_out之间的值, low_in以下的值映射为low_out, high_in以上的值映射为high_out。

参数gamma指定了映射曲线的形状。

练习3

f = imread ( ‘pout.tif’); imshow(f);

g1=imadjust(f, [0 1], [1 0]); figure, imshow(g1);

g2=imadjust(f, [0.5 0.75], [1 0], 0.5); figure, imshow(g2);

3.1.2 对比度拉伸变换

对数变换方法:g=c*log(1+double(f))

说明:对数变换的一项主要应用是压缩动态范围,常用于傅里叶频谱显示。 练习4

f = imread ( ‘pout.tif’);

F=fft2(f); % Fourier Transform

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是归一化直方图。

num1(f)是求图像所有像素的灰度和的一个形式化的函数,需要自己

编写。例如:s=sum(f), s=sum(s),这两条语句合在一起,就实现了图像所有像素的灰度求和。

练习5

f = imread ( ‘pout.tif’); imhist(f);

3.2.2 直方图均衡化

语法:g=histeq(f, nlev)

说明:nlev是为输出图像制定的灰度级数。

练习6

f = imread ( ‘tire.tif’); imshow(f); figure,imhist(f);

ylim(‘auto’); %自动设定y轴坐标范围和刻度 g=histeq(f,256); figure, imshow(g); figure,imhist(g); ylim(‘auto’);

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

f = imread ( ‘saturn.tif’);

w=ones(31); %单位矩阵掩模 gd=imfilter(f,w); imshow(gd,[]);

3.3.2 非线性空间滤波

略。

3.4 图像处理工具箱的标准空间滤波器 3.4.1 线性空间滤波器

语法:w=fspecial(‘type’,parameter) 说明:见下表

练习8

f = imread ( ‘saturn.tif’); w4=fspecial(‘laplacian’, 0) w8=[1 1 1; 1 -8 1; 1 1 1];

g4=imsubtact(f, imfilter(f, w4, ‘replicate’)); g8=imsubtract( f, imfilter(f, w8, ‘replicate’)); imshow(f);

figure, imshow(g4); figure, imshow(g8); 3.4.2 非线性空间滤波器

语法:g=ordfilt2(f, order, domain)

说明:使用邻域的一组排序元素中的第oder个元素来代替f中的每个元素,而该邻域则由domain中的非零元素指定。

语法:g=medfilt2(f, [m n],padopt)

说明:中值滤波器。padopt指定了三个可能的边界填充选项之一。 ‘zeros’(默认值)。

‘symmetric’,镜像反射。

‘indexed’,double类图像,以1填充,否则以0填充。

练习9

f = imread ( ‘eight.tif’);

fn=imnoise(f, ‘salt & pepper’, 0.2); %加椒盐噪声 gm=medfilt2(fn); imshow(fn);

figure,imshow(gm);

语法:J = wiener2(I,[m n],noise)

说明:进行二维适应性去噪过滤处理(维纳滤波)。

练习10

I = imread('saturn.tif');

J = imnoise(I,'gaussian',0,0.005); %加高斯噪声 K = wiener2(J,[5 5]); imshow(J)

figure, imshow(K)

4 频域处理

4.1 在MATLAB中计算并可视化二维DFT

练习11

f = imread ( ‘saturn.tif’);

F=fft2(f); % Fourier Transform S=abs(F); %计算傅里叶频谱 imshow(S,[]);

FC=fftshift(F); %将变换原点移到频率矩形的中心。 figure,imshow(abs(FC), [ ]); S2= log(1+ abs(FC)); figure,imshow(S2, [ ]);

频域滤波

4.2.1 注意事项

假设函数f(x,y)和h(x,y)的大小分别为A×B和C×D,为了避免卷积运算造成的折叠误差(即混叠失真),必须通过对f和g补零,构造两个大小均为P×Q的扩充寒暑,才能在频率域中进行运算。其中,P、Q必须满足:

P?A?C?1

Q?B?D?1

4.2.2 DFT滤波的基本步骤 1、对f和g进行补零。

2、对f和g分别进行傅里叶变换,得到频域F和H。 3、将变换乘以滤波函数

G=H.*F;

4、获得G的傅里叶逆变换的实部: g=real(ifft2(G));

5、讲左上部的矩形修建为原始大小: 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 =[1 1 1; 1 -8 1; 1 1 1]; H=freqz2(h, 50, 50);

在频率域中直接生成滤波器

练习题14:

编程实现在频率域中生成巴特沃兹低通滤波器(或高通滤波器,或高通

强调滤波器)。

5 形态学图像处理

5.1 膨胀和腐蚀 5.1.1 膨胀

语法:A2=imdilate(A, B)

说明:B是结构元(由0和1组成的矩阵)。

练习15

A=imread(‘text.tif’); B=[0 1 0; 1 1 1; 0 1 0]; A2=imdilate(A, B); imshow(A);

figure,imshow(A2);

5.1.2 结构元的生成

语法:se=strel(shape, parameter) 说明:见下表。

5.1.3 腐蚀

语法:A2=imerode(A, B) 练习16

A=imread(‘text.tif’); se=strel(‘disk’,1); A2=imerode(A, se);

imshow(A); figure,imshow(A2); 5.2 膨胀和腐蚀的组合 5.2.1 开运算和闭运算

语法:C=imopen(A, B) 和 C=imclose(A,B) 练习17

f=imread(‘text.tif’); se=strel(‘square’,5); fo=imopen(f,se);

imshow(f); figure,imshow(fo);

fc=imclose(f,se); figure,imshow(fc);

5.2.2 击中击不中变换

语法:C=bwhitmiss(A, B1, B2) 练习18

A=imread(‘text.tif’);

B1=strel([0 0 0 0; 0 1 1 1; 0 1 1 0]); B2=strel([1 1 1 1; 1 0 0 0 ; 1 0 0 1]); g=bwhitmiss(f, B1, B2); imshow(g);

5.2.3 形态学函数

语法:g=bwmorph(f, operation, n)

说明:该函数可基于膨胀、腐蚀和查找表的组合实现许多有用的操作,n是一个用于指定将被重复操作次数的正整数。Operation说明见下表。

练习19

f=imread(‘circbw.tif’); G1=bwmorph(f, ‘thin’, 1); G2=bwmorph(f, ‘thin’, 1); Ginf= bwmorph(f, ‘thin’, Inf); Fs= bwmorph(f, ‘skel’, Inf); imshow(f);

figure,imshow(G1); figure,imshow(G2); figure,imshow(Ginf); figure,imshow(Fs);

5.3 标记连通分量

语法:[L, num]=bwlabel(f, conn)

说明:conn用于指定连接类型(4连接获8连接),num给出所找到的连接分量总数,L成为标记矩阵。

练习20

f=imread(‘blood1.tif’); [L,n]=bwlabel(f); [r,c]=find(L = = 3); rbar=mean(r);

cbar=mean(c);

plot(cbar, rbar, ‘Marker’, ‘o’, ‘MarkerEdgeColor’, ‘k’, ‘MarkerFaceColor’, ‘k’,‘MarkerSize’,10); plot(cbar, rbar, ‘Marker’, ‘*’, ‘MarkerEdgeColor’, ‘w’);

5.4 形态学重构

语法:out=imreconstruct(marker, mask)

5.4.1 由重构做开运算 练习21

f=imread(‘circbw.tif’); fe=imerode(f,ones(51,1)); fo=imopen(f,ones(51,1)); fobr=imreconstruct(fe, f); imshow(f);

figure,imshow(fe); figure,imshow(fo); figure,imshow(fobr);

5.4.1 填充孔洞

语法:g=imfill(f, ‘holes’)

5.4.2 清除边界对象

语法:g=imclearborder(f, conn)

6 图像分割

6.1 点、线和边缘检测 6.1.1 点检测 点检测模板w:

-1 -1 -1 -1 8 -1 -1 -1 -1 检测方法:

g=abs(imfilter(double(f), w))>=T

练习22

f=imread(‘moon.tif’);

w=[-1 -1 -1; -1 8 -1; -1 -1 -1]; g=abs(imfilter(double(f), w)); T=max(g(:)); T=T*0.5; g=g>=T;

imshow(f); figure, imshow(g);

6.1.2 线检测

水平模板、+45度模板、垂直模板、-45度模板。

练习23

f=imread(‘circbw.tif’); imshow(f);

w=[2 -1 -1; -1 2 -1; -1 -1 2]; g=abs(imfilter(double(f), w)); figure,imshow(g);

6.1.3 使用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

f=imread(‘rice.tif’); imshow(f);

[gsobel,t]=edge(f, ‘sobel’); figure, imshow(gsobel); [glog,t]=edge(f, ‘log’); figure, imshow(glog);

[gcanny,t]=edge(f, ‘canny’); figure, imshow(gcanny);

6.2 使用Hough变换的线检测

练习25

设计与实现一个基于Hough变换的直线检测器。

6.3 阈值处理

6.3.1 全局阈值处理

语法:T=graythresh(f)

说明:T是阈值,归一化为0至1之间的值。

6.3.2 局部阈值处理

通过一个形态学顶帽算子并对得到的结果使用graythresh来计算。

练习26

f=imread(‘moon.tif’); imshow(f);

T=graythresh(f); g=f>=T;

figure, imshow(g);

6.4 基于区域的分割 6.4.1 区域生长

6.4.2 区域分裂和合并

练习27

设计与实现一个基于区域生长的分割程序。

6.5 使用分水岭变换的分割

练习28

f=imread(‘cell.tif’); imshow(f);

g=im2bw(f, graythresh(f));%变成2值图像 figure,imshow(g); gc=~g;%取反,即非

D=bwdist(gc);%对二值图像距离变换 L=watershed(-D); w=L= =0; g2=g&~w;

figure,imshow(g2);

6.6 分割后处理

语法:BW2 = bwfill(BW1,c,r,n)

说明:填充二进制图像的背景色。(形态学处理)

练习29

BW1 =[1 0 0 0 0 0 0 0

1 1 1 1 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 0]

BW2 = bwfill(BW1,3,3,8) I = imread('blood1.tif');

BW3 = ~im2bw(I);

BW4 = bwfill(BW3,'holes'); imshow(BW3)

figure, imshow(BW4)

语法:bwareaopen

说明:二进制图像区域打开,清除小物体。

7 表示与描述

7.1 二进制图像对象的参数测量

语法:total = bwarea(BW)

说明:计算二进制图像对象的面积。 语法:eul = bweuler(BW,n)

说明:计算二进制图像的欧拉数。

练习30

BW = imread('circles.tif'); imshow(BW);

total=bwarea(BW); % total =15799 eul=bweuler(BW); % eul =-2

语法:BW2 = bwperim(BW1,n)

说明:计算二进制图像中对象的周长。 练习31

BW1 = imread('circbw.tif'); BW2 = bwperim(BW1,8); imshow(BW1)

figure, imshow(BW2)

语法:BW2 = bwselect(BW1,c,r,n) 说明:在二进制图像中选择对象

练习32

BW1 = imread('text.tif'); c = [16 90 144]; r = [85 197 247];

BW2 = bwselect(BW1,c,r,4); imshow(BW1)

figure, imshow(BW2)

7.2 其他参数测量

语法:b = std2(A)

说明:计算矩阵元素的标准偏移。 语法:B = mean2(A,[m n])

说明:计算矩阵元素的平均值

本文来源:https://www.bwwdw.com/article/j3fw.html

Top