边缘检测算子比较
LOG与Canny边缘检测比较

几种常用边缘检测算法的比较

几种常用边缘检测算法的比较边缘检测是在数字图像上寻找图像亮度变化的过程,它对于图像处理和计算机视觉任务非常重要。
常见的边缘检测算法有Sobel算子、Prewitt算子、Roberts算子和Canny边缘检测算法。
本文将对这几种算法进行比较。
1. Sobel算子:Sobel算子是一种常见的边缘检测算法,它通过计算图像像素点与其邻域像素点之间的差异来检测边缘。
Sobel算子具有简单、快速的优点,可以检测水平和垂直方向的边缘,但对于斜向边缘检测效果较差。
2. Prewitt算子:Prewitt算子也是一种常用的边缘检测算法,它类似于Sobel算子,通过计算图像像素点与其邻域像素点之间的差异来检测边缘。
Prewitt算子可以检测水平、垂直和斜向边缘,但对于斜向边缘的检测结果可能不够精确。
3. Roberts算子:Roberts算子是一种简单的边缘检测算法,它通过计算图像像素点与其对角线方向上的邻域像素点之间的差异来检测边缘。
Roberts算子计算简单,但对于噪声敏感,容易产生干扰边缘。
4. Canny边缘检测算法:Canny边缘检测算法是一种经典的边缘检测算法,它包含多个步骤:高斯滤波、计算梯度、非最大抑制和双阈值处理。
Canny算法具有良好的边缘定位能力,并且对于噪声和细节边缘具有较好的抑制效果。
但Canny算法计算复杂度较高,在处理大规模图像时可能较慢。
综上所述,不同的边缘检测算法具有各自的优缺点。
若要选择适合应用的算法,需要综合考虑图像特点、计算复杂度和应用需求等因素。
如果对图像边缘的方向要求不高,可以选择Sobel或Prewitt算子;如果对图像边缘的方向要求较高,可以选择Canny算法。
另外,为了获得更好的边缘检测结果,通常需要进行适当的预处理,如灰度化、滤波和阈值处理等。
最后,对于不同的应用场景,可能需要使用不同的算法或算法组合来满足特定需求。
几种边缘检测算子比较

常用的检测算子有:(1)微分算子(2)拉普拉斯高斯算子(3)canny算子微分算子Sobel算子, Robert算子,prewitt算子比较Sobel算子是滤波算子的形式来提取边缘。
X,Y方向各用一个模板,两个模板组合起来构成1个梯度算子。
X方向模板对垂直边缘影响最大,Y方向模板对水平边缘影响最大。
Robert算子是一种梯度算子,它用交叉的差分表示梯度,是一种利用局部差分算子寻找边缘的算子,对具有陡峭的低噪声的图像效果最好。
prewitt算子是加权平均算子,对噪声有抑制作用,但是像素平均相当于对图像进行地同滤波,所以prewitt算子对边缘的定位不如robert算子。
源程序:i=imread('tanke.jpg');i2=im2double(i);ihd=rgb2gray(i2);[thr,sorh,keepapp]=ddencmp('den','wv',ihd);ixc=wdencmp('gbl',ihd,'sym4',2,thr,sorh,keepapp);figure,imshow(ixc),title('消噪后图像');k2=medfilt2(ixc,[7 7]);figure,imshow(k2),title('中值滤波');isuo=imresize(k2,0.25,'bicubic');%sobert、robert和prewitt算子检测图像边缘esobel=edge(isuo,'sobel');erob=edge(isuo,'roberts');eprew=edge(isuo,'prewitt');subplot(2,2,1);imshow(isuo);title('前期处理图像');subplot(2,2,2);imshow(esobel);title('sobel算子提取');subplot(2,2,3);imshow(erob);title('roberts算子提取');subplot(2,2,4);imshow(eprew);title('prewitt 算子提取'); 程序运行结果:拉普拉斯高斯算子拉普拉斯高斯算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉。
图像边缘检测中的微分算子法及其比较

