PS:计算机视觉课程的一项大作业,作为门外汉,在网上查找资料学习和复现时踩了一些坑,在完成作业后分享一下,希望后面的小白同学少走弯路。

1.问题描述

在计算机视觉/机器视觉领域,图像分割的应用十分普遍,它是指将数字图像细分为多个图像子区域的过程。图像分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析。它的基本形式通常为定位图像中的物体和边界,结果是图像上子区域或轮廓线的集合。图像分割方法主要包括阈值处理(二值化)、聚类法、边缘检测和区域生长等。对于图像分割问题的求解没有统一范式,通常要与领域知识充分结合,才能更为有效地解决。

边缘检测是基于灰度突变来分割图像的常用方法,其实质是提取图像中不连续部分的特征。目前常见边缘检测算子有差分算子、Roberts算子、Sobel算子、Prewitt算子、Log算子以及Canny算子等。其中,Canny算子是由计算机科学家John F. Canny于1986年提出的一种边缘检测算子,是目前理论上相对最完善的一种边缘检测算法。在MATLAB、OpenCV等常用图像处理工具中已有内置的Canny算子API,本次大作业将依据Canny算子的算法原理在MATLAB环境中进行复现,并与MATLAB内置Canny算子的效果进行对比。

2.算法原理

基于Canny算子的边缘检测主要有5个步骤,依次是高斯滤波、像素梯度计算、非极大值抑制、滞后阈值处理和孤立弱边缘抑制。

(1) 高斯滤波

高斯滤波使用的高斯核是具有

两个维度的高斯函数,且两个维度上标准差一般取相同,形式为:

高斯滤波,即使用即使用某一尺寸的二维高斯核与图像进行卷积。由于数字图像的数据形式为离散矩阵,高斯核是对连续高斯函数的离散近似,通过对高斯曲面进行离散采样和归一化得出。例如,尺寸为

,标准差为
的高斯核为:

在确定高斯核后,将其与图像进行离散卷积即可。

(2) 使用Sobel算子计算像素梯度

Sobel算子是两个

的矩阵,分别为
。前者用于计算图像
方向像素梯度矩阵
,后者用于计算图像
方向像素梯度矩阵
。具体形式为:

其中,

为灰度图像矩阵,且此处的
表示互相关运算(卷积运算可视为将卷积核旋转180°后的互相关运算)。需要说明的是,图像矩阵坐标系原点在左上角,且
正方向为从左到右,
正方向为从上到下。则由

可计算得到梯度强度矩阵

(3) 非极大值像素梯度抑制

非极大值像素梯度抑制的目的在于消除边缘检测带来的杂散响应,起到将边缘“瘦身”的作用。其基本方法是将当前像素梯度强度与沿正负梯度方向上的相邻像素的梯度强度进行比较,若其最大(即为极值),则保留该像素为边缘点,若不是最大,则对其进行抑制,不将其作为边缘点。为了更精确计算,通常在跨越梯度方向的两个相邻像素之间使用线性插值来得到要参与比较的像素梯度。

图1. 像素梯度方向线性插值示意图

如图1所示,可将像素的邻接情况划分为4个区域,其中每个区域包含上下两部分。若中心像素点

方向梯度强度为
方向梯度强度为
,梯度强度为
,则根据
的正负和大小可判断出其梯度方向所属区域,进而根据其像素进而根据其像素梯度方向以及相邻点的像素梯度线性插值得到正负梯度方向的两个参与比较的梯度强度
。公式如下:

其他三个区域的计算方法类似。需要注意的是,若

,说明像素点无像素梯度,其为非边缘。

(4) 阈值滞后处理

定义一个高阈值和一个低阈值。梯度强度低于低阈值的像素点被抑制,不作为边缘点;高于高阈值的像素点被定义为强边缘,保留为边缘点;处于高低阈值之间的定义为弱边缘,留待进一步处理。

(5) 孤立弱边缘抑制

通常而言,由真实边缘引起的弱边缘像素点将连接到强边缘像素点,而噪声响应则未连接。通过查看弱边缘像素及其8个邻域像素,可根据其与强边缘的连接情况来进行判断。一般,可定义只要其中邻域像素其中一个为强边缘像素点,则该弱边缘就可以保留为强边缘,即真实边缘点。

3.程序流程图

图2. 程序流程图

4.实验结果

在MATLAB R2016a环境下对实现了基于Canny算子的边缘检测,并与MATLAB内置的Canny边缘检测API进行了四组对比实验。其中“Lena”和“房屋”为计算机视觉领域的常用测试图片,“机翼”为出差时用手机自行拍摄的照片,“小刘鸭”为微信表情包图片。

图3.实验结果-Lena

图4.实验结果-房屋
图5.实验结果-机翼
图6.实验结果-小刘鸭

为了达到较好的检测效果,需要反复调整自行编写的边缘检测程序中的滤波器参数和滞后阈值处理时的高阈值和低阈值。MATLAB的Canny边缘检测API则采用其默认参数,猜测其中高、低阈值可能由自适应算法自行计算。图3和图4的结果表明,相较API,自行编写的Canny检测程序提取到了更多的细节信息,但也保留了较多的局部噪点;API提取的轮廓特征更为清晰,但局部失真情况相对较重。图5结果表明,相较于API,自行编写的程序提取到了更为清晰的机翼轮廓,并保留了较少的云层的纹理。图6效果相差不大。从实验过程可知Canny 算子对于滤波参数和高、低阈值的选取还是较为敏感,使得实际应用过程中需要反复调试。囿于时间和能力,没有对参数的自适应选择展开进一步学习和尝试。

