Canny算法研究.docx

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Canny算法研究剖析

实验目的了解OpenCV中的Canny函数及Canny算法,并能够自己实现实验环境Ubuntu14.04LTS+OpenCV+python2.7实验原理Canny算法原理Canny 边缘检测算法是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的最优算法, 最优边缘检测的三个主要评价标准是:低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。最小响应: 图像中的边缘只能标识一次。Canny算法的实现步骤灰度化由于边缘检测需要使用灰度图像,所以需要现将图像进行灰度化。方式一:Gray = (R + G + B)/3方式二:Gray = 0.299R + 0.587G + 0.114B其中方式二考虑了人眼的生理特性。高斯滤波(去噪)图像高斯滤波的实现可以用两个一维高斯核分别两次加权实现,也可以通过一个二维高斯核一次卷积实现。离散化的一维高斯函数与二维高斯函数如下:确定参数就可以得到一维核向量与二维核向量:得到高斯核之后,要对整个核进行归一化处理。灰一阶偏导的有限差分来计算梯度的幅值和方向关于图像灰度值得梯度可使用一阶有限差分来进行近似,这样就可以得图像在x和y方向上偏导数的两个矩阵。常用的梯度算子有如下几种:Roberts 算子Sobel算子Prewitt算子Canny算法使用的算子可以求出如下所示的几个矩阵:梯度非极大值抑制图像梯度幅值矩阵中的元素值越大,说明图像中该点的梯度值越大。在Canny算法中,非极大值抑制是进行边缘检测的重要步骤,是指寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,从而可以剔除掉一大部分非边缘点。双阈值算法检测和连接边缘Canny算法中减少假边缘数量的方法是采用双阈值法。选择两个阈值,根据高阈值得到一个边缘图像,这样一个图像含有很少的假边缘,但是由于阈值较高,产生的图像边缘可能不闭合,为解决此问题采用了另外一个低阈值。????在高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点邻域点中寻找满足低阈值的点,再根据此点收集新的边缘,直到整个图像边缘闭合。实验过程灰度化灰度化采用Gray = 0.299R + 0.587G + 0.114B的方式,能够更加符合人眼的生理特征。使用函数gray_scale实现,其中R,B,G的值从img矩阵中获得。高斯滤波高斯滤波使用OpenCV的函数GaussianBlur实现,可以自定义高斯内核的大小、高斯核函数X方向的标准偏差值、高斯核函数Y方向的标准偏差值和推断图像外部像素的边界模式。在此实验中使用(3*3)高斯内核,标准偏差值均设为0,边界模式采用默认值。灰一阶偏导的有限差分来计算梯度的幅值和方向自定义canny函数进行几个矩阵的计算。在计算出X方向和Y方向一阶导数的矩阵之后,利用numpy的矩阵运算,使用np.square(),np.sqrt()等函数,进行矩阵中元素运算之后可以得到梯度矩阵M,梯度角度矩阵Theta。遇到的问题:数据类型转换:图像矩阵中储存的数据类型是unit8,范围为0-255,若对其进行加减或乘除等运算,可能会导致数据溢出,得到错误的结果。所以要现将矩阵内数据类型转换成float。图像边缘index:对于图像的边缘,数组img[i][j+1]、img[i][j-1]、img[i+1][j]、img[i-1][j]中的某一个或两个会越界。所以在循环中要排除边界。而边界另行设定,我采取了在初始化时全部初始化成0的形式,即不用另行设定边界的矩阵值。np.true_divide()为无穷大或无效的情况:由于进行除法运算时存在0/0或者1/0的形式,结果会默认显示NaN或Inf的形式,为了后续的计算,要将这两种情况的值置为0。使用了np.errstate实现上述功能。算子的选取:使用不同的算子会出现不同的结果,每种结果都有各自的特点,不同算子的不同特点将在实验结果和实验结果分析中进行讨论。梯度非极大值抑制自定义non_max_suppress函数实现。为了提高效率,这个函数是在通过双阈值初步确定函数边界之后执行的,所以在得到矩阵的像素值等于255时,即被设定为边缘时,进行非极大值抑制的处理。处理包含4种情况:|gx||gy|或|gx||gy|,gx*gy0或gx*gy0。根据梯度角度进行插值,得到Temp1和Temp2,与目标点的梯度值进行比较,若任何一个比目标点大或者等于目标点,都可以确定目标点不是边缘,即将此点的灰度值置为0。遇到的问题:开始在设定目标点的灰度值时要注意忘记写index使得整个矩阵都被置为灰度值为0,即出现黑屏的情况。双阈值算法与边缘连接双阈值算法先检测整个矩阵的每个像素的灰度值,若灰度值

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档