第五章 边缘检测
5.1领域运算
边缘检测是在领域计算的基础下实现的。邻域运算是指当当前输出图像中每个象素是由对应的输入象素和它一个邻域内的象素共同决定时的图像运算,一般情况邻域是远比图像尺寸小的一规则形状,像是正方形2x2、3x3、4x4或用来近似表达为圆及椭圆等形状的多边形。信号与系统分析过程中的基本运算相关与卷积,到实际的图象处理中都表现为邻域运算。邻域运算和点运算一起形成最基本、最重要的图象处理工具。
边缘检测的目的是对数字图像中亮度变化明显的点进行标识。图像属性中的明显变化通常反映着属性的重要事件和改变。这些包括了深度上的不连续、表面方向的不连续、物质属性的变化和场景照明的变化。图像边缘检测大量减少了数据量,同时剔除了可以认为是不相关的信息,保留了图像重要结构属性。有很多方法用于边缘检测,绝大部分可以划分成两类:基于查找的一类和基于零穿越的一类。基于查找的方法是通过寻找图像一阶导数中的最大和最小值来检测边界,通常将边界定位在梯度最大的方向。基于零穿越的方法为通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点。
图5.1 几只常见算子的比较
19
5.2算子的比较选择
由上图[19]总结:
Roberts:采用对角线方向相邻两像素之差表示信号的突变,性能上检测水平和垂直方向边缘好于斜线方向,可是对噪声敏感,检测出的边缘比较细。
Sobel:边缘检测算子是像素邻域的计算加权和,模板中心值比较大,结果不但产生较好的边缘效果,同时对噪声也具有平滑作用。但存在伪边缘,边缘较粗定位精度低。
Prewitt:对噪声具有平滑作用,检测出的结果边缘比较粗,定位精度,但容易损失角点。
Laplacian:算子二阶微分算子,对于图像中的阶跃性边缘点的定位较准确,并且对噪声非常敏感,但是丢失一部分边缘的方向信息,造成了一些不连续的检测边缘。
LOG算子:首先使用高斯函数进行滤波,再使用Laplacian算子检测边缘,克服Laplacian算子抗噪声能力相对差的缺点,LOG算子中高斯函数的方差参数σ的选则很关键,σ越大越能避免虚假边缘的检出,但边缘也被平滑,造成边缘点的丢失。σ越小,噪声抑制能力则相对下降,容易出现虚假边缘。
Canny:同样采用高斯函数对图像进行平滑处理,所以具有较强的噪声抑制能力;但同样该算子也会将一些高频边缘平滑掉,造成边缘丢失,采用双阈值算法进行检测和连接边缘,边缘的连续性较好。
根据图象边缘处的一阶微分应该是极值点的事实,图像边缘处的二阶微分应为零,确定过零点的位置要比确定极值点容易得多也更加精确。但是显然二阶微分对噪声更为敏感。为抑制噪声,可先作平滑滤波然后再作二次微分,通常采用高斯函数作平滑滤波,故有LoG(Laplacian of Gaussian)算子。在实现时一般用两个不同参数的高斯函数的差DoG(Difference of Gaussians)对图像作卷积来近似。
目的是使用二阶求导的LOG算子求取边缘可以得到比较清晰的图像,但是计算量较大。而DOG算子计算简单,只需要将两个高斯平滑后的图像F相减即能得到,执行效率较高;其次,DOG算子检测出的特征点稳定性较好,与LoG检测效果相近。
作为一个增强算法,DOG可以被用来增加边缘和其他细节的可见性,大部分的边缘锐化算子使用增强高频信号的方法,但是因为随机噪声也是高频信号,很多锐化算子也增强了噪声。DOG算法去除的高频信号中通常包含了随机噪声,所以这种方法是最适合处理那些有高频噪声的图像。这个算法的一个主要缺点就是在调整图像对比度的过程中信息量会减少[20]。
(6) [21]
20
DOG算子:D(x,y,σ)=*G(x,y,kσ)?G(x,y,σ)+?f(x,y)=F(x,y,kσ)?F(x,y,σ)(7)
5.3边缘检测
%边缘检测
%读取双边滤波后x次的图像 f1=im2double(Ix);
f1=applycform(f1,makecform('srgb2lab')); 两个高斯滤波相减求出Dog算子
DoG=fspecial('gaussian',15,2)-fspecial('gaussian',15,1); 使用Dog算子卷积得到边缘
Edge=imfilter(f1(:,:,1) ,DoG,'conv','circular');
利用的是DOG算子对图像进行卷积得到,如原理中所述,该实验中我们一再强调保留边缘,此时的DOG算子也是如此,而且处理的对象是刚双边过滤完的图像而不是量化完的图像,因为量化后产生的色差会多生产多余的边缘线条,这并不是我们想要的。边缘检测得到结果如图:
图5.2 边缘检测
可以看到DOG算子卷积之后得到了十分好的效果,手指部分完全的保留了下来,甚至整张图像各处都有遗留下来的细浅条纹,特别是下巴部分,这些条纹会在恢复图像后出现,使图像变乱,不是我们想要的结果,我们将在接下来的操作中消除不需要的东西并进行其他的美化。
5.4阈值处理
在漫画中,每一条边缘都是清晰可见的,若要实现这一特点,就需要统一边缘的强度。在我们边缘检测的结果中,得到了整幅图像的边缘,但是由于强度不一,可以看到
21
一些很白的边缘线,合成时它们会显得太硬,造成人对弱一点的边缘的忽视,而较黑的边缘线可能在合成过程中便消失了,没达到提取边缘的意义。
阈值处理:“阈值”命令可以将灰度或彩色图像转换形成高对比度的黑白图像。可以指定某个色阶作为阈值。所有比阈值亮的像素转换为白色;所有比阈值暗的像素转换为黑色。“阈值”命令对确定图像的最亮与最暗区域很有用。在图像的二值化中常常使用阈值,并且结果严重依赖阈值的选择。此次实验中,将用阈值处理分开归一大值和小值,达到边缘增强,过滤细微处的效果。
对图像进行强弱边缘的统一,在图像矩阵中高于max_gradient的数值设置为max_gradient,低于min_gradient的强制归0,这样使得边缘检测图像白色强边缘能够保留下来,而那些散布在各处的细小波纹会因为小于最小值而被过滤,中间还有一部分则不处理形成弱一点的边缘,让边缘图像更精致,如图。因为最后要叠加的是L空间,同时加强边缘的强度,所以用图像乘以一个大于L空间最大值(100)的数值,此次选取的为130。此时得到的边缘检测图像算是比较完整的了。
%边缘强度统一
%max_gradient=; min_gradient=; Edge1=im2double(Edge); %强统一
Edge1(Edge>max_gradient)=max_gradient; %弱统一
Edge1(Edge black2=im2double(black1); 图5.3 强度统一后 22 5.5开运算和闭运算 膨胀和腐蚀运算是形态学图像处理的基础。我们之后的操作基于这两个运算方法 [22] 。 A被B腐蚀后用B来膨胀结果称为开运算,形态学开运算可以完全删除不能包含结 构元素的对象区域,达到平滑了对象的轮廓,断开狭窄的连接,去掉细小的突出部分的效果,用函数imopen实现;A被B膨胀后再腐蚀称为闭运算,闭运算一般将狭窄的缺口连接起来从而形成细长的弯口,并且填充比结构元素小的洞,用函数imclose实现。而对同一图像进行先开运算再闭运算能偶消除图像上的杂散点。 %开闭运算 %创建一个方形的结构元素 se=strel('square',2); black3=imopen(black2,se); black3=imclose(black3,se); 在直接使用图7处理后合成最终图,可以说是得到的预期想要的结果,但是仍有一点不足,可以看到眼眶、额头处还残留一些散乱的点,选择处理这些点的方法是使用开运算之后闭运算,达到消除这些杂散点的目的。在设置好算子后,在边缘检测强度统一的图像后,对该图像先开运算再闭运算。结果图因为是黑白灰度图不够清晰,所以展示最终结果图的对比: a.未处理的图像 b.经过开闭运算的图像 图5.4去除杂散点 5.6图像合成 要将边缘图像加到经过颜色量化处理的图像上,必须将后者分离为不包含颜色图层,基于上文所述的Lab颜色空间,在这同样将图像分割为L、a、b3个图层,单独拿出L图层与边缘图像进行处理。照原理所述,L空间0为黑色,若想得到边缘(黑色)加强的图像,则要用原图像的L空间矩阵减去边缘检测图像(边缘检测图像中边缘为白色,即为大值),结果边缘被减后趋近于0值使得边缘突出。遵守目的之一要使图像变 23