哈夫变换和Canny边缘检测算法及其实现代码.doc

上传人:re****.1 文档编号:560145339 上传时间:2022-09-14 格式:DOC 页数:14 大小:81.01KB
返回 下载 相关 举报
哈夫变换和Canny边缘检测算法及其实现代码.doc_第1页
第1页 / 共14页
哈夫变换和Canny边缘检测算法及其实现代码.doc_第2页
第2页 / 共14页
哈夫变换和Canny边缘检测算法及其实现代码.doc_第3页
第3页 / 共14页
哈夫变换和Canny边缘检测算法及其实现代码.doc_第4页
第4页 / 共14页
哈夫变换和Canny边缘检测算法及其实现代码.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《哈夫变换和Canny边缘检测算法及其实现代码.doc》由会员分享,可在线阅读,更多相关《哈夫变换和Canny边缘检测算法及其实现代码.doc(14页珍藏版)》请在金锄头文库上搜索。

1、哈夫变换和Canny边缘检测算法摘 要在图象边缘检测中往往要求所检测到的边缘具有封闭特性,本文详细地分析了目前常用的两种算法:哈夫变换和Canny边缘检测算法,最后,探讨边缘算子应满足的准则。关键词边缘检测;闭合性;哈夫变换;Canny算子1引言 图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量、检测和定位,自从1959提

2、出边缘检测以来,经过五十多年的发展,已有许多中不同的边缘检测方法。在我们常用的几种用于边缘检测的算子中Laplace算子常常会产生双边界;而其他一些算子如Sobel算子又往往会形成不闭合区域。本文主要讨论了在边缘检测中,获取封闭边界区域的算法。2 图象边缘检测的基本步骤 (1)滤波。边缘检测主要基于导数计算,但受噪声影响。但滤波器在降低噪声的同时也导致边缘强度的损失。 (2)增强。增强算法将邻域中灰度有显著变化的点突出显示。一般通过计算梯度幅值完成。 (3)检测。但在有些图象中梯度幅值较大的并不是边缘点。最简单的边缘检测是梯度幅值阈值判定。 (4)定位。精确确定边缘的位置。图1 边缘检测酸法的

3、基本步骤3 边界闭合的算法3.1 哈夫变换3 由于噪声的存在,用各种算子得到的边缘象素不连续,但是由于边缘象素之间有一定的连续性,我们就可以根据边缘象素在梯度幅度或梯度方向上的连续性把他们连接起来。具体说来,如果象素(s,t)在象素(x,y)的领域且它们的梯度幅度与梯度方向在给定的阈值下满足:T是幅度阈值;A是角度阈值; 那么,如对所有的边缘象素都进行上述的判断和连接就可以得到一个闭合的边界。哈夫变换方法是利用图像得全局特性而对目标轮廓进行直接检测的方法,在已知区域形状的条件下,哈夫变换可以准确地捕获到目标的边界(连续的获不连续的),并最终以连续曲线的形式输出变换结果,该变换可以从强噪声环境中

4、将已知形状的目标准确得分割提取出来。 哈夫变换的核心思想是: 点线的对偶性(duality)。通过变换将图象从图像控件转换到参数空间,在图像空间中一条过点(x,y)的直线方程为y=px+q,通过代数变换可以转换为另一种形式p=-px+y,即参数空间中过点(p,q)的一条直线,如果在图像空间中保持直线的斜率和截距的不变,其在参数空间必定过点(p,q),这也就说明,在图像空间中共线的点对应参数空间共点的线. 哈夫变换就是根据上述点线的对偶性把在图象空间中存在的直线检测问题转换为参数空间中存在的点检测问题,后者的处理要比前者简单易行得多,只需简单地累加统计即可实现对边缘的检测.哈夫变换不仅能检测直线

