Download presentation
Presentation is loading. Please wait.
1
第三章 MATLAB图形图像处理
2
3.4 MATLAB数字图像处理 图像处理就是将图像转换为一数字矩阵的形式,并采用一定的算法对其进行的必要计算,以提高图像的视觉质量或提取出有用信息的过程。 MATLAB包含了功能非常强大的图像处理工具箱——IPT(Image Processing Tools)。 本节主要介绍数字图像的概念、表示、读取、显示与存储技术,后面几节分别介绍一些常用图像处理技术及其在MATLAB中的实现方法。
3
3.4.1数字图像的概念 从图像处理的角度来看,则可以分为模拟和数字两大类,前者包括光学系统成像、胶片影像等,后者是将模拟图像经抽样离散化处理后形成的、计算机能够辨识的点阵图像。 数字图像存在的形式就是存储在硬盘等介质中的数字化后的二维数组。现代数字图像与模拟图像相比具有不可比拟的优点,突出表现在易于存储、便于处理、传输方便、高抗扰性和易于加密等。
4
3.4.2 数字图像的表示 一幅灰度图像表示为如下矩阵形式:
fij代表像素(i,j)的亮度值,其范围是从0~255,0表示黑,255表示白。 彩色图像是用红、绿、蓝三组二维矩阵来表示的,这时的f记为:[f(x,y)r,f(x,y)g,f(x,y) b],其中三组中的每个数值的范围都是0~255。
5
3.4.3 图像格式与图像类型 图像格式是指用来存储图像的文件格式。图像格式通常有好多种,常因操作系统和图像处理软件的不同而有所区别,但总的发展趋势是格式变得更加统一。常用的图像格式如表3-7所示。 格式名称 扩展名 格式描述 JPEG .jpg .jpeg 静止图像格式 BMP .bmp Windows位图 TIFF .tif, .tiff 加标识信息的图像文件格式 GIF .gif 图形交换格式 PNG .png 可移植网络图形格式 XWD .xwd X Window存储图形格式 表3-7 MATLAB中常用图像/图形格式
6
与图像格式的定义不同,图像类型是依图像数组中数值与像素颜色之间的关系不同而对图像进行的分类。图像类型主要可分为四种:
灰度图像、索引图像、二值图像和RGB图像。 需要说明的是,在MATLAB中,无论是哪种类型的图像,其存储格式通常不外乎三种,即:uint8(8位无符号整型数)、uint16(16位无符号整型数)及double(双精度数浮点数)。
7
1.灰度图像 灰度图像是一个数据矩阵,该矩阵的每一个元素对应于图像中的一个像素点(pixel),元素的值代表一定范围的灰度级。
对于uint8类型的图像,则灰度取值范围为[0,255]; 对于uint16类型的图像,则灰度取值范围为[0,65535]; 对double类型的,则像素的取值为浮点数。灰度图像一般不自带调色板,而使用默认的系统调色板。
8
2.索引图像 索引图像是一种把图像像素值直接作为RGB调色板下标的图像。通常索引图像与灰度图像的最大区别在于,一幅索引图像除了包括图像数据矩阵以外,还包含一个图像调色板。 索引图像主要用于网络上的图片传输和一些对图像像素、大小等有严格要求的地方。
9
3.二值图像 二值图像是由0和1两种逻辑值数组组成的数字图像,逻辑值0相当于在灰度图像中的0,逻辑值1相当于灰度图像中的255。二值图像每一像素只有0和1两种可能的数值或灰度等级状态。二值图像常用于对图像内容进行标记处理。
10
4.RGB图像 RGB图像通常称为真彩色图像,它直接来源于图像传感器件所采集的模拟信号量化后的输出。每一像素点的数字量化输出均由三个数值来分别标明红、绿、蓝分量的幅值。 在MATLAB中,一幅RGB图像由m×n×3的数组来表示,其中m和n分别为图像的宽度和长度,3代表三个颜色分量。对于常用的RGB图像,每个颜色分量均由一个字节来表示,这样就构成24位的RGB图像。
11
常用图像类型转换函数 类型转换函数 函数功能描述 rgb2gray rgb2ind im2bw ind2gray gray2ind
dither 将一幅RGB图像转换为灰度图像; 将一幅RGB图像转换为索引图像; 使用阈值截取方法,将一幅灰度图像、索引图像或RGB图像转换为二值图像; 将一幅索引图像转换为灰度图像; 将一幅灰度图像转换为索引图像; 使用抖动算法,将RGB图像转换为索引图像,或将灰度图像转换为二值图像。
12
3.4.4 数字图像的读取 在MATLAB中无论对图像进行何种处理,首选必须将目标图像读入到MATLAB工作环境。MATLAB中使用imread函数读取图像,imread命令支持MATLAB IPT支持的所有图像格式,其语法格式为: imread(‘picname’) 其中picname为一个图像文件名,它包含了图像文件的全名(含扩展名)。
13
[p, map]= imread(picname, 'fmt')
对于索引图像的读取,命令格式为: [p, map]= imread(picname, 'fmt') 其中fmt为图像格式,可选的值为bmp、hdf、ico、jpg、pcx、png和xwd 除了使用命令whos检查内存中的图像信息外,还可以使用命令imfinfo则了解更多的图像信息,例如: >> imfinfo football.jpg ans = Filename: 'D:\MATLAB7\toolbox\images\imdemos\football.jpg' FileModDate: '01-Mar :52:38' FileSize: 27130 Format: 'jpg' FormatVersion: '' Width: 320 Height: 256 …
14
imshow(p,G) 或 imshow(p,[low high])
3.4.5 数字图像的显示与存储 MATLAB进行图像处理时,一般使用函数imshow或imview显示图像。 imshow在一个单独的图形窗口显示图像,其基本语法格式为: imshow(p,G) 或 imshow(p,[low high]) 其中,第一种命令格式,p为读取图像时存入的数组名,G是显示图像的灰度级数。若将G省略,默认的灰度级数是256。 第二种命令格式中,将所有灰度值小于或等于low的都显示为黑色,所有大于或等于high的则都显示为白色,而介于两者之间的将以像素实际的灰度值显示。若将方括号中的low和high省略,则显示的灰度范围从图像数组p中灰度最小至p中灰度最大值。
15
imview(p) 或 imview('football.jpg')
imview函数也是在一个单独的窗口内显示图像,同时提供了图像尺寸、数据类型和灰度范围等信息。用户还可通过一个图形窗口左下角查看当前鼠标所在位置的像素值。imshow和imview显示football.jpg的效果分别如下图所示。
16
(a) imshow 显示图像 (b) imview 显示图像
imshow和imview显示football.jpg的效果分别如图3.28中(a)、(b)所示。 (a) imshow 显示图像 (b) imview 显示图像
17
或 imwrite(p, ' picname',' fmt') imwrite(p, ' picname',' quality', q)
图像的存储: 使用函数imwrite 来保存图像,其基本语法格式为: imwrite(p, ' picname') 或 imwrite(p, ' picname',' fmt') 其中p为待保存的图像数组,picname为保存时使用的文件名,fmt为图像格式,可以保存为表3-7中的任一格式。 特别地,在保存为jpg格式图像时,命令格式则为: imwrite(p, ' picname',' quality', q) 在此处,picname则为包含了文件扩展名的完整文件名,quality为保存的文件质量等级控制字,具体保存为哪个等级由第四个参数q来指定,q为0~100之间的整数,数值越大,文件质量越好。
18
3.5 图像的灰度变换与直方图 在计算机中一幅二维数字图像表示为一个矩阵,该矩阵中的元素是位于相应坐标位置的图像灰度值。对图像处理包括对彩色图像的处理,往往都是对像素灰度的操作,所以对图像进行灰度变换是图像处理过程中最简单、最基础内容。 在图像处理中,直接对像素进行的操作称为空间域(或简称空域)处理。
19
3.5.1图像的灰度变换 在MATLAB中,用函数imadjust可完成灰度图像的灰度变换。其基本语法格式为:
g=imadjust(p,[low_in high_in],[low_out high_out], gamma) 其中p为读入到MATLAB中的待变换图像矩阵; [low_in high_in]指定了p图像中被执行变换操作的灰度范围; [low_out high_out]是p图像中的像素变换后被映射到low_out~high_out的灰度级上。 默认状态下,[low_out high_out]及[low_in high_in]为空,此时等价于[0 1],表明输入与输出灰度级为0~255(uint8)或0~65535(uint16)。
20
参数gamma 参数gamma是指变换映射的方式,默认方式时gamma取作1,完成线性映射,这时变换前后的灰度级没有被加权;
21
几种灰度变换过程: 【例3.5.1】将football.jpg灰度级0.1~0.6范围的像素线性变换到0~1上,效果如图3.29中图(b)所示: p = imread('football.jpg'); g1 = imadjust(p,[ ],[]); subplot(1,2,1); imshow(p); xlabel('(a)'); subplot(1,2,2); imshow(g1); xlabel('(b)');
22
【例3.5.2】将图像p向高灰度级变换,gamma取0.6,效果如图3.29中图(c)所示。
g2 = imadjust(p,[],[],0.6); subplot(2,2,3); imshow(g2); xlabel('(c)');
23
【例3.5.3】将图像p做灰度倒相变换,即输出源图的负片,gamma取1,效果如图3.29中图(d)所示。
g3 = imadjust(p,[0 1],[1 0]); subplot(2,2,4); imshow(g3); xlabel('(d)');
24
3.5.2灰度直方图 图像灰度直方图描述了一幅图像的灰度级内容,即各个灰度级像素数目的统计。
在MATLAB图像处理中,通过命令imhist来给出图像的直方图。其基本语法格式为: h = imhist(p,b) 其中p为读入到MATLAB环境中的图像矩阵, 参数b指明直方图统计时显示的整个灰度级分段数目,若图像为uint8数据格式,当b=2时,灰度分为0~127及128~256两个区段。省略b时,表明灰度级不分段,这也是imhist的默认调用方式。
25
【例3.5.4】显示图像p的灰度直方图时,先要把RGB彩色图像p变换为灰度图像I。运行下列程序,得到如图3.30所示直方图。
p = imread('football.jpg'); I = rgb2gray(p); imhist(I);
26
3.5.3直方图均衡化 通过直方图均衡化做适当的调整,即把一幅已知灰度概率分布图像中的像素灰度做某种映射变换,使它变成一幅具有均匀概率分布的新图像,使图像视觉效果更加清晰。 直方图均衡的MATLAB函数为histeq,其基本语法格式为: g = histeq(p, outlev) 其中p为读入的图像矩阵, outlev为输出图像的灰度级数。outlev的默认值为64,即64个灰度级,这样对图像的细节有一定改变。通常将其赋值为256,即全灰度级(uint8)。
27
p = imread('tire.tif'); subplot(2,2,1); imshow(p); xlabel('(a) ');
imhist(p); xlabel('(b) '); g = histeq(p); subplot(2,2,3); imshow(g); xlabel('(c) '); subplot(2,2,4); imhist(g); xlabel('(d) ');
28
3.6 图像的增强滤波 直方图均衡化是图像增强中常用的一种方法,图像增强技术还包括图像平滑滤波、图像锐化等。
3.6 图像的增强滤波 直方图均衡化是图像增强中常用的一种方法,图像增强技术还包括图像平滑滤波、图像锐化等。 本节将从线性与非线性、平滑与锐化等不同角度介绍一些实用的空域图像增强技术。
29
空域滤波概述 图像增强技术从总体上可分为空域增强和频域增强两大类。空域增强也称为空间增强,是直接对图像中的像素进行操作的一种增强过程。 空域增强方法大致可分为对比度拉伸、平滑滤波和锐化滤波。灰度拉伸主要是利用点运算来修改图像像素灰度值;而平滑和锐化均是利用模板来修改(卷积运算)像素灰度值,从实现方法上讲是基于图像滤波的操作过程。
30
3.6.2 空域滤波分类 根据模板特点不同可以将空域滤波分为线性和非线性两大类。
空域滤波分类 根据模板特点不同可以将空域滤波分为线性和非线性两大类。 按照空域滤波器的功能不同,又可将其分为平滑滤波器和锐化滤波器。平滑滤波器可以用低通滤波实现,目的在于模糊图像或消除图像噪声;锐化滤波器是用高通滤波实现的,目的在于增强被模糊图像的细节部分,具体可分为以下3类。 1.均值滤波 均值滤波也称线性平滑滤波,其输出的像素值是由领域像素的平均值决定。
31
2.中值滤波 中值滤波也称为非线性平滑滤波,其基本原理与均值滤波不同之处在于:中值滤波的输出像素值是由领域像素的中间值而不是平均值决定,中值滤波的名字也因此而得。与均值滤波相比,中值滤波对灰度发生聚变的像素不如均值滤波那么敏感,因此中值滤波能尽量保存图像的细节,模糊效应较少,适于消除图像中孤立噪声。 3.锐化滤波 锐化滤波就是使用微分对图像进行处理,以此来锐化由于领域平均导致的图像模糊。图像处理中最常用的微分是利用图像沿某方向上的灰度变化率,即梯度进行的。
32
3.6.3 基于MATLAB的空域增强滤波 基于MATLAB图像处理的空域滤波,首先要定义滤波器,然后才能调用定义好的滤波器进行滤波。
imnoise是MATLAB提供的图像噪声模拟函数,其基本语法格式为: pn = imnoise(p, ’type’, para) 其中pn为添加噪声的输出图像,p为原图像,type指定噪声的类型,para为每种类型噪声的参数。 常用的噪声有:gaussian(高斯噪声)、salt&pepper(椒盐噪声)、speckle(均值为0均匀分布的随机噪声)等。
33
fspecial函数用来预定义滤波器,其基本语法格式为:
h = fspecial(’type’, para) 其中h为预定义的滤波器,参数type指定滤波器的种类,para为与滤波器相关的参数。 滤波器的种类type可以为:gaussian(高斯低通滤波器)、laplacian(拉普拉斯算子)、log(拉普拉斯高斯算子)、prewitt(Prewitt算子)、sobel(Sobel算子)、average(均值滤波器)及unsharp(对比度增强滤波器)等。
34
imfilter是用来实现线性空间滤波的函数,其基本语法格式为:
hp = imfilter(p, w, filter_mode, boundary_options, size_options) 其中hp为经过滤波后输出的图像,p为原图像,参数w为滤波模板,filter_mode指定滤波过程中使用相关核(corr)还是卷积核(conv)。boundary_options控制边界填充方式为边界复制(replicate)、边界循环(circular)还是边界对称(symmetric)。size_options可以为same或者full两者之一。如 hp = imfilter(p, w, ’replicate’) medfilt2是一个二维中值滤波函数,其基本语法格式为: hp = medfilt2(p, [m n], padopt) 其中hp为经过滤波后输出的图像,p为原图像,m及n规定了领域的大小,padopt指定了边界填充方式,默认方式为zeros。
35
【例3.6.1】对添加了椒盐噪声的图像分别进行均值滤波和中值滤波,滤波前后效果如图3.32所示。
p = imread('coins.png'); p0 = imnoise(p, 'salt & pepper',0.02); % 为原图添加椒盐噪声 H1 = fspecial('average',[3 4]); % 设计均值滤波器H1 p1 = imfilter(p0,H1,'replicate'); %用滤波器H1对图像p0进行滤波 p2 = medfilt2(p0,[3,3],'zeros'); % 对图像p0进行中值滤波 subplot(2,2,1),imshow(p); %分别显示原图及处理后的图像 subplot(2,2,2),imshow(p0); subplot(2,2,3);imshow(p1); subplot(2,2,4);imshow(p2);
36
图3.32 均值滤波和中值滤波((a)原图像;(b)添加椒盐噪声后图像;(c)均值滤波后图像;(d)中值滤波后图像)
37
【例3.6.2】 对含有噪声的原图像进行锐化,得到如图所示图像。
p0 = imread('moon.tif'); p = im2double(p0); %将图像数据类型转换为double H1 = fspecial('laplacian',0); %设计拉普拉斯滤波器H1 H2 = fspecial('log',[5 5],0.5); %设计高斯-拉普拉斯滤波器H2 hp1 = imfilter(p,H1,'replicate'); %用滤波器H1对图像p进行滤波 hp2 = imfilter(p,H2,'replicate'); %用滤波器H2对图像p进行滤波 p1 = p - hp1; %还原灰度色调 p2 = p - hp2; %还原灰度色调 subplot(1,3,1),imshow(p0); subplot(1,3,2),imshow(p1); subplot(1,3,3);imshow(p2);
38
图3.33 拉普拉斯波和高斯-拉普拉斯滤波((a)原图像;(b)拉普拉斯滤波后图像;(c)高斯-拉普拉斯滤波后图像)
39
3.7 图像的空间变换 图像的空间变换也称为图像的几何变换,是指将用户获得或设计的原始图像,按照需要产生大小、形状和位置的变化。图像几何变换是图像显示技术中的一个重要组成部分,常用的图像几何变换主要包括图像的缩放、图像的剪切及图像的旋转等内容。
40
3.7.1 图像比例缩放 图像比例缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍,从而获得一幅新的图像。有fx=fy和 fx≠fy两种情况。 比例缩放所产生的图像中的像素可能在原图像中找不到相应的像素点,这样就必须进行插值处理。 图像插值处理常用的方法有两种,一种是最邻近插值法,另一种是通过一些插值算法来计算相应的像素值。 MATLAB中提供了三种图像插值方法,即最近邻插值、双线性插值和双三次插值。
41
通过函数imresize对图像进行插值缩放,其基本语法格式为:
ps = imresize(p, m, method ) 其中ps为变换后的图像,p为输入图像,m放大倍数(当m<1时缩小),method为插值方法的选择项,可选最近邻插值法(nearest)、双线性插值法(bilinear)及双三次插值法(bicubic),默认使用最近邻插值法。 另外一种经常用到的语法格式为: ps = imresize(p, [m n], method ) 其中m和n分别为变换后图像的长宽,其它参数含义与上述相同。
42
【例3.7.1】对liftingbody.png图像进行缩小。
p = imread('liftingbody.png'); w = input('please input a number:'); %交互输入缩小为0.2倍 ps = imresize(p,w); %缩小变换 imshow(p); figure; imshow(ps);
43
图3.34 对liftingbody.png图像进行缩小前后的效果((a)原图像;(b)缩小后拉伸显示后图像)
44
3.7.2 图像剪切 图像处理工具箱中通过函数imcrop交互实现图像区域选取功能,用于剪切图像中的一个矩形子图,可用鼠标选取这个矩形,也可以通过参数指定这个矩形顶点的坐标。函数imcrop基本语法格式为: pc = imcrop(p) 或 pc = imcrop(p, rectangle) 其中pc为剪切后的图像,p为输入图像,rectangle为四个变量指定的一个矩形区域,即[left bottom width height],数组中的四个变量分别表示矩形左下角的横坐标、纵坐标、矩形长度及宽度。
45
【例3.7.2】 对liftingbody.png图像进行剪切。
p = imread('liftingbody.png'); pc = imcrop(p,[ ]); %输入矩形尺度进行选取 subplot(1,2,1); imshow(p); subplot(1,2,2); imshow(pc);
46
3.7.3 图像旋转 图像的旋转是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角度。
图像旋转 图像的旋转是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角度。 在图像进行旋转的时候,需要进行插值,默认的插值方法是最近邻插值法。 在MATBLA工具箱中的,通过函数imrotate实现对图像的旋转,imrotate函数的语法格式为: pr = imrotate(p, angle, method) 或 pr = imrotate(p, angle, method, crop) 其中pr为旋转后得到的图像,p为输入图像,angle为指定的旋转度数,参数method用于指定插值的方法,可选值为nearest(最近邻法),bilinear(双线性插值)及bicubic(双三次插值),默认值为nearest。参数crop允许用户对旋转后的图像进行自动剪切,使返回的图像与原图大小相同。
47
【例3.7.3】 对liftingbody.png图像进行旋转
p = imread('liftingbody.png'); angle = input('please input angle:'); %输入旋转角度为45度 pr = imrotate(p,angle,'bilinear'); %使用双线性插值方法实现旋转变换 subplot(1,2,1); imshow(p); subplot(1,2,2); imshow(pr);
48
3.8 图像边缘检测与分割 图像分割是将数字图像分割成互不相交(不重叠)的有意义的子区域的过程。其目的是使各个区域与景物中以某种方式描述的物体相对应,以便进行高层次的图像解释、图像识别等处理。
49
3.8.1 边缘检测概述 图像分割一般是基于图像像素灰度值的基本特性——不连续性与相似性中的一个或两个来进行的。区域内部的像素一般具有灰度相似性,而在区域之间的边界上一般具有灰度不连续性。 根据图像灰度级的突变进行图像分割的方法中,边缘检测方法通过检测包含不同区域的边缘来解决图像分割问题。边缘检测最通用的方法是检测灰度值的不连续性,灰度值的不连续是指在不同区域之间的边缘上像素灰度值的变化往往比较剧烈,一般利用图像一阶导数的极大值或者二阶导数的过零点信息提供判断边缘点的依据。
50
3.8.2 梯度算子 对于图像中任一像素点,可以用二维函数f(x,y)来表示,而梯度定义为向量∇f: 该向量的幅值为:
梯度算子 对于图像中任一像素点,可以用二维函数f(x,y)来表示,而梯度定义为向量∇f: 该向量的幅值为: 为简化计算,通常省略开方或通过取绝对值来近似计算,即 或
51
梯度向量的含义在于,它总是指向f(x,y)在点(x,y)处的最大变化率方向。最大变化率是用方向α角来衡量的,即
为了能估计出Gx及Gy值,通常使用一些经典的模板来做数字化近似。这些模板有Soble模板、Prewitt模板、Roberts模板等。 MATLAB图像处理工具箱中提供了边缘函数(edge)实现对图像边缘的检测,其基本语法格式为: [e , s] = edge(p, 'method', para) 其中p为输入图像,method是边缘检测的类型,para为与edge对应的参数,e为与p同样大小的逻辑矩阵,在检测到边缘的位置时值为1,其它位置则为0,s为一可选参数。
52
1.Roberts模板(算子) Roberts算子又称为Roberts交叉算子,它是由Roberts提出的一种利用局部差分算子寻找边缘的模板,它在2×2邻域上计算对角导数。在实际应用中,为了简化计算,常用梯度函数的Roberts绝对值来近似。另外还可以用Roberts最大值算子来计算。Roberts边缘检测算子如图所示: (a)Roberts-x (b)Roberts-y -1 1 -1 1
53
Roberts边缘检测器的语法格式如下:
[e , s] = edge(p, ' roberts', thresh, direct) 其中p为输入图像,thresh为指定的阈值T,若T值未指定,则函数edge会自动选择一个值。direct为检测边缘的首选方向,通常可选作horizontal(水平)、vertical(垂直)或both(默认值)。
54
2.Sobel模板(算子) Roberts算子的一个主要问题是计算方向差分时对噪声敏感。Sobel提出一种将方向差分运算与局部平均相结合的方法,即Sobel算子。该算子是在以f(x,y)为中心的3×3邻域上计算x和y方向的偏导数,其模板如图所示: (c) Sobel-x (d) Sobel-y -1 -2 1 2 -1 1 -2 2
55
Sobel边缘检测器语法格式: [e , s] = edge(p, 'sobel', thresh, direct) 其中p为输入图像,thresh为指定的阈值,direct为检测边缘的首选方向,通常可选作horizontal (水平)、vertical(垂直)或both(默认值)。
56
3.Prewitt模板(算子) Prewit提出了与Sobel算子类似的计算偏微分估计值的方法,Prewit模板如图:
(e) Prewit-x (f) Prewit-y -1 1 -1 1
57
Prewit边缘检测器调用语法如下: [e , s] = edge(p, 'prewitt', thresh, direct) 其中p为输入图像,thresh为指定的阈值,direct为检测边缘的首选方向,通常可选作horizontal (水平)、vertical(垂直)或both(默认值)。
58
3.8.2 二阶微分算子 上节讨论了计算一阶导数的边缘检测器,如果所求的一阶导数高于某一阈值,则可确定该点为边缘点,这样做会导致检测的边缘点太多。一种更好的方法就是求梯度局部最大值对应的点,并认定它们是边缘点。一阶导数的局部最大值对应着二阶导数的零交叉点(zero crossing)。这样,通过找图像强度的二阶导数的零交叉点就能找到精确边缘点。 在数字图像处理中,二阶导数常用于拉普拉斯算子的计算,即二维函数f(x,y)的拉普拉斯的表达式为:
59
二阶微分算子边缘检测器主要包括LoG算子和Canny算子。
常用的两种拉普拉斯模板如图所示: -1 4 -1 8
60
1. LoG(Laplacian of a Gaussian)算子
[e , s] = edge(p, 'log', thresh, sigmma) 其中p为输入图像,thresh为指定的阈值T,sigmma为高斯滤波器的标准方差,默认值为2。若T值未指定,则函数edge会自动选择一个阈值。
61
2.Canny算子 Canny算子对最急剧变化方向上的边缘特别敏感,但在沿边缘方向上是不敏感的,其作用就像一个平滑算子。Canny边缘检测器是高斯函数的一阶导数,是对信噪比和定位之乘积的最优化逼近算子。 算法有以下四个步骤:先用高斯滤波器平滑图像,然后用一阶偏导的有限差分来计算梯度的幅值和方向,再对梯度幅值进行非极大值抑制,最后用双阈值算法检测和连接边缘。 canny边缘检测器的语法格式如下: [e , s] = edge(p, 'canny', thresh, sigmma) 其中p为输入图像,thresh为指定的阈值T,若T值未指定,则函数edge会自动选择一个值,sigmma为平滑滤波器的标准方差,默认值为1。
62
【例3.8.1】对lena.bmp图像使用不同的算子进行边缘检测。检测结果如图3.39所示。
p=imread('lena.bmp'); p=rgb2gray(p); %转换为灰度图像 [e1,s1] = edge(p,'sobel',0.03,'both'); % sobel检测器 [e2,s2] = edge(p,'roberts',0.03,'both'); % roberts检测器 [e3,s3] = edge(p,'prewitt',0.04,'both'); % prewitt检测器 [e4,s4] = edge(p,'log',0.003,2.10); % LoG检测器 [e5,s5] = edge(p,'canny',[ ],1.6); % canny检测器 subplot(2,3,1),imshow(p); subplot(2,3,2),imshow(e1); subplot(2,3,3),imshow(e2); subplot(2,3,4);imshow(e3); subplot(2,3,5),imshow(e4); subplot(2,3,6),imshow(e5);
63
(a) (b) (c) 图3.39 边缘检测结果((a)Lena源图;(b)使用Sobel算子;(c)使用Robert算子; (d)使用Prewitt算子;(e)使用LoG算子;(f)使用Canny算子)
64
几种边缘检测算子性能比较: Roberts算子是卷积模板为2×2的算子,对具有陡峭的低噪声图像响应最好,但它存在一些功能上的缺陷,如不能检测45°倍数的边缘,因此一般使用较少。 Sobel边缘检测器卷积模板为3×3的算子,对灰度渐变和噪声较多的图像处理效果较好。 Prewitt边缘检测器比Sobel检测器在计算上简单,但易于产生噪声。 LoG算子边缘检测器是先对图像作最佳平滑,然后再利用平滑图像的二阶微分零交叉确定边缘位置,它被认为是微分法中利用平滑二阶微分检测图像边缘较成功的一种算法。 Canny边缘检测器是在抗噪声干扰和精确定位之间选择一个最佳折衷方案,在理论上是迄今为至所发现的性能最优的一种边缘检测理论。
65
3.8.3 阈值分割 阈值化算法利用图像中要提取的目标物与其背景在灰度特性上的差异,把图像视为具有不同灰度级的两类区域(目标和背景)的组合,选取一个合适的阈值,以确定图像中每一个像素点应该属于目标还是背景区域,从而产生相应的二值图像。 如图所示,最简单的利用阈值方法来分割灰度图像的步骤如下:首先对一幅灰度取值在0和L-1之间的图像确定一个灰度阈值T(0<T<L-1),然后将图像中每个像素的灰度值与阈值T相比较,并将对应的像素根据比较结果划为两类: thresh
66
阈值化算法通过设定不同的特征阈值,将像素点分为若干类,其关键在于阈值的选取。常见的阈值选取方法:
1.极小值点阈值 如果将直方图的包络看作一条曲线,则选取直方图的谷可借助求曲线极小值的方法。 2.迭代阈值 先取图像灰度范围的中值作为初始阈值T0,然后按迭代公式进行迭代。 3.最大方差阈值(又称Otsu自动阈值处理方法) 通过函数graythresh实现最大方差阈值的选取,其基本语法格式为: thresh = graythresh(p) 其中p为输入图像,thresh为最终返回的阈值,其范围在0~1之间。
67
【例3.8.2】 用迭代阈值选取法计算图像的全局阈值并对图像进行分割。分割前后效果如图3.41所示。
p= imread('bugs.bmp'); p=rgb2gray(p); p=im2double(p); %转换为double thresh = 0.5*(min(p(:)) + max(p(:))); %阈值初始化为最大值与最小值的中间值 flag = false; %迭代步长控制 while ~flag g = p>=thresh; %按当前阈值划分 thresh_1 = 0.5*(mean(p(g)) + mean(p(~g))); %求得新阈值 flag = abs(thresh - thresh_1)<0.5; %更新迭代标志 thresh = thresh_1; %更新阈值 end figure(1),imshow(p); figure(2), imshow(g);
68
图3.41 迭代阈值分割前后效果((a)原图像;(b)迭代阈值分割后图像)
69
【例3.8.3】 用最大方差阈值对图像进行分割。分割前后效果如图3.42所示。
p=imread('bugs.bmp'); p1=rgb2gray(p); thresh = graythresh(p1); %使用Ostu算法求得新阈值 g = im2bw(p1,thresh); %使用thresh对图像进行分割 figure(1), imshow(p); figure(2), imshow(g);
70
图3.42 Ostu阈值分割前后效果((a)原图像; b.Ostu阈值分割后图像)
Similar presentations