资源描述
第三章 MATLAB图形图像处理,3.5图像的灰度变换与直方图,在计算机中一幅二维数字图像表示为一个矩阵,该矩阵中的元素是位于相应坐标位置的图像灰度值。对图像处理包括对彩色图像的处理,往往都是对像素灰度的操作,所以对图像进行灰度变换是图像处理过程中最简单、最基础内容。 在图像处理中,直接对像素进行的操作称为空间域(或简称空域)处理。,3.5.1图像的灰度变换,在MATLAB中,用函数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的灰度级上。 默认状态下,low_out high_out及low_in high_in为空,此时等价于0 1,表明输入与输出灰度级为0255(uint8)或065535(uint16)。,参数gamma是指变换映射的方式,默认方式时gamma取作1,完成线性映射,这时变换前后的灰度级没有被加权; 当gamma小于1,则映射被加权至更高的灰度级; 相反当gamma大于1,输出则被加权映射至较低的灰度级。,几种灰度变换过程:,【例3.5.1】将football.jpg灰度级0.10.6范围的像素线性变换到01上,效果如图3.29中图(b)所示: 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);,【例3.5.2】将图像p向高灰度级变换,gamma取0.6,效果如图3.29中图(c)所示。 g2 = imadjust(p,0.6); subplot(2,2,3); imshow(g2); xlabel(c);,【例3.5.3】将图像p做灰度倒相变换,即输出源图的负片,gamma取1,效果如图3.29中图(d)所示。 g3 = imadjust(p,0 1,1 0); subplot(2,2,4); imshow(g3); xlabel(d);,3.5.2灰度直方图,图像灰度直方图描述了一幅图像的灰度级内容,即各个灰度级像素数目的统计。 在MATLAB图像处理中,通过命令imhist来给出图像的直方图。其基本语法格式为: h = imhist(p,b) 其中p为读入到MATLAB环境中的图像矩阵, 参数b指明直方图统计时显示的整个灰度级分段数目,若图像为uint8数据格式,当b2时,灰度分为0127及128256两个区段。省略b时,表明灰度级不分段,这也是imhist的默认调用方式。,【例3.5.4】显示图像p的灰度直方图时,先要把RGB彩色图像p变换为灰度图像I。运行下列程序,得到如图3.30所示直方图。 p = imread(football.jpg); I = rgb2gray(p); imhist(I);,3.5.3直方图均衡化,通过直方图均衡化做适当的调整,即把一幅已知灰度概率分布图像中的像素灰度做某种映射变换,使它变成一幅具有均匀概率分布的新图像,使图像视觉效果更加清晰。 直方图均衡的MATLAB函数为histeq,其基本语法格式为: g = histeq(p, outlev) 其中p为读入的图像矩阵, outlev为输出图像的灰度级数。outlev的默认值为64,即64个灰度级,这样对图像的细节有一定改变。通常将其赋值为256,即全灰度级(uint8)。,【例3.5.4】对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); imshow(g); xlabel(c) ); subplot(2,2,4); imhist(g); xlabel(d) );,3.6 图像的增强滤波,上节介绍过的直方图均衡化是图像增强中常用的一种方法,图像增强技术还包括图像平滑滤波、图像锐化等。本节将从线性与非线性、平滑与锐化等不同角度介绍一些实用的空域图像增强技术。,3.6.1 空域滤波概述,图像增强技术从总体上可分为空域增强和频域增强两大类。空域增强也称为空间增强,是直接对图像中的像素进行操作的一种增强过程。 空域增强方法大致可分为对比度拉伸、平滑滤波和锐化滤波。灰度拉伸主要是利用点运算来修改图像像素灰度值;而平滑和锐化均是利用模板来修改(卷积运算)像素灰度值,从实现方法上讲是基于图像滤波的操作过程。 空域滤波是在图像空间中借助模板对图像进行领域操作的,输出图像每一个像素的取值都是根据模板对输入像素相应领域内的像素值进行计算得到的。,3.6.2 空域滤波分类,根据模板特点不同可以将空域滤波分为线性和非线性两大类。 按照空域滤波器的功能不同,又可将其分为平滑滤波器和锐化滤波器。平滑滤波器可以用低通滤波实现,目的在于模糊图像或消除图像噪声;锐化滤波器是用高通滤波实现的,目的在于增强被模糊图像的细节部分,具体可分为以下3类。 1均值滤波 均值滤波也称线性平滑滤波,其输出的像素值是由领域像素的平均值决定。,2中值滤波 中值滤波也称为非线性平滑滤波,其基本原理与均值滤波不同之处在于:中值滤波的输出像素值是由领域像素的中间值而不是平均值决定,中值滤波的名字也因此而得。与均值滤波相比,中值滤波对灰度发生聚变的像素不如均值滤波那么敏感,因此中值滤波能尽量保存图像的细节,模糊效应较少,适于消除图像中孤立噪声。 3锐化滤波 锐化滤波就是可以使用微分对图像进行处理,以此来锐化由于领域平均导致的图像模糊。图像处理中最常用的微分是利用图像沿某方向上的灰度变化率,即梯度进行的。,3.6.3 基于MATLAB的空域增强滤波,基于MATLAB图像处理的空域滤波,首先要定义滤波器,然后才能调用定义好的滤波器进行滤波。 imnoise是MATLAB提供的图像噪声模拟函数,其基本语法格式为: 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(拉普拉斯算子)、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)、边界循环(circular)还是边界对称(symmetric)。size_options可以为same或者full两者之一。如 hp = imfilter(p, w, replicate) medfilt2是一个二维中值滤波函数,其基本语法格式为: hp = medfilt2(p, m n, padopt) 其中hp为经过滤波后输出的图像,p为原图像,m及n规定了领域的大小,padopt指定了边界填充方式,默认方式为zeros。,【例3.6.1】对添加了椒盐噪声的图像分别进行均值滤波和中值滤波,滤波前后效果如图3.32所示。 p = imread(coins.png); p0 = imnoise(p, salt ,图3.32 均值滤波和中值滤波(a)原图像;(b)添加椒盐噪声后图像;(c)均值滤波后图像;(d)中值滤波后图像),【例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);,图3.33 拉普拉斯波和高斯拉普拉斯滤波(a)原图像;(b)拉普拉斯滤波后图像;(c)高斯拉普拉斯滤波后图像),3.7 图像的空间变换,图像的空间变换也称为图像的几何变换,是指将用户获得或设计的原始图像,按照需要产生大小、形状和位置的变化。图像几何变换是图像显示技术中的一个重要组成部分,常用的图像几何变换主要包括图像的缩放、图像的剪切及图像的旋转等内容。,3.7.1 图像比例缩放,图像比例缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍,从而获得一幅新的图像。有fxfy和 fxfy两种情况。 比例缩放所产生的图像中的像素可能在原图像中找不到相应的像素点,这样就必须进行插值处理。 图像插值处理常用的方法有两种,一种是最邻近插值法,另一种是通过一些插值算法来计算相应的像素值。 MATLAB中提供了三种图像插值方法,即最近邻插值、双线性插值和双三次插值。,通过函数imresize对图像进行插值缩放,其基本语法格式为: ps = imresize(p, m, method ) 其中ps为变换后的图像,p为输入图像,m放大倍数(当m1时缩小),method为插值方法的选择项,可选最近邻插值法(nearest)、双线性插值法(bilinear)及双三次插值法(bicubic),默认使用最近邻插值法。 另外一种经常用到的语法格式为: ps = imresize(p, m n, method ) 其中m和n分别为变换后图像的长宽,其它参数含义与上述相同。,【例3.7.1】对liftingbody.png图像进行缩小,其效果如图3.34所示。 p = imread(liftingbody.png); w = input(please input a number:); %交互输入缩小为0.2倍 ps = imresize(p,w); %缩小变换 imshow(p); figure; imshow(ps);,图3.34 对liftingbody.png图像进行缩小前后的效果(a)原图像;(b)缩小后拉伸显示后图像),3.7.2 图像剪切,图像处理工具箱中通过函数imcrop交互实现图像区域选取功能,用于剪切图像中的一个矩形子图,可用鼠标选取这个矩形,也可以通过参数指定这个矩形顶点的坐标。函数imcrop基本语法格式为: pc = imcrop(p) 或 pc = imcrop(p, rectangle) 其中pc为剪切后的图像,p为输入图像,rectangle为四个变量指定的一个矩形区域,即left bottom width height,数组中的四个变量分别表示矩形左下角的横坐标、纵坐标、矩形长度及宽度。,【例3.7.2】 对liftingbody.png图像进行剪切,其效果如图3.35所示。 p = imread(liftingbody.png); pc = imcrop(p,80 180 260 220); %输入矩形尺度进行选取 subplot(1,2,1); imshow(p); subplot(1,2,2); imshow(pc);,3.7.3 图像旋转,图像的旋转是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角度。 在图像进行旋转的时候,各像素的坐标必然发生变化,使得旋转之后不能正好落在整数坐标处,因此同缩放一样,也需要进行插值,插值方法也与缩放的插值方法一样,完全相同,即可用3种方法对图像进行插值旋转,默认的插值方法是最近邻插值法。 在MATBLA工具箱中的,通过函数imrotate实现对图像的旋转,imrotate函数的语法格式为: pr = imrotate(p, angle, method) 或 pr = imrotate(p, angle, method, crop) 其中pr为旋转后得到的图像,p为输入图像,angle为指定的旋转度数,参数method用于指定插值的方法,可选值为nearest(最近邻法),bilinear(双线性插值)及bicubic(双三次插值),默认值为nearest。参数crop允许用户对旋转后的图像进行自动剪切,使返回的图像与原图大小相同。,【例3.7.3】 对liftingbody.png图像进行旋转,其效果如图3.36所示。 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);,3.8 图像边缘检测与分割,图像分割是将数字图像分割成互不相交(不重叠)的有意义的子区域的过程。其目的是使各个区域与景物中以某种方式描述的物体相对应,以便进行高层次的图像解释、图像识别等处理。,3.8.1 边缘检测概述,图像分割一般是基于图像像素灰度值的基本特性不连续性与相似性中的一个或两个来进行的。区域内部的像素一般具有灰度相似性,而在区域之间的边界上一般具有灰度不连续性。 根据图像灰度级的突变进行图像分割的方法中,边缘检测方法通过检测包含不同区域的边缘来解决图像分割问题。边缘检测最通用的方法是检测灰度值的不连续性,灰度值的不连续是指在不同区域之间的边缘上像素灰度值的变化往往比较剧烈,一般利用图像一阶导数的极大值或者二阶导数的过零点信息提供判断边缘点的依据。,3.8.2 梯度算子,对于图像中任一像素点,可以用二维函数f(x,y)来表示,而梯度定义为向量f: 该向量的幅值为: 为简化计算,通常省略开方或通过取绝对值来近似计算,即 或,梯度向量的含义在于,它总是指向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为一可选参数。,1Roberts模板(算子),Roberts算子又称为Roberts交叉算子,它是由Roberts提出的一种利用局部差分算子寻找边缘的模板,它在22邻域上计算对角导数。在实际应用中,为了简化计算,常用梯度函数的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(默认值)。,2Sobel模板(算子),Roberts算子的一个主要问题是计算方向差分时对噪声敏感。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(默认值)。,3Prewitt模板(算子),Prewit提出了与Sobel算子类似的计算偏微分估计值的方法,Prewit模板如图: (e) Prewit-x (f) Prewit-y,Prewit边缘检测器调用语法如下: e , s = edge(p, prewitt, thresh, direct) 其中p为输入图像,thresh为指定的阈值,direct为检测边缘的首选方向,通常可选作horizontal (水平)、vertical(垂直)或both(默认值)。,3.8.2 二阶微分算子,上节讨论了计算一阶导数的边缘检测器,如果所求的一阶导数高于某一阈值,则可确定该点为边缘点,这样做会导致检测的边缘点太多。一种更好的方法就是求梯度局部最大值对应的点,并认定它们是边缘点。一阶导数的局部最大值对应着二阶导数的零交叉点(zero crossing)。这样,通过找图像强度的二阶导数的零交叉点就能找到精确边缘点。 在数字图像处理中,二阶导数常用于拉普拉斯算子的计算,即二维函数f(x,y)的拉普拉斯的表达式为:,二阶微分算子边缘检测器主要包括LoG算子和Canny算子。 常用的两种拉普拉斯模板如图所示:,1. LoG(Laplacian of a Gaussian)算子 LoG算子对含有噪声的图像是效果较好的边缘检测器。它把高斯平滑滤波器和拉普拉斯锐化滤波器结合了起来,先使用高斯平滑滤波器平滑掉噪声,再通过拉普拉斯锐化滤波器进行边缘检测,所以效果更好。当拉普拉斯算子输出出现过零点时就表明有边缘存在。 LoG边缘检测器的语法格式如下: e , s = edge(p, log, thresh, sigmma) 其中p为输入图像,thresh为指定的阈值T,sigmma为高斯滤波器的标准方差,默认值为2。若T值未指定,则函数edge会自动选择一个阈值。,2Canny算子,Canny算子对最急剧变化方向上的边缘特别敏感,但在沿边缘方向上是不敏感的,其作用就像一个平滑算子。Canny边缘检测器是高斯函数的一阶导数,是对信噪比和定位之乘积的最优化逼近算子。 算法有以下四个步骤:先用高斯滤波器平滑图像,然后用一阶偏导的有限差分来计算梯度的幅值和方向,再对梯度幅值进行非极大值抑制,最后用双阈值算法检测和连接边缘。 canny边缘检测器的语法格式如下: e , s = edge(p, canny, thresh, sigmma) 其中p为输入图像,thresh为指定的阈值T,若T值未指定,则函数edge会自动选择一个值,sigmma为平滑滤波器的标准方差,默认值为1。,【例3.8.1】对lena.bmp图像使用不同的算子进行边缘检测。检测结果如图3.39所示。 p=imread(lena.bmp); p=im2double(p); %转换为double 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,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);,图3.39 边缘检测结果((a)Lena源图;(b)使用Sobel算子;(c)使用Robert算子; (d)使用Prewitt算子;(e)使用LoG算子;(f)使用Canny算子),(a) (b) (c),几种边缘检测算子性能比较:,Roberts算子是卷积模板为22的算子,对具有陡峭的低噪声图像响应最好,但它存在一些功能上的缺陷,如不能检测45倍数的边缘,因此一般使用较少。 Sobel边缘检测器卷积模板为33的算子,对灰度渐变和噪声较多的图像处理效果较好。 Prewitt边缘检测器比Sobel检测器在计算上简单,但易于产生噪声。 LoG算子边缘检测器是先对图像作最佳平滑,然后再利用平滑图像的二阶微分零交叉确定边缘位置,它被认为是微分法中利用平滑二阶微分检测图像边缘较成功的一种算法。 Canny边缘检测器是在抗噪声干扰和精确定位之间选择一个最佳折衷方案,在理论上是迄今为至所发现的性能最优的一种边缘检测理论。,3.8.3 阈值分割,阈值化算法利用图像中要提取的目标物与其背景在灰度特性上的差异,把图像视为具有不同灰度级的两类区域(目标和背景)的组合,选取一个合适的阈值,以确定图像中每一个像素点应该属于目标还是背景区域,从而产生相应的二值图像。,如图所示,最简单的利用阈值方法来分割灰度图像的步骤如下:首先对一幅灰度取值在0和L-1之间的图像确定一个灰度阈值T(0TL-1),然后将图像中每个像素的灰度值与阈值T相比较,并将对应的像素根据比较结果划为两类:,阈值化算法通过设定不同的特征阈值,将像素点分为若干类,其关键在于阈值的选取。常见的阈值选取方法: 1极小值点阈值 如果将直方图的包络看作一条曲线,则选取直方图的谷可借助求曲线极小值的方法。 2迭代阈值 先取图像灰度范围的中值作为初始阈值T0,然后按迭代公式进行迭代。 3最大方差阈值(又称Otsu自动阈值处理方法) 通过函数graythresh实现最大方差阈值的选取,其基本语法格式为: thresh = graythresh(p) 其中p为输入图像,thresh为最终返回的阈值,其范围在01之间。,【例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);,图3.41 迭代阈值分割前后效果((a)原图像;(b)迭代阈值分割后图像),【例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);,图3.42 Ostu阈值分割前后效果((a)原图像; b.Ostu阈值分割后图像),
展开阅读全文