与区域( 包括不同色彩 ) 之间。 边缘表明一个特征 区域的终结和另一特征区域的开始 。边缘所分开区 域的内部特征或属性是一致的, 而不同的区域内部 特征或属性是不同的。边缘检测正是利用物体和背 景在某种图像特征上的差异来实现检测 , 这些差异 包括灰度、 颜色或纹理特征, 边缘检测实际上就是检 测图像特征发生变化的位置。 边缘的类型很多, 常见的有以下三种: 第一种是 阶梯形边缘, 其灰度从低跳跃到高; 第二种是屋顶形 边缘, 其灰度从低逐渐到高然后慢慢减小 ; 第三种是 线性边缘, 其灰度呈脉冲跳跃变化。如图 1 所示。
0
引言
边缘检测是图像分析与识别的第一步, 边缘检 测在计算机视觉、 图像分析等应用中起着重要作用 , 图像的其他特征都是由边缘和区域这些基本特征推 导出来的, 边缘检测的效果会直接影响图像的分割 和识别性能。边缘检测法的种类很多, 如微分算子 [1 ] 法、 样板匹配法、 小波检测法、 神经网络法等等 , 每一类检测法又有不同的具体方法。 目前, 微分算 Sobel, Prewitt, Canny, Laplacian, 子法 中 有 Roberts, Log 以及二阶方向导数等算子检测法, 本文仅将讨 论微分算子法中的几个常用算子法 。
图像边缘检测中的微分算子法及其比较
龙 清
( 重庆广播电视集团 ( 总台) ,重庆 401147 )
摘
要: 边缘是图像最基本的特征, 边缘检测是图像分析与识别的重要环节。 基于微分算子的 边缘检测是目前较为常用的边缘检测方法 。通过对 Roberts,Sobel, Prewitt, Canny 和 Log 等几个
2 h( x, y) = [ y) ] * f( x, y) g( x, 2 y) = 其中, g( x,
边缘检测技术及比较

Gn nG其中
G * f x , y n G * f x , y G / x G G / y n表示边缘方向,G表示梯度矢量,边缘强度由 G * f x, y 决定。
河北工业大学 机械工程学院
三、几种边缘检测算法的比较
3.Krisch算子对8个方向边缘信息进行检测,因此具有较好的边缘定 位能力,并且对噪声有一定的抑制作用,就边缘定位能力和抗噪声 能力来说,该算子的效果比较理想;但Krisch算子和LOG算子提取出 的边缘和细节都比较多,能够提取出对比度弱的边缘,也正因如此, 受噪声的影响较大,虚假边缘较多,边缘较粗。 4.LOG算子首先通过高斯函数对图像作平滑处理,因此对噪声的抑制 作用比较明显,但同时也可能将原有的边缘也平滑了,造成某些边 缘无法检测到。此外高斯函数中方差参数σ的选择,对图像边缘检 测效果有很大的影响。σ越大,检测到的图像细节越丰富,但对噪 声抑制能力相对下降,易出现伪边缘,反之则抗噪声性能提高,但 边缘定位准确性下降,易丢失许多真边缘,因此,对于不同图像应 选择不同参数;
河北工业大学 机械工程学院
1.1 一阶微分算子
f f f x , y i j为图像的梯度,f x, y 可包含灰度变化信息。 x y 记:e x, y f x2 f y2 为f x, y 的梯度幅值,e x, y 可以用作边缘 检测算子,为简化运算也可将e x, y 定义为偏导数f x、f y的绝对值之 和:e x, y f x x, y f y x, y
halcon 边缘检测算子

halcon 边缘检测算子摘要:1.边缘检测的定义和意义2.常见的边缘检测算子3.Halcon 边缘检测算子的特点和应用4.Halcon 边缘检测算子的优缺点5.结论正文:边缘检测是计算机视觉和图像处理领域的重要技术之一,其目的是从图像中提取出物体边缘的信息。
边缘检测的定义是:使用数学方法提取图像像元中具有亮度值(灰度)空间方向梯度大的边、线特征的过程。
边缘,是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。
图像的边缘对应着图像灰度的不连续性。
显然图像的边缘很少是从一个灰度跳到另一个灰度的理想状况。
真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。
边缘的锐利程度由图像灰度的梯度决定。
梯度是指灰度变化的最快的方向和数量。
常见的边缘点有三种,分别是阶梯形边缘、脉冲形边缘和屋顶形边缘。
在边缘检测中,有许多常见的边缘检测算子,如Sobel 算子、Prewitt 算子、Roberts 算子和Canny 算子等。
这些算子都有各自的特点和适用场景。
Sobel 算子主要用来检测边缘,其技术上是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值。
Prewitt 算子和Roberts 算子也是常用的边缘检测算子,它们通过计算图像的梯度来检测边缘。
Canny 算子则是一种多步骤的边缘检测算法,能够检测出更加精确的边缘。
Halcon 边缘检测算子是Halcon 图像处理库中的一种边缘检测算子。
Halcon 边缘检测算子的特点是能够自适应地调整边缘检测的参数,如边缘检测的阈值、边缘检测的类型等。
这使得Halcon 边缘检测算子能够更好地适应不同的图像和应用场景。
Halcon 边缘检测算子的应用主要包括机器视觉、工业自动化、医学影像处理等领域。
Halcon 边缘检测算子的优缺点如下。
优点:首先,Halcon 边缘检测算子具有较高的检测精度和鲁棒性,能够检测出图像中的细小边缘和噪声干扰;其次,Halcon 边缘检测算子具有自适应的参数调整能力,能够适应不同图像和应用场景;最后,Halcon 边缘检测算子的计算效率较高,能够在较短的时间内完成边缘检测任务。
边缘检测与梯度算子

边缘检测与梯度算⼦边缘检测边缘是指图象中灰度发⽣急剧变化的区域。
图象的变化情况可以⽤灰度分布的梯度来反映,给定连续图象f(x,y),其在边缘法线⽅向上取得局部最⼤值。
图象中⼀点的边缘被定义为⼀个⽮量,模为当前点最⼈的⽅向导数,⽅向为该⾓度代表的⽅向。
通常我们只考虑其模,⽽不关⼼⽅向。
梯度算⼦(⼀)梯度算⼦可分为3类:1、使⽤差分近似图像函数导数的算⼦。
有些是具有旋转不变性的(如:),因此只需要⼀个卷积掩模来计算。
其它近似的算⼦使⽤⼏个掩模。
2、基于图像函数⼆阶导数过零点的算⼦(如:M arr—Hild reth或Canny边缘检测算⼦。
3、试图将图像函数与边缘的参数模型相匹配的箅⼦。
(⼆)第⼀类梯度算⼦(Laplace)算⼦通常使⽤3×3的掩模,有时也使⽤强调中⼼象素或其邻接性的(这种近似不再具有旋转不变性)。
拉普拉斯算⼦的缺点:它对图像中的某些边缘产⽣双重响应。
图像锐化(shapeening)图像锐化的⽬的是图像的边缘更陡峭、清晰。
的输出图像f是根据下式从输⼊图像g得到的:f(i,j)=g(i,j)-c s(i,j),其中c是反映锐化程度的正系数,s(i,j)是图像函数锐化程度的度量,⽤梯度箅⼦来计算,Laplacian箅⼦常被⽤于这⼀⽬的。
Prewitt边缘检测算⼦Sobel边缘检测算⼦(三)第⼆类梯度算⼦--⼆阶导数过零点算⼦根据图象边缘处的⼀阶微分(梯度)应该是极值点的事实,图象边缘处的⼆阶微分应为零,确定过零点的位置要⽐确定极值点容易得多也⽐较精确。
右侧是Lena的过零点检测结果。
为抑制噪声,可先作平滑滤波然后再作⼆次微分,通常采⽤⾼斯函数作平滑滤波,故有LoG(Laplacian of Gaussian)算⼦。
⾼斯-拉普拉斯(LoG,Laplacian of Gaussian)算⼦。
噪声点对边缘检测有较⼤的影响,效果更好的边缘检测器是⾼斯-拉普拉斯(Lo G)算⼦。
它把⾼斯平滑滤波器和拉普拉斯滤波器结合起来,先平滑掉噪声,再进⾏,所以效果更好。
图像处理中的边缘检测算法研究与性能评估

图像处理中的边缘检测算法研究与性能评估引言:在当今数字图像处理领域,边缘检测一直是一个重要且挑战性的问题。
边缘提取是图像处理中的一项基本操作,对于目标检测、图像分割和图像识别等任务都具有重要意义。
边缘检测的目标是找到图像中明显的灰度跃变区域,以准确地确定物体的边缘位置。
本文将介绍几种常见的图像处理中的边缘检测算法,并对其性能进行评估。
一、经典边缘检测算法1. Sobel算子Sobel算子是一种基于差分的边缘检测算子,它结合了图像梯度的信息。
Sobel算子使用一个3×3的模板对图像进行卷积操作,通过计算水平和垂直方向上的梯度来找到边缘位置。
Sobel算子虽然简单,但在边缘检测中表现良好。
2. Prewitt算子Prewitt算子是另一种基于差分的边缘检测算子,与Sobel 算子类似,它也使用一个3×3的模板对图像进行卷积操作。
该算子通过计算水平和垂直方向上的梯度来检测边缘。
Prewitt 算子在边缘检测中也有较好的性能。
3. Canny边缘检测Canny边缘检测是一种广泛应用的边缘检测算法。
与Sobel 和Prewitt算子相比,Canny算法不仅能够检测边缘,还能够进行边缘细化和抑制不必要的边缘响应。
它通过多阶段的边缘检测过程,包括高斯滤波、计算梯度幅值和方向、非极大值抑制和双阈值处理等步骤,来提取图像中的边缘。
二、边缘检测算法的性能评估1. 准确性评估准确性是评估边缘检测算法好坏的重要指标。
在进行准确性评估时,可以使用一些评价指标,如PR曲线、F值等。
PR 曲线是以检测到的边缘像素为横坐标,以正确的边缘像素为纵坐标绘制的曲线,用于评估算法的召回率和准确率。
F值则是召回率和准确率的综合评价指标,能够综合考虑算法的检测效果。
2. 实时性评估实时性是边缘检测算法是否适用于实际应用的重要因素。
在实时性评估时,可以考虑算法的运行时间,以及算法对硬件资源的要求。
边缘检测算法应尽量满足实时性的要求,并能够在不同硬件平台上高效运行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
边缘检测算子比较不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。
需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。
有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,因为现实世界中的物体是三维的,而图像只具有二维信息,从三维到二维的投影成像不可避免的会丢失一部分信息;另外,成像过程中的光照和噪声也是不可避免的重要因素。
正是因为这些原因,基于边缘的图像分割仍然是当前图像研究中的世界级难题,目前研究者正在试图在边缘提取中加入高层的语义信息。
课题所用图像边缘与边界应该算是等同的。
在实际的图像分割中,往往只用到一阶和二阶导数,虽然,原理上,可以用更高阶的导数,但是,因为噪声的影响,在纯粹二阶的导数操作中就会出现对噪声的敏感现象,三阶以上的导数信息往往失去了应用价值。
二阶导数还可以说明灰度突变的类型。
在有些情况下,如灰度变化均匀的图像,只利用一阶导数可能找不到边界,此时二阶导数就能提供很有用的信息。
二阶导数对噪声也比较敏感,解决的方法是先对图像进行平滑滤波,消除部分噪声,再进行边缘检测。
不过,利用二阶导数信息的算法是基于过零检测的,因此得到的边缘点数比较少,有利于后继的处理和识别工作。
各种算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位;Roberts算子:边缘定位准,但是对噪声敏感。
适用于边缘明显且噪声较少的图像分割。
Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。
经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。
Prewitt算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。
Sobel算子:Sobel算子和Prewitt算子都是加权平均,但是Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。
一般来说,距离越远,产生的影响越小。
Isotropic Sobel算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性。
在边沿检测中,常用的一种模板是Sobel 算子。
Sobel 算子有两个,一个是检测水平边沿的;另一个是检测垂直平边沿的。
Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的,另一个是检测垂直平边沿的。
各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。
由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。
美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们可以给出阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。
上面的算子是利用一阶导数的信息,属于梯度算子范畴。
Laplacian算子:这是二阶微分算子。
其具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。
但是,其对噪声比较敏感,所以,图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。
Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。
所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。
微分算子在图像处理中扮演重要的角色,其算法实现简单,而且边缘检测的效果又较好,因此这些基本的微分算子是学习图像处理过程中的必备方法,下面着重讨论几种常见的微分算子。
1.Sobel其主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值,缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel 算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意,算法具体实现很简单,就是3*3的两个不同方向上的模板运算,这里不再写出。
2.Robert算子根据任一相互垂直方向上的差分都用来估计梯度,Robert算子采用对角方向相邻像素只差3.Prewitt算子该算子与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。
placian算子拉普拉斯算子是一种二阶微分算子,若只考虑边缘点的位置而不考虑周围的灰度差时可用该算子进行检测。
对于阶跃状边缘,其二阶导数在边缘点出现零交叉,并且边缘点两旁的像素的二阶导数异号。
5.Canny算子该算子功能比前面几种都要好,但是它实现起来较为麻烦,Canny算子是一个具有滤波,增强,检测的多阶段的优化算子,在进行处理前,Canny算子先利用高斯平滑滤波器来平滑图像以除去噪声,Canny分割算法采用一阶偏导的有限差分来计算梯度幅值和方向,在处理过程中,Canny算子还将经过一个非极大值抑制的过程,最后Canny算子还采用两个阈值来连接边缘。
下面算法是基于的算法不可能直接运行,只是我把Canny的具体实现步骤写了出来,若需用还要自己写。
该算子具体实现方法:// anny.cpp: implementation of the Canny class.////////////////////////////////////////////////////////////////////////#include "anny.h"#include "math.h"//#include "algorithms.h"//#include "algorithm.h"#include "stdlib.h"//#include "maths.h"//using namespace std;//////////////////////////////////////////////////////////////////////// Construction/Destruction////////////////////////////////////////////////////////////////////// Canny::Canny(int PicHeight,int PicWidth,double ** PicData,double PicSigma,double PicRatioLow,double PicRatioHigh){iHeight=PicHeight;iWidth=PicWidth;iData=PicData;sigma=PicSigma;dRatioLow=PicRatioLow;dRatioHigh=PicRatioHigh;}Canny::~Canny(){}void Canny::CannyArith(int **iEdgePoint){int i;int **iGradX ; // 指向x方向导数的指针int **iGradY ; // 指向y方向导数的指针int **iExtent ; // 梯度的幅度iGradX=new int *[iHeight];for(i=0;i<iHeight;i++)iGradX[i]=new int[iWidth];iGradY=new int *[iHeight];for(i=0;i<iHeight;i++)iGradY[i]=new int[iWidth];iExtent=new int *[iHeight];for(i=0;i<iHeight;i++)iExtent[i]=new int[iWidth];// 对原图象进行滤波GaussionSmooth();// 计算X,Y方向上的方向导数DirGrad(iGradX,iGradY);// 计算梯度的幅度GradExtent(iGradX,iGradY,iExtent);// 应用non-maximum 抑制NonMaxSuppress(iExtent,iGradX,iGradY,iEdgePoint);// 应用Hysteresis,找到所有的边界Hysteresis(iExtent,iEdgePoint);// 释放内存for(i=0;i<iHeight;i++)delete []*(iGradX+i);delete iGradX;for(i=0;i<iHeight;i++)delete []*(iGradY+i);delete iGradY;for(i=0;i<iHeight;i++)delete []*(iExtent+i);delete iExtent;}void Canny::GaussionSmooth(){int i,j,k; //循环变量int iWindowSize; //记录模板大小的变量int iHalfLen; //模板大小的一半double *pdKernel; //模板各点的权值double dDotMul; //模板与对应像素点的卷积和 double dWeightSum; //模板的权值累加和double **dTemp; //记录图像数据的中间变量 //开辟空间dTemp=new double *[iHeight];for(i=0;i<iHeight;i++)dTemp[i]=new double[iWidth];//获得模板长度和模板的各个权值MakeGauss(&pdKernel,&iWindowSize);//得到模板的一半长度iHalfLen=iWindowSize/2;//对图像对水方向根据模板进行平滑for(i=0;i<iHeight;i++){for(j=0;j<iWidth;j++){dDotMul=0;dWeightSum=0;for(k=(-iHalfLen);k<=iHalfLen;k++){if((k+j>=0)&&(k+j<iWidth)){dDotMul+=iData[i][j+k]*pdKernel[k+iHalfLen];dWeightSum+=pdKernel[k+iHalfLen];}}dTemp[i][j]=dDotMul/dWeightSum;}}//对图像垂直方向上根据模板的转置进行平滑(注意图像数据是在水平平滑之后进行的) for(i=0;i<iWidth;i++){for(j=0;j<iHeight;j++){dDotMul=0;dWeightSum=0;for(k=(-iHalfLen);k<=iHalfLen;k++){if((k+j>=0)&&(k+j<iHeight)){dDotMul+=dTemp[j+k][i]*pdKernel[k+iHalfLen];dWeightSum+=pdKernel[k+iHalfLen];}}iData[j][i]=dDotMul/dWeightSum;}}//空间释放delete []pdKernel;pdKernel=NULL;for(i=0;i<iHeight;i++)delete []*(dTemp+i);delete dTemp;}void Canny::MakeGauss(double **pdKernel,int *iWindowSize){int i; //循环变量int nCenter; //确定高斯模板的一半长度double dDistance; //一维高斯模板各点离中心点的距离double PI=3.1415926; //圆周率double dValue; //中间变量,记录高斯模板各点的权值(未经归一化)double dSum=0; //中间变量,记录高斯模板各点权值的总和*iWindowSize=int(1+2*int(3*sigma+0.5)); //确定一维高斯模板长度,根据概率论的知识,选取[-3*sigma, 3*sigma]以内的数据。