5、等一阶曲线的目标,对于园、椭圆等高阶的曲线都可以检测出来。如圆的方程为: 其参数空间是一个3D空间A(a,b,r),原理与检测直线上的点相同,只是复杂性增加了。如果圆的半径r己知,则问题又回到了2D空间A(a,b) 哈夫变换对已知目标的检测过程受随机噪声和曲线中断等不利因素的影响很小,而且分割出的目标是直接放到另一个“干净”的缓存中的,因此可以做到零噪声,是相当有优势的。常规的哈夫变换在理论上能对所有可以写出具体解析表达式的曲线进行目标检测,但是在实际处理时,经常待检测的目标不规则或是很难获取甚至根本没有解析式,此时就要采取广义上的哈夫变换来检测目标,32最优的阶梯型边缘检测算法(canny边

6、缘检测) 1.Canny边缘检测基本原理 (1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。 (2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子。这就是Canny边缘检测算子。 (3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。 2.Canny边缘检测算法: step1:用高斯滤波器平滑图象; step2:用一阶偏导的有限差分来计算梯度的幅值和方向; step3:对梯度幅值进行非极大值抑制; step4:用双阈值算法检测和连接边缘。step1:高斯平滑函数step3:非极大值抑制仅仅得到全局的梯度并不足以确定边缘,因此为确定边缘,

7、必须保留局部梯度最大的点,而抑制非极大值。(non-maxima suppression,NMS)解决方法:利用梯度的方向。图2非极大值抑制四个扇区的标号为0到3,对应3*3邻域的四种可能组合。 在每一点上,邻域的中心象素M与沿着梯度线的两个象素相比。如果M的梯度值不比沿梯度线的两个相邻象素梯度值大,则令M=0。即: step4:阈值化 减少假边缘段数量的典型方法是对Ni,j使用一个阈值。将低于阈值的所有值赋零值。但问题是如何选取阈值? 解决方法:双阈值算法。双阈值算法对非极大值抑制图象作用两个阈值1和2,且212,从而可以得到两个阈值边缘图象N1i,j和N2i,j。由于N2i,j使用高阈值得

8、到,因而含有很少的假边缘,但有间断(不闭合)。双阈值法要在N2i,j中把边缘连接成轮廓,当到达轮廓的端点时,该算法就在N1i,j的8邻点位置寻找可以连接到轮廓上的边缘,这样,算法不断地在N1i,j中收集边缘,直到将N2i,j连接起来为止。4 边缘算子应满足的准则 若满足此准则,就能保证单边缘只有一个响应。对一个算法的性能评价可分为两个阶段进行:计算假边缘与丢失边缘的数目;测量用于估计位置和方向的误差(或误差分布)。边缘检测算法的优劣也可用品质因数( Figure of Merit)来描述。Pratt品质因数是其中一种,它着重考虑了丢失了有效的边缘、边缘定位误差和将噪声判断为边缘等三种误差。5

9、结束语边缘检测在图象分割、模式识别、机器视觉等中都有重要作用,人们已研究出很多种边缘检测算法,而哈夫变换和canny边缘算子等是最经典的算法,人们已在这些经典算法基础上提出一些新的改进算法。canny算子代码void CreatGauss(double sigma, double *pdKernel, int *pnWidowSize);void GaussianSmooth(SIZE sz, LPBYTE pGray, LPBYTE pResult, double sigma);void Grad(SIZE sz, LPBYTE pGray, int *pGradX, int *pGradY

10、, int *pMag);void NonmaxSuppress(int *pMag, int *pGradX, int *pGradY, SIZE sz, LPBYTE pNSRst);void EstimateThreshold(int *pMag, SIZE sz, int *pThrHigh, int *pThrLow, LPBYTE pGray, double dRatHigh, double dRatLow);void Hysteresis(int *pMag, SIZE sz, double dRatLow, double dRatHigh, LPBYTE pResult);vo

11、id TraceEdge(int y, int x, int nThrLow, LPBYTE pResult, int *pMag, SIZE sz);void Canny(LPBYTE pGray, SIZE sz, double sigma, double dRatLow, double dRatHigh, LPBYTE pResult);#include afx.h#include math.h#include canny.h/ 一维高斯分布函数,用于平滑函数中生成的高斯滤波系数void CreatGauss(double sigma, double *pdKernel, int *pn

12、WidowSize)LONG i;/数组中心点int nCenter;/数组中一点到中心点距离double dDis;/中间变量double dValue;double dSum;dSum = 0;/ -3*sigma,3*sigma 以内数据,会覆盖绝大部分滤波系数*pnWidowSize = 1+ 2*ceil(3*sigma);nCenter = (*pnWidowSize)/2;*pdKernel = new double*pnWidowSize;/生成高斯数据for(i=0;i(*pnWidowSize);i+) dDis = double(i - nCenter); dValue

13、= exp(-(1/2)*dDis*dDis/(sigma*sigma)/(sqrt(2*3.1415926)*sigma); (*pdKernel)i = dValue; dSum+=dValue;/归一化for(i=0;i(*pnWidowSize);i+) (*pdKernel)i/=dSum;/用高斯滤波器平滑原图像void GaussianSmooth(SIZE sz, LPBYTE pGray, LPBYTE pResult, double sigma)LONG x, y;LONG i;/高斯滤波器长度int nWindowSize;/窗口长度int nLen;/一维高斯滤波器do

14、uble *pdKernel;/高斯系数与图像数据的点乘double dDotMul;/滤波系数总和double dWeightSum;double *pdTemp;pdTemp = new doublesz.cx*sz.cy;/产生一维高斯数据CreatGauss(sigma, &pdKernel, &nWindowSize);nLen = nWindowSize/2;/x方向滤波for(y=0;ysz.cy;y+) for(x=0;xsz.cx;x+) dDotMul = 0; dWeightSum = 0; for(i=(-nLen);i=0 & (i+x)sz.cx) dDotMul+=(double)pGrayy*sz.cx+(i+x) * pdKernelnLen+i; dWeightSum += pdKernelnLen+i; pdTempy*sz.cx+x = dDotMul/dWeightSum; /y方向滤波for(x=0; xsz.cx;x+) for(y=0; ysz.cy; y+) dDotMul = 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号