5.源代码

clc

6.References

[1] https://blog.csdn.net/mary_0830/article/details/89597672

[2] https://blog.csdn.net/jmu201521121021/article/details/80622011

[3] 维基百科

canny算子_Canny边缘检测算法相关推荐

  1. canny检测出的多个边缘合成一个_Canny边缘检测算法

    PS:计算机视觉课程的一项大作业,作为门外汉,在网上查找资料学习和复现时踩了一些坑,在完成作业后分享一下,希望后面的小白同学少走弯路. 1.问题描述 在计算机视觉/机器视觉领域,图像分割的应用十分普遍 ...

  2. C++ Canny算子进行边缘检测

    C++实现Canny算子 进行边缘检测 文章目录 C++实现Canny算子 进行边缘检测 前言 一.Canny算子原理 二.C++实现Canny算子 1.步骤 2.C++代码如下 三.Canny算子运 ...

  3. canny算子的边缘提取算法

    canny算子边缘提取分为四个步骤 1.去噪: 利用高斯滤波对图像卷积进行去噪处理: 2.求梯度: 采用梯度滤波模板对图像进行卷积,求取图像X方向和Y方向的梯度,以及对应的夹角: 3.非极大值抑制: ...

  4. sobel算子_边缘检测算法4.-教你动手实现kirsch和robinson算子

    还有很多 边缘检测算子,在OpenCV中没有实现代码. 所以,我们得掌握看懂算法,然后扩展 算法得能力. 比如,我已知的一些 边缘检测核心: Kirsch 8方向算子 Robinson 8方向算子 这 ...

  5. 图像处理——Canny算子 图像边缘检测:Canny算子、Prewitt算子和sobel算子

    https://blog.csdn.net/fengye2two/article/details/79190759 https://www.jianshu.com/p/bed4ffe996a1

  6. 利用Canny边缘检测算子进行边缘检测的原理及OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 Canny算子是John Canny在1986年 ...

  7. 如何用matlab求出覆冰图像像素点,输电线路覆冰图像的Canny算子改进算法研究

    输电线路覆冰图像的Canny算子改进算法研究 摘 要: 每到冬季 关键词: 形态学滤波; Canny算子; 边缘检测; 覆冰检测; 微分算子 中图分类号:TM755 文献标志码:A文章编号:1006- ...

  8. MATLAB中canny算子边缘检测

    今天来介绍一下关于canny算子做边缘检测的过程: Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边 ...

  9. 边缘检测Sobel、laplacian、canny算子

    1.图像边缘检测 图像边缘检测对于分析图像中的内容.实现图像中物体的分割.定位等具有重要的作用.边缘检测大大减少了源图像的数据量,剔除了与目标不相干的信息,保留了图像重要的结构属性.常用的图像边缘检测 ...

最新文章

  1. php 查oracle 表不存在报错处理,Oracle ORA-08104报错处理方法及注意事项
  2. 利用编码特长,我赚取了每月1000美元的额外收入
  3. Instruments模板介绍(更新中...)
  4. 叶子结点和分支节点_leetcode No.129 求根到叶子节点数字之和
  5. 解决nginx不支持pathinfo Thinkphp命名空间问题
  6. 模拟——魔法少女小Scarlet(洛谷 P4924)
  7. 操作系统 第五章 IO管理
  8. Ubuntu搜狗输入法乱码
  9. CGLib动态代理详解
  10. 发表skiller的几个版本
  11. c语言mud游戏制作,MUD游戏制作工具下载
  12. 网上查信用报告,什么是数字证书验证?
  13. roboone机器人_ROBOONE机器人总部地址在哪里?
  14. 解决网页无法选中文字,无法复制的问题
  15. 计算机编程课程顺序_您可以在2月开始免费在线编程和计算机科学课程
  16. 利用IconWorkshop把png转成ico图标
  17. vue 3.0 使用ref获取dom元素
  18. 银行排队系统 c语言,C++实现银行排队系统
  19. 《Python程序设计与算法基础教程(第二版)》江红 余青松 课后选择题 课后填空题答案
  20. php mysql ssl 连接_Mysql 中的SSL 连接

热门文章

  1. matlab将图片旋转的代码_【MATLAB】钟表
  2. java webservice ssl_[转贴]Java客户端调用Https Webservice
  3. vs2008下如何部署arcengine开发的程序
  4. JAVA几何图注水,如何使用java绘制几何形状到图片?
  5. java docur,JavaDoc生成API详解
  6. python 获取麦克风声音_如何使用python和ffmpeg或simi读取实时麦克风音频音量
  7. Java 算法 等差数列
  8. 用Java控制小电灯-树莓派PI4J
  9. Linux安装以太坊geth客户端
  10. Geatpy框架使用基于NSGA-II算法的多染色体多目标进化算法案例(moea_psy_NSGA2_templet)