边缘检测原理

边缘检测(Edge Detection)是图像处理和计算机视觉中的基本问题,其目的在于标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式如下图所示:

图像边缘检测大幅度地减少了数据量,并且剔除了可看作不相关的信息,保留了图像重要的结构属性。边缘检测的方法可大致划分为两类:
1)基于搜索:通过寻找图像一阶导数中的最大值和最小值来检测边界,通常是将边界定位在梯度最大的方向,代表算法是Sobel算子和Scharr算子。
2)基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点,代表算法是Laplacian算子。

Canny边缘检测算法

Canny边缘检测算法是一种非常流行的边缘检测算法,是JohnF.Canny于1986年提出的,被认为是最优的边缘检测算法。它可分为4个步骤:去除噪声、计算图像梯度、非极大值抑制和滞后阈值。

去除噪声

边缘检测极易受到噪声影响,因此需要使用高斯滤波器去除噪声。

计算图像梯度幅值与方向

在数学中,梯度的本意是一个向量,表示函数在某点的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。
图像中用梯度表示灰度值的变化程度与方向,而边缘就是指灰度强度变化最强的位置。梯度方向与边缘方向呈垂直关系。
此处采用Sobel滤波器计算梯度的大小和方向。Sobel算子GX是水平方向的一阶导数,用于检测Y轴方向的边缘,而GY则是竖直方向的一阶导数,用于检测X轴方向的边缘。

非极大值抑制

非极大值抑制(Non-MaximumSuppression,NMS),即保留局部最大值,
抑制非局部最大值的所有值。简单而言,就是对图像的所有像素点进行检测,如果某点的梯度强度大于其梯度方向的正负方向的像素点,则该点保留;否则,该点被抑制。
Canny边缘检测算法是沿着梯度方向对幅值进行非极大值抑制的,而非边缘方向。

滞后阈值

为了确定真正的边界,需要设定两个阈值“minVal”和“maxVal”。当图像某点的灰度梯度大于阈值“maxVal”,该点被视为真的边界点;当某点的灰度梯度小于阈值“minVal”,则该点不看作边界点;当某点的灰度梯度介于两个阈值之间,根据该点是否与真的边界点相连来进行判断,相连则将该点也看作边界点,否则将其抛弃。

代码

import cv2
import numpy as np
import matplotlib.pyplot as plt#图像读取
img = cv2.imread("test.jpg")#Canny边缘检测
lowThreshold = 1 #最小阈值
max_lowThershold = 80 #最大阈值
canny = cv2.Canny(img, lowThreshold, max_lowThreshold)#图像展示
plt.figure(figsize = (8, 5), dpi = 100)
plt.rcParams['axes.unicode_minus'] = False
plt.subplot(121), plt.imshow(img, camp=plt.cm.grap). plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(canny, cmap = plt.cm.gray), plt.title("Edge Detection")
plt.xticks([]), plt.yticks([])
plt.show()

图像展示代码有不懂的地方,可以参考这篇文章:
图像处理–平滑

图像处理--边缘检测相关推荐

  1. 数字图像处理:边缘检测(Edge detection)

    转载自:https://zhuanlan.zhihu.com/p/59640437 觉得写得通俗易懂,要是每个人的博客都这么人性化.... 写在前面: 本文篇幅较长,用了大量图与公式帮助大家深入理解各 ...

  2. OpenCV图像处理——边缘检测

    总目录 图像处理总目录←点击这里 八.边缘检测 Canny边缘检测 使用高斯滤波器,以平滑图像,滤除噪声. 计算图像中每个像素点的梯度强度和方向. 应用非极大值(Non-Maximum Suppres ...

  3. java 图像梯度检测_数字图像处理-边缘检测

    梯度介绍 首先介绍边缘检测中用到的高等数学原理---梯度.介绍梯度,离不开方向导数. 方向导数 顾名思义,方向导数就是某个方向上的导数. 什么是方向: 函数 在这个方向上的图像: 我们知道: 函数 的 ...

  4. php 图像边缘检测,科学网—图像处理边缘检测 - 李敏的博文

    一:梯度,边缘和角点 物体的边缘以局部特征不连续性出现,也就是图像局部亮度变化最显著的部分,如,灰度,颜色,纹理结构的突变.物体边缘是区分不同区域的分界处.图像边缘特性:方向和幅度.沿边缘走向的像素灰 ...

  5. 图像处理——边缘检测

    边缘检测 一.边缘检测的目的 二.边缘检测算子有哪些? 三.Canny算子 3.1.简述Canny算子 3.2.简述下Canny的计算过程 四.sobel算子 4.1 简述一下sobel算子 五.深度 ...

  6. 图像处理+边缘检测算法

    一.边缘检测算子类别 常见边缘检测算子:Roberts .Sobel .Prewitt.Laplacian.Log/Marr.Canny.Kirsch.Nevitia 二.一阶微分算子:Roberts ...

  7. 数字图像处理---边缘检测算法复现(ED、EDPF、CannySR、CannySRPF)

    目录 前言 (一)无法查找或打开 PDB 文件. (二)自带的测试图像完美运行,自己的图片运行报错 前言 本篇主要记录一下在进行四种边缘检测算法(ED.EDPF.CannySR.CannySRPF)复 ...

  8. 【Matlab 图像】边缘检测算法及效果演示

    [Matlab 图像]边缘检测算法及效果演示 边缘检测 检测图像中的边缘 Matlab 代码 代码效果如下 边缘算法:robert 边缘算法:sobel prewitt 边缘算法:laplacian ...

  9. Matlab 图像处理的一些杂记

    图像直方图均衡- - Tag: matlab    图像处理    直方图均衡 %  数字图像处理程序作业 %  本程序能将JPG格式的彩色图像文件灰度化并进行直方图均衡 %  %  输入文件:Pic ...

最新文章

  1. Mybatis学习记录-使用问题总结之一DISTINCT
  2. 图片像素、英寸、厘米之间的单位换算
  3. SpringCloud-创建服务消费者-Ribbon方式(附代码下载)
  4. BZOJ-1406-密码箱-AHOI2007-数学
  5. 农历鸡年(丁酉)正月初一第一博
  6. Servlet的快速入门以及执行原理
  7. 3. HTML中的容器标签
  8. Linux ARM交叉编译工具链制作过程
  9. 一次MySQL死锁问题解决
  10. 万达影视发布声明:不存在所谓的从《流浪地球》撤资
  11. python批量读取图片并批量保存_Python实现批量读取图片并存入mongodb数据库的方法示例...
  12. javaSE学习 访问控制
  13. Mvc 4.0实现Response.Write()效果
  14. 使用Zookeeper实现负载均衡原理
  15. 闲来无事实现个备忘录,到点提醒
  16. java程序如何提取数据库json格式_java解析json格式文件,再保存在数据库怎么做?...
  17. 转:visio 2013 激活软件 -- 记录
  18. Excel如何批量设置英语句首大写
  19. [BZOJ3993]-[SDOI2015]星际战争-二分答案+最大流
  20. Excel模板导出并插入图片

热门文章

  1. Unity3D学习—牧师与魔鬼—MVC模式和ECS架构应用
  2. 2016计算机学科夏令营上机考试C:反反复复(字符串处理)
  3. 什么是物联网网关及其主要特点
  4. linux 下 的tail 命令
  5. 微信支付一 :公众号支付1
  6. 密码(mima)的答案
  7. javaee jsp实现留言板(eclipse+mysql),五个界面,留言、登陆、注册等
  8. 我对阿凡达与现实社会的理解
  9. 洛谷P1001题解--zhengjun
  10. [转载]流利说Level5