1、第8章 MATLAB图像处理工具箱,Matlab是一种基于向量(数组)而不是标量的高级程序语言,因而Matlab从本质上就提供了对图像的支持。数字图像实际上是一组有序离散的数据,使用Matlab可以对这些离散数据形成的矩阵进行一次性的处理。,Matlab对图像的处理功能主要集中在它的图像处理工具箱(Image Processing Toolbox)中。 图像处理工具箱是由一系列支持图像处理操作的函数组成,可以进行诸如几何操作、线性滤波和滤波器设计、图像变换、图像分析与图像增强、数学形态学处理等图像处理操作。,图像处理工具箱主要有:, Image Acquisition Toolbox(图像采集
2、工具箱) Image Processing Toolbox(图像处理工具箱) Signal Processing Toolbox(信号处理工具箱) Wavelet Toolbox(小波分析工具箱) Statistics Toolbox(统计工具箱) Bioinformatics Toolbox(生物信息学工具箱),8.1 Matlab中的图像类型及类型转换,Matlab中的数字图像是由一个或多个矩阵表示的,Matlab强大的矩阵运算功能完全可以应用于图像,那些适用于矩阵运算的语法对Matlab中的数字图像同样适用。,8.1.1 图像和图像数据,缺省:double (64位浮点数) uint8(
3、无符号8位整型),8.1.2 图像处理工具箱所支持的图像类型,图像处理工具箱支持4种图像类型,它们是:真彩色图像(RGB images) 索引色图像(index images) 灰度图像(intensity images) 二值图像(binary images)Matlab还支持由多帧图像组成的图像序列,真彩色图像,真彩色图像用 R、G、B 3个分量表示1个像素的颜色,数据结构是一个mn3的多维数组。如果要读取图像中(100,50)处像素值,可以查看三元组(100,50,1:3)。 真彩色图像可用双精度存储,亮度值范围是0,1 常用存储方法是无符号整型存储,亮度值范围为0,255,真彩色图像数
4、据格式,图1 真彩色图像的结构,索引色图像,索引图像是把像素值作为RGB调色板下标的图像。 索引色图像包含2个结构,一个是调色板map;另一个是图像数据矩阵X。 调色板是一个有3列和若干行的色彩映像矩阵,矩阵每行都代表一种色彩,通过3个分别代表红、绿、蓝颜色强度的双精度数,形成一种特定颜色。 图像数据是uint8或是双精度的。 Matlab中调色板的色彩强度是0,1中的浮点数,0代表最暗,1代表最亮。,图2 索引色图像的结构,索引图像的数据格式,索引图像的double与uint8型,double,uint8,图像数据,调色板,灰度图像,存储灰度图像只需要一个数据矩阵,数据类型可以是double
5、也可以是uint8。存储时会使用一个默认的调色板来显示图像。,二值图像,与灰度图像相同,二值图像只需一个数据矩阵,每个像素只有2个灰度值。可以采用uint8或double类型存储,工具箱中以二值图像作为返回结果的函数都使用uint8类型。,图像序列,图像处理工具箱支持将多帧图像连接成图像序列。可以使用cat函数将分散图像合并成图像序列,前提是各图像尺寸必须相同,如果是索引色图像,调色板必须是一样的。 将A1、A2、A3、A4、A5五幅图像合并成一个图像序列A,Matlab语句为 A=cat (1,A1,A2,A3,A4,A5), 1维,纵向排列 A=cat (2,A1,A2,A3,A4,A5)
6、,2维,横向排列 A=cat (3,A1,A2,A3,A4,A5),3维,竖向排列,图像序列也可以产生一个四维的数组,图像帧的序号在图像的长、宽、颜色深度之后构成第四维。 一个包含了5幅400300真彩色图像的序列,大小为40030035 一个包含了5幅400300灰度或是索引图像的序列,其大小为40030015A=cat (4,A1,A2,A3,A4,A5), 4维提取其中一帧(如第2帧):A(:,:,:,2),8.1.3 图像文件的读写和查询,imread:读取图形文件格式的图像;imwrite:写入图形文件格式的图像;imfinfo:获取图像的信息;loadsave:以Mat文件加载或保
7、存矩阵数据;imshow:显示加载到Matlab中的图像。,函数imread可完成图形图像文件的读取操作,其语法如下,一般:A=imread(filename, fmt)索引图像:X, map=imread(filename, fmt),X, map=imread(m83.tif, tif),图形图像文件的读取,imread函数可以从任何Matlab 支持的图形文件中以特定的位宽读取图像。读取的大多数图像均为8bit。加载到内存中时,就存储在类uint8中。对于索引图像来说,即使图像阵列的本身为uint8或uint16,imread函数仍然将颜色映像表读取并存储到一个双精度的浮点类型阵列中。,
8、图形图像文件的写入(保存),imwrite函数可以完成图形图像文件的写入操作, 其语法为: imwrite(A, filename, fmt)imwrite(X, map, filename, fmt)缺省的保存方式:uint8数据格式。Matlab中许多图像都是8bit,不需要双精度的浮点数据。,imwrite(X, map, lena.bmp, bmp),图形图像文件信息的查询,imfinfo函数用于从图像文件中查询其信息。所获取信息依文件类型不同而不同,至少包含下面内容文件名 文件格式文件格式的版本号 文件修改时间 文件的字节大小 图像的宽度(像素)图像的长度(像素) 每个像素的位数图像
9、类型(RGB图像、灰度图像还是索引图像),imfinfo(autumn.tif),4 图像文件的显示,图像显示函数imshow。其语法格式如下, 灰度图像 imshow(I)imshow(I, n) imshow(I, low high) 二值图像 imshow(BW) 索引图像 imshow(X, map) 真彩色图像 imshow(RGB),其中n为灰度级数目,缺省值为256。low high为图像数据的值域。,索引图像及其显示,索引图像包括数据矩阵X和颜色映像矩阵map。 其中map是一个p3的数据矩阵,其每个元素的值均为0, 1之间双精度浮点型数据。map矩阵的每一行分别表示红色、绿色
10、和蓝色的颜色值。而数据矩阵X可以是double和uint8型的,调用格式如下:imshow(X, map),例如一幅包含256色的uint8索引图像,使用一个仅有16色的调色板显示,则所有数值大于或等于15的像素都将被显示为调色板的最后一个颜色。,借助不同的调色板显示图像, X=imread(cameraman.tif);map=pink(256);imshow(X,map);colorbar;%显示颜色条,灰度图像及其显示,一幅灰度图像是一个数据矩阵 I,其中数据均代表了在一定范围内的颜色灰度值。Matlab 把灰度图像用数据矩阵的形式进行存储,每个元素则表示了图像中的每个像素。矩阵元素可以
11、是doudle、uint8整数类型。多数情况下,灰度图像很少和颜色映像表一起保存,但在显示灰度图像时,Matlab 仍然在后台使用系统预定义的缺省灰度颜色映像表。,(1) 灰度图像显示最基本的调用格式imshow(I)Matlab 中 imshow函数使用一个灰度级系统调色板(R=G=B)来显示灰度图像。如果I是double型,若像素值为0.0,则显示为黑色,1.0则显示为白色,0.0和1.0之间的像素值将显示为灰影。,imshow函数显示灰度图像,imshow(I, n) 以下语句将显示一幅32个灰度级的图像I。 imshow(I, 32),(2) 使用明确指定的灰度级数目,(3) 某些情况
12、下,可能将一些超出数据惯例范围的数据显示为一幅灰度图像, 对于double型数组为0,1,对于uint8型数组为0,255,为了将超过数据范围的数据显示为图像,用户可以直接定义数据范围,其调用格式如下,imshow(I,low high)其中low、high分别为数据的最小和最大值。 如果用户使用一个空矩阵 指定数据范围, imshow将自动进行数据标度。,RGB图像及其显示,imshow函数显示RGB图像的调用格式如下, imshow(RGB) 参数RGB是一个mn3的数组。对于RGB中的每一个像素(r,c),imshow显示数值(r,c,13)所描述颜色。每个屏幕像素使用24位颜色系统直接
13、显示真彩图像,系统给每个像素的红、绿、蓝颜色分量分配8位(256级),这样就有1000多万种颜色(224)。,二进制图像及其显示,显示二进制图像用如下语句, imshow(BW) 二进制图像是一个逻辑类,仅包括0和1两个数值,像素0显示为黑色,像素1显示为白色。 在显示时,也可以通过NOT()命令,对二进制图像取反,使数值0显示为白色,1显示为黑色。 例如: BW=imread(circles.png);imshow(BW);figure, imshow(BW);显示的结果如下图所示。,二进制图像显示效果,直接从磁盘显示图像,通常在显示图像前首先调用imread函数装载图像,将数据存储为Mat
14、lab工作平台中的变量。 如果不在显示图像前装载图像,则使用以下命令格式进行图像文件显示,imshow filename,imshow rice.png imshow(rice.png),多幅图像文件的显示,figure,imshow 功能:新建一个图像窗口,用于显示新图像(从而不让新的图像覆盖原来图像)。,创建新的图像窗口,每个图像显示在一个窗口中,调用imshow函数显示图像 I=imread(rice.png) J=filter2(1 2;-1 -2,I) %用模板1 2;-1 -2对图像滤波 imshow(I) figure,imshow(J, ),用imshow显示滤波前后的图像,s
15、ubplot(m,n,k),imshow %绘制并显示m行n 列第k个子图例: X1=imread(rice.png);X2=imread(coins.png);X3=imread(bag.png);subplot(1,3,1),imshow(X1); subplot(1,3,2),imshow(X2); subplot(1,3,3),imshow(X3);,子图显示,子图显示效果,多帧图像的电影片段,若一个tif图像文件包含有多帧图像,一般用immovie来实现创建电影片段功能,以下调用将根据多帧索引图像X创建电影片段。mov=immovie(X,map),mri=uint8(zeros(1
16、28,128,1,27); for frame=1:27mri(:,:,:,frame),map=imread(mri.tif,frame); end mov=immovie(mri,map); movie(mov);,将mri.tif的每一帧读入图相应的图像帧中,8.1.5 Matlab图像类型转换,索引图像进行滤波时,必须把它转换为RGB图像,否则光对图像的标进行滤波是毫无意义的。,工具箱中提供了许多图像类型转换的函数,从函数名称可以看出它们的功能。 1. dither函数 功能:图像抖动,利用仅能显示少数彩色的设备显示含有丰富颜色信息图像的一种非常有用的方法。 该函数可以把RGB图像转换
17、成索引图像或把灰度图像转换成二值图像。 格式:X=dither(RGB,map) BW=dither(I),抖动效果图,(1) RGB图像抖动成索引图像,例: I=imread(autumn.tif);map=pink(1024);X=dither(I,map);imshow(I);figure,imshow(X,map); colorbar,抖动效果图,(2) 灰度图像抖动成二值图像,例: I=imread(rice.png);bw=dither(I);imshow(I);figure,imshow(bw);,抖动效果图,功能:将灰度图像转换成索引图像。格式:X, map= gray2ind
18、(I, n) 按照指定灰度级n 把灰度图像I转换成索引图像X, map 为gray (n) , n的缺省值为64。 例: I=imread(cameraman.tif);X,map=gray2ind(I,16);imshow(X,map);figure,imshow(I);,2. gray2ind函数,功能:通过设定阈值将灰度图像转换成索引色图像。 格式:X=grayslice(I, n) 例:I=imread(cameraman.tif);X=grayslice(I,16);imshow(I);figure,imshow(X,bone(16);,3. grayslice函数,功能:将灰度图像
19、、索引色图像和真彩色图像转化成二值图像。格式:BW=im2bw(I, level) BW=im2bw( X, map, level)BW=im2bw(RGB, level)level是一个归一化阈值,取值在0,1。,4. im2bw函数,I=imread(autumn.tif); X=im2bw(I,0.5); imshow(I); figure,imshow(X);,功能:将索引图像转换成灰度图像。格式:I= ind2gray(X, map),5. ind2gray函数,功能:将索引色图像转换成真彩色图像。 格式:RGB=ind2rgb(X, map) 例:I,map=imread(m83.
20、tif);X=ind2rgb(I,map);imshow(I,map);figure,imshow(X);,6. ind2rgb函数,功能:将一个数据矩阵转换成一幅灰度图像。格式:I=mat2gray(A, amin amax) I=mat2gray(A),7. mat2gray函数,功能:将一幅真彩色图像转换成灰度图像。格式:I= rgb2gray(RGB)例: RGB=imread(autumn.tif);X=rgb2gray(RGB);imshow(RGB);figure,imshow(X);,8. rgb2gray函数,转换效果图,功能:将真彩色图像转换成索引色图像。 格式: X,ma
21、p = rgb2ind(RGB,n)例: RGB=imread(autumn.tif);X,map=rgb2ind(RGB,128);imshow(RGB);figure,imshow(X,map);,9. rgb2ind函数,8.2 图像处理技术,1 图像的灰度变换与直方图2 图像的增强滤波3 图像的空间变换4 图像边缘检测与分割,8.2.1 图像的灰度变换与直方图,在计算机中一幅二维数字图像表示为一个矩阵,该矩阵中的元素是位于相应坐标位置的图像灰度值。对图像处理,包括对彩色图像的处理,往往都是对像素灰度的操作,所以对图像进行灰度变换是图像处理过程中最简单、最基础内容。在图像处理中,直接对像
22、素进行的操作称为空间域(简称空域)处理。,1图像的灰度变换,函数imadjust完成灰度图像的灰度变换。语法格式为:gimadjust(p,low_in high_in,low_out high_out, gamma) 其中p为读入到MATLAB中的待变换图像矩阵;low_in high_in指定p图像中被执行变换操作的灰度范围,low_out high_out是p图像中的像素变换后被映射到low_outhigh_out的灰度级上。,参数gamma是指变换映射方式,默认gamma取作1,完成线性映射,这时变换前后的灰度级没有被加权; 当gamma小于1,则映射被加权至更高的灰度级; 相反当ga
23、mma大于1,输出则被加权映射至较低灰度级。,几种灰度变换过程:,将football.jpg灰度级0.10.6范围的像素线性变换到01上,效果如图所示 p = imread(football.jpg); g1 = imadjust(p,0.1 0.6,); subplot(1,2,1); imshow(p); xlabel(a); subplot(1,2,2); imshow(g1); xlabel(b);,将图像p向高灰度级变换,gamma取0.6,效果如图所示 g2 = imadjust(p,0.6); subplot(2,2,3); imshow(g2); xlabel(c);,将图像p
24、做灰度倒相变换,即输出源图的负片,gamma取1,如图所示。 g3 = imadjust(p,0 1,1 0); subplot(2,2,4); imshow(g3); xlabel(d);,2灰度直方图,图像灰度直方图描述了一幅图像的灰度级内容,即各个灰度级像素数目的统计。 直方图统计各个灰度像素的分布概率,是灰度级的函数,它反映不出该像素在图像中的二维坐标。 通过灰度直方图的形状,可以判断该图像的清晰度和黑白对比度。,MATLAB通过命令imhist给出图像直方图。语法格式为:h = imhist(p,b) 其中p为读入的图像矩阵, 参数b指明直方图统计时显示的整个灰度级分段数目。省略b时
25、,表明灰度级不分段,这也是imhist的默认调用方式。 如:uint8数据格式的图像,当b2时,灰度分为0127及128256两个区段。,显示图像p的灰度直方图时,先要把RGB彩色图像p变换为灰度图像I。运行下列程序得到如图所示直方图。 p = imread(football.jpg); I = rgb2gray(p); imhist(I);,3直方图均衡化,当一幅图像基调过暗或过亮时,需要对其进行必要的处理,使得图像明暗均匀,视觉效果变得更为理想。通过直方图均衡化做适当的调整,即把一幅已知灰度概率分布图像中的像素灰度做某种映射变换,使它变成一幅具有均匀概率分布的新图像,使图像视觉效果更加清晰
26、。,直方图均衡的MATLAB函数为histeq,其基本语法格式为:g = histeq(p, outlev) 其中p为读入的图像矩阵, outlev为输出图像的灰度级数。 outlev的默认值为64,即64个灰度级,这样对图像的细节有一定改变。通常将其赋值为256,即全灰度级。,对tire.tif进行直方图均衡,效果如图所示。 p = imread(tire.tif); subplot(2,2,1); imshow(p); xlabel(a) ); subplot(2,2,2); imhist(p); xlabel(b) ); g = histeq(p); subplot(2,2,3); im
27、show(g); xlabel(c) ); subplot(2,2,4); imhist(g); xlabel(d) );,8.2.2 图像的增强滤波,上节介绍过的直方图均衡化是图像增强中常用的一种方法,此外,图像增强技术还包括图像平滑滤波、图像锐化等。 本节将从线性与非线性、平滑与锐化等角度介绍一些实用的空域图像增强技术。,1 空域滤波概述,图像增强技术从总体上可分为空域增强和频域增强两大类。 空域增强也称为空间增强,是直接对图像中的像素进行操作的一种增强过程。 空域增强从根本上讲是以图像的灰度映射变换为基础的像素处理技术。,空域增强方法大致可分为对比度拉伸、平滑滤波和锐化滤波。灰度拉伸主要
28、是利用点运算来修改图像像素灰度值;而平滑和锐化均是利用模板来修改(卷积运算)像素灰度值,从实现方法上讲是基于图像滤波的操作过程。 空域滤波是在图像空间中借助模板对图像进行邻域操作的,输出图像每一个像素的取值都是根据模板对输入像素相应邻域内的像素值进行计算得到的,也叫邻域去噪算法。,2 空域滤波分类,根据模板特点不同可以将空域滤波分为线性和非线性两大类。 按照空域滤波器的功能不同,又可将其分为平滑滤波器和锐化滤波器。 平滑滤波器可以用低通滤波实现;锐化滤波器是用高通滤波实现的,具体可分为以下3类。 1)均值滤波均值滤波也称线性平滑滤波,其输出的像素值是由邻域像素的平均值决定。,2)中值滤波 中值
29、滤波也称为非线性平滑滤波,其基本原理与均值滤波不同之处在于:中值滤波的输出像素值是由邻域像素的中间值而不是平均值决定,中值滤波的名字也因此而得。 与均值滤波相比,中值滤波对灰度发生聚变的像素不如均值滤波那么敏感,因此中值滤波能尽量保存图像的细节,模糊效应较少,适于消除图像中孤立噪声。 3)锐化滤波 锐化滤波就是可以使用微分对图像进行处理,以此来锐化由于邻域平均导致的图像模糊。 图像处理中最常用的微分是利用图像沿某方向上的灰度变化率,即梯度进行的。,3基于MATLAB的空域增强滤波,基于MATLAB图像处理的空域滤波,首先要定义滤波器,然后调用定义好的滤波器进行滤波。 imnoise是MATLA
30、B提供的图像噪声模拟函数,其基本语法格式为:pn = imnoise(p, type, para) 其中pn为添加噪声的输出图像,p为原图像,type指定噪声的类型,para为每种类型噪声的参数。 常用的噪声有:gaussian(高斯噪声)、salt&pepper(椒盐噪声)、speckle(均值为0均匀分布的随机噪声)等。,fspecial函数用来预定义滤波器,语法格式为:h = fspecial(type, para)其中h为预定义的滤波器,参数type指定滤波器的种类,para为与滤波器相关的参数。 滤波器的种类type可以为: Gaussian(高斯低通滤波器)、laplacian(拉
31、普拉斯算子) log(拉普拉斯高斯算子)、prewitt(Prewitt算子) sobel(Sobel算子)、average(均值滤波器) unsharp(对比度增强滤波器),imfilter用来实现线性空间滤波的函数,语法格式为:hp = imfilter(p, w, filter_mode, boundary_options, size_options)其中hp为经过滤波后输出图像,p为原图像,w为滤波模板, filter_mode指定滤波中使用相关核(corr)还是卷积核(conv)。 boundary_options控制边界填充方式为边界复制(replicate)、边界循环(circu
32、lar)还是边界对称(symmetric)。 size_options可以为same或者full两者之一。,medfilt2是一个二维中值滤波函数,语法格式为:hp = medfilt2(p, m n, padopt) 其中hp为经过滤波后输出的图像,p为原图像,m及n规定了邻域大小,padopt指定了边界填充方式,默认方式为zeros,对添加了椒盐噪声的图像分别进行均值滤波和中值滤波,滤波前后效果如图所示。,p = imread(coins.png); p0 = imnoise(p, salt ,均值滤波和中值滤波 (a)原图像;(b)添加椒盐噪声后图像; (c)均值滤波后图像;(d)中值滤
33、波后图像),对含有噪声的原图像进行锐化,得到如图所示图像。 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 -
34、 hp2; %还原灰度色调 subplot(1,3,1),imshow(p0); subplot(1,3,2),imshow(p1); subplot(1,3,3);imshow(p2);,拉普拉斯波和高斯拉普拉斯滤波 (a)原图像;(b)laplace滤波图像;(c)高斯laplace滤波图像,8.2.3 图像的空间变换,图像的空间变换也称为图像的几何变换,是指将用户获得或设计的原始图像,按照需要产生大小、形状和位置的变化。 常用的图像几何变换包括图像的缩放、图像的剪切及图像的旋转等内容。,1 图像比例缩放,图像比例缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍,
35、从而获得一幅新的图像。有fxfy和 fxfy两种情况。 比例缩放所产生的图像中的像素可能在原图像中找不到相应的像素点,这样就必须进行插值处理。 图像插值处理常用的方法有两种,一种是最邻近插值法,另一种是通过一些插值算法来计算相应的像素值。 MATLAB中提供了三种图像插值方法,即最近邻插值、双线性插值和双三次插值。,函数imresize对图像进行插值缩放,语法格式为:ps = imresize(p, m, method ) 其中ps为变换后图像,p为输入图像,m放大倍数(当m1时缩小),method为插值方法的选择项,可选最近邻插值法(nearest)、双线性插值法(bilinear)及双三次
36、插值法(bicubic),默认使用最近邻插值法。 另外一种语法格式为:ps = imresize(p, m n, method ) 其中m和n分别为变换后图像长宽。,对liftingbody.png图像进行缩小,其效果如图所示。 p = imread(liftingbody.png); w = input(please input a number:); %交互输入缩小为0.2倍 ps = imresize(p,w); %缩小变换 imshow(p); figure; imshow(ps);,对liftingbody.png图像进行缩小前后的效果(a)原图像;(b)缩小后拉伸显示后图像,2 图
37、像剪切,用函数imcrop交互实现图像区域选取功能,用于剪切图像中的一个矩形子图,可用鼠标选取这个矩形,也可以通过参数指定这个矩形顶点的坐标。语法格式为:pc = imcrop(p)或 pc = imcrop(p, rectangle) 其中pc为剪切后的图像,p为输入图像,rectangle为四个变量指定的一个矩形区域,即left bottom width height,数组中的四个变量分别表示矩形左下角的横坐标、纵坐标、矩形长度及宽度。,对liftingbody.png图像进行剪切,其效果如图所示。 p = imread(liftingbody.png); pc = imcrop(p,80
38、 180 260 220); %输入矩形尺度进行选取 subplot(1,2,1); imshow(p); subplot(1,2,2); imshow(pc);,3 图像旋转,图像的旋转是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角度。 在图像进行旋转的时候,各像素的坐标必然发生变化,使得旋转之后不能正好落在整数坐标处, 因此同缩放一样,也需要进行插值,插值方法也与缩放的插值方法一样,完全相同,即可用3种方法对图像进行插值旋转,默认的插值方法是最近邻插值法。,通过函数imrotate实现对图像的旋转,语法格式为:pr = imrotate(p, angle, method) 或
39、pr = imrotate(p, angle, method, crop) 其中pr为旋转后得到的图像,p为输入图像,angle为指定的旋转度数,参数method用于指定插值的方法,可选值为nearest(最近邻法),bilinear(双线性插值)及bicubic(双三次插值),默认值为nearest。参数crop允许用户对旋转后的图像进行自动剪切,使返回的图像与原图大小相同。,对liftingbody.png图像进行旋转,其效果如图所示。 p = imread(liftingbody.png); angle = input(please input angle:); %输入旋转角度为45度
40、pr = imrotate(p,angle,bilinear); %使用双线性插值方法实现旋转变换 subplot(1,2,1); imshow(p); subplot(1,2,2); imshow(pr);,8.2.4 图像边缘检测与分割,图像分割是将数字图像分割成互不相交(不重叠)的有意义的子区域的过程。其目的是使各个区域与景物中以某种方式描述的物体相对应,以便进行高层次的图像解释、图像识别等处理。,1 边缘检测概述,图像分割是基于图像像素灰度值的基本特性-不连续性与相似性中来进行的。区域内部像素一般具有灰度相似性,区域之间边界上一般具有灰度不连续性。 根据图像灰度级突变进行图像分割的方法
41、中,边缘检测通过检测包含不同区域的边缘来解决图像分割问题。 边缘检测最通用的方法是检测灰度值的不连续性,灰度值的不连续是指在不同区域之间的边缘上像素灰度值的变化往往比较剧烈,一般利用图像一阶导数的极大值或者二阶导数的过零点信息提供判断边缘点的依据。,边缘的物理意义,图像边缘的产生 物体的边界、表面方向的改变、不同的颜色、光照的变化,物体的边界,表面方向变化,不同颜色区域,光照明暗,灰度图像中边缘的类型,阶梯状边缘,屋脊状边缘,线条状边缘,为什么要提取边缘?,边缘是最基本的图像特征之一: 可以表达物体的特征 边缘特征对于图像的变化不敏感 几何变化,灰度变化,光照方向变化 可以为物体检测提供有用的
42、信息 是一种典型的图像预处理过程,原始图像,输出结果,模式识别,预处理,特征提取,如何提取边缘?(灰度图象),灰度图象边缘提取的主要思想: 抑制噪声(低通滤波、平滑、去噪、模糊) 边缘特征增强(高通滤波、锐化) 边缘定位,原始图像,中间结果,图像边缘,抑制噪声,增强边缘,边缘定位,2 梯度算子,图像中任一像素点,用二维函数f(x,y)来表示,而梯度定义为向量f :向量幅值为:为简化计算,通常省略开方或通过取绝对值来近似计算,即或,梯度向量的含义在于,它总是指向f(x,y)在点(x,y)处的最大变化率方向。最大变化率是用方向角来衡量的,即 原理:若所求的一阶层数(梯度)高于某一阈值,则可确定该点
43、为边缘点。,为了能估计出Gx及Gy值,通常使用一些经典的模板来做数字化近似。有Sobel模板、Prewitt模板、Roberts模板等。 MATLAB提供了边缘函数(edge)实现对图像边缘的检测,语法格式为:e , s = edge(p, method, para)其中p为输入图像,method是边缘检测的类型,para为与edge对应的参数,e为与p同样大小的逻辑矩阵,在检测到边缘的位置时值为1,其它位置则为0,s为一可选参数。,Roberts模板(算子),Roberts算子又称为Roberts交叉算子,它是利用局部差分算子寻找边缘的模板,它在22邻域上计算对角导数。在实际应用中,为了简化
44、计算,常用梯度函数的Roberts绝对值来近似。另外还可以用Roberts最大值算子来计算。 Roberts边缘检测算子如图所示:(a)Roberts-x (b)Roberts-y,Roberts边缘检测器的语法格式如下:e , s = edge(p, roberts, thresh, direct) 其中p为输入图像,thresh为指定的阈值T,若T值未指定,则函数edge自动选择一个值。direct为检测边缘的首选方向,通常可选作horizontal(水平)、vertical(垂直)或both(默认值)。 Roberts算子的一个主要问题是计算方向差分时对噪声敏感。,Sobel模板(算子)
45、,Sobel提出一种将方向差分运算与局部平均相结合的方法,即Sobel算子。是在以f(x,y)为中心的33邻域上计算x和y方向的偏导数,其模板如图所示:(c) Sobel-x (d) Sobel-y,Sobel边缘检测器语法格式: e , s = edge(p, sobel, thresh, direct) 其中p为输入图像,thresh为指定阈值,direct为检测边缘首选方向,可选作horizontal (水平)、vertical(垂直)或both(默认值)。,Prewitt模板(算子),Prewit提出了与Sobel算子类似的计算偏微分估计值的方法,Prewit模板如图:(e) Prew
46、it-x (f) Prewit-y,Prewit边缘检测器调用语法如下:e , s = edge(p, prewitt, thresh, direct) 其中p为输入图像,thresh为指定阈值,direct为检测边缘首选方向,通常可选作horizontal (水平)、vertical(垂直)或both(默认值)。梯度算子的缺点:可能会导致检测的边缘点太多。,2 二阶微分算子,求梯度局部最大值对应点,并认定它们是边缘点。 一阶导数的局部最大值对应着二阶导数的零交叉点(zero crossing)。通过找图像强度的二阶导数的零交叉点就能找到精确边缘点。 二阶导数常用于拉普拉斯算子的计算,表达式为
47、:,二阶微分算子边缘检测器主要包括LoG算子和Canny算子。 常用的两种拉普拉斯模板如图所示:,LoG(Laplacian of a Gaussian)算子LoG算子对含有噪声的图像是效果较好的边缘检测器。当拉普拉斯算子输出出现过零点时就表明有边缘存在。 LoG边缘检测器的语法格式如下:e , s = edge(p, log, thresh, sigmma) 其中p为输入图像,thresh为指定的阈值T,sigmma为高斯滤波器的标准方差,默认值为2。若T值未指定,则函数edge会自动选择一个阈值。,Canny算子,Canny算子对最急剧变化方向上的边缘特别敏感,但在沿边缘方向上是不敏感的,
48、其作用就像一个平滑算子。Canny边缘检测器是高斯函数的一阶导数,是对信噪比和定位之乘积的最优化逼近算子。 算法有四个步骤:高斯滤波器平滑图像,一阶偏导的有限差分来计算梯度幅值和方向,对梯度幅值进行非极大值抑制,用双阈值算法检测和连接边缘。 canny边缘检测器的语法格式如下:e , s = edge(p, canny, thresh, sigmma) 其中p为输入图像,thresh为指定阈值T,若T值未指定,则函数edge会自动选择一个值,sigmma为平滑滤波器的标准方差,默认值为1。,对lena.bmp图像使用不同算子进行边缘检测。结果如图所示。 p=imread(lena.bmp);
49、p=im2double(p); %转换为doublee1,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,0.05 0.12,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);,