文章目录

  • Sobel算子
  • Canny边缘检测
    • 1.高斯滤波
    • 2.计算梯度强度和方向
    • 3.非极大值抑制
    • 4.用双阈值算法检测和连接边缘
  • 函数实现
    • Sobel算子
    • Canny算法

Sobel算子

我们可以使用3×3 的卷积核来进行图像求导:

其中I表示原图片,Gx和Gy分别表示沿图片水平和竖直方向上的变化,∗表示卷积操作

下面以Sobel算子为例讲述如何计算梯度

x方向的Sobel算子为:

若图像G 中一个3×3的窗口为A,要计算梯度的像素点为e,则和Sobel算子进行卷积之后,像素点e在x方向的梯度值为:

其中 ∗为卷积符号,sum表示矩阵中所有元素相加求和。

Canny边缘检测

Canny边缘检测于1986年由JOHN CANNY首次在论文《A Computational Approach to Edge Detection》中提出,就此拉开了Canny边缘检测算法的序幕。

Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,目前已广泛应用于各种计算机视觉系统。Canny发现,在不同视觉系统上对边缘检测的要求较为类似,因此,Canny边缘检测可以实现一种具有广泛应用意义的边缘检测技术。边缘检测的一般标准包括:

  1. 以低的错误率检测边缘,也即意味着需要尽可能准确的捕获图像中尽可能多的边缘。
  2. 检测到的边缘应精确定位在真实边缘的中心。
  3. 图像中给定的边缘应只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。

为了满足这些要求,Canny使用了变分法。Canny检测器中的最优函数使用四个指数项的和来描述,它可以由高斯函数的一阶导数来近似。

在目前常用的边缘检测方法中,Canny边缘检测算法是具有严格定义的,可以提供良好可靠检测的方法之一。由于它具有满足边缘检测的三个标准和实现过程简单的优势,成为边缘检测最流行的算法之一。

完成一个Canny边缘检测算法可以分为以下四步:

1.高斯滤波

边缘检测结果容易受到图像噪声的影响,图片中一些噪声会大大影像边缘检测。因此为了使图像平滑,可以用高斯滤波器内核与图像进行卷积。 此步骤将使图像稍微平滑,以减少边缘检测器上明显噪声的影响。

大小为(2k+1)×(2k+1)的高斯滤波器核的方程式为:

其中Hij 就是一个权重

下面一个5×5高斯卷积核例子,用于创建相邻图像,σ=1.4(表示卷积运算。)

注意,选择高斯核的大小会影响检测器的性能。 尺寸越大,检测器对噪声的灵敏度越低。 此外,随着高斯滤波器核大小的增加,用于检测边缘的定位误差将略有增加。一般5x5是一个比较不错的trade off(协定)。

2.计算梯度强度和方向

进行高斯滤波后,图像中的边缘可以指向各个方向,接下来使用四个算子来检测图像中的水平、垂直和对角边缘。边缘检测的算子(如Roberts,Prewitt,Sobel等)返回水平和垂直 方向的一阶导数值,由此便可以确定像素点的梯度G和方向θ 。

其中G为梯度强度, θ表示梯度方向,arctan为反正切函数。通过上式我们可以得到一个梯度矩阵G和方向矩阵 θ。

3.非极大值抑制

在每一点上,邻域中心与沿着其对应的梯度方向的两个像素相比,若中心像素为最大值,则保留,否则中心置0,这样可以抑制非极大值,保留局部梯度最大的点,以得到细化的边缘。

对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊。对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0。非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。直观上地看,对第二步得到的图片,边缘由粗变细了。

4.用双阈值算法检测和连接边缘


双阈值法非常简单,我们假设两类边缘:经过非极大值抑制之后的边缘点中,梯度值超过TH的称为强边缘,梯度值小于TH大于TL的称为弱边缘,梯度小于TL的不是边缘。

可以肯定的是,强边缘必然是边缘点,因此必须将T1设置的足够高,以要求像素点的梯度值足够大(变化足够剧烈),而弱边缘可能是边缘,也可能是噪声,如何判断呢?当弱边缘的周围8邻域有强边缘点存在时,就将该弱边缘点变成强边缘点,以此来实现对强边缘的补充。实际中人们发现T1:T2=2:1的比例效果比较好,其中T1可以人为指定,也可以设计算法来自适应的指定,比如定义梯度直方图的前30%的分界线为T1。检查8邻域的方法叫边缘滞后跟踪,连接边缘的办法还有区域生长法等等。

函数实现

Sobel算子

# -*- coding: utf-8 -*-
"""
cv2.Sobel(src, #参数是需要处理的图像;ddepth, #图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度dx, #dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2。dy[, dst[, #输出图片ksize[,#Sobel算子的大小,必须为1、3、5、7。scale[, #缩放导数的比例常数,默认情况下没有伸缩系数;delta[, #可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;borderType #判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。]]]]])
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt#读图
img = cv2.imread('IMG/test.jpg',0)sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)#画图
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])plt.subplot(1,3,2),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])plt.subplot(1,3,3),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])plt.show()

Canny算法

# -*- coding: utf-8 -*-"""
cv2.Canny(image,            # 输入原图(必须为单通道图)threshold1,threshold2,       # 较大的阈值2用于检测图像中明显的边缘[, edges[,apertureSize[,    # apertureSize:Sobel算子的大小L2gradient ]]])   # 参数(布尔值):true: 使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),false:使用L1范数(直接将两个方向导数的绝对值相加)。
"""import cv2
import numpy as np
import matplotlib.pyplot as pltoriginal_img = cv2.imread("IMG/test.jpg", 0)# canny边缘检测
img1 = cv2.GaussianBlur(original_img,(3,3),0)
canny = cv2.Canny(img1, 50, 150)# 画图
plt.subplot(1,2,1),plt.imshow(original_img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])plt.subplot(1,2,2),plt.imshow(canny,cmap = 'gray')
plt.title('Canny'), plt.xticks([]), plt.yticks([])
plt.show()

计算机视觉基础-图像处理 Task06 边缘检测相关推荐

  1. 计算机视觉基础-图像处理(边缘检测)cpp+python

    6.1 简介 6.1.1 什么是边缘? 边缘是图像强度函数快速变化的地方 6.1.2 如何检测边缘? 为了检测边缘,我们需要检测图像中的不连续性,可以使用导数来检测不连续性. 如上图所示,上图的第一幅 ...

  2. 计算机视觉基础-图像处理(图像滤波)cpp+python

    4.1 简介 图像的实质是一种二维信号,滤波是信号处理中的一个重要概念.在图像处理中,滤波是一种非常常见的技术,它们的原理非常简单,但是其思想却十分值得借鉴,滤波是很多图像算法的前置步骤或基础,掌握图 ...

  3. 计算机视觉基础---图像处理(几何变换)cpp+python

    2.1 简介 该部分将对基本的几何变换进行学习,几何变换的原理大多都是相似,只是变换矩阵不同,因此,我们以最常用的平移和旋转为例进行学习.在深度学习领域,我们常用平移.旋转.镜像等操作进行数据增广:在 ...

  4. 计算机视觉基础-图像处理-几何变换

    本文来源于Datawhale组队学习的教材手册,供大家参考阅读. https://github.com/datawhalechina/team-learning/blob/master/%E8%AE% ...

  5. 计算机视觉基础-图像处理(图像分割/二值化)cpp+python

    5.1 简介 该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技术.它特别适用 ...

  6. 计算机视觉基础——图像处理(彩色空间互转)cpp+python

    3.1 简介 图像彩色空间互转在图像处理中应用非常广泛,而且很多算法只对灰度图有效:另外,相比RGB,其他颜色空间(比如HSV.HSI)更具可分离性和可操作性,所以很多图像算法需要将图像从RGB转为其 ...

  7. 计算机视觉基础-图像处理 Task05 图像分割/二值化

    文章目录 OSTU二值化 自适应阈值 函数实现 OSTU二值化 自适应阈值 图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技 ...

  8. Datawhale 计算机视觉基础-图像处理(上)-Task01 OpenCV框架与图像插值算法

    简介 在图像处理中,平移变换.旋转变换以及放缩变换是一些基础且常用的操作.这些几何变换并不改变图象的象素值,只是在图象平面上进行象素的重新排列.在一幅输入图象 [ u , v ] [u,v] [u,v ...

  9. lbp特征提取算法 知乎_计算机视觉基础-图像处理: LBP特征描述算子

    1 简介 LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点.LBP常应用于人脸识别和目标检测中,在OpenCV中 ...

最新文章

  1. 愉快的舞会c++_如何在5分钟内建立一个令人愉快的加载屏幕
  2. 从sql中image类型字段中导出图片
  3. 云安全趋势:IaaS?谢了,我要 PaaS
  4. python简单代码表白-如何正确使用Python进行表白
  5. XTUOJ 1206 Dormitory's Elevator
  6. 剖析基于IOS的华为交换机配置口令设置
  7. sklearn中cross_validation包无法使用
  8. 一般处理程序(ashx)和页面处理程序(aspx)的区别
  9. java代码查询索引文件实例_关于使用pdfbox的对PDF文件通过lucene生成索引文件IndexPDFFiles类代码示例...
  10. 循环链表(线性表的链式存储)---C语言版
  11. Java011-多线程
  12. PDG转图像、PDF的若干方法
  13. 用MATLAB绘制三维网格图和三维曲面图
  14. 慎用!3个容易被打的Python恶搞脚本!
  15. Internet Explorer无法打开internet站点文件.....操作终止
  16. Modulo Summation——UPC
  17. Daily Reading Time-十月
  18. 如何让一个div跟随鼠标移动
  19. Vijos - 佳佳的魔法药水(最短路)
  20. 广播风暴对比实验部署

热门文章

  1. 程序员斗图时最爱用哪些表情包?拿走不谢!
  2. Servlet规范总结
  3. RxJava菜鸟驿站(一)
  4. laravel的auth用户认证的例子
  5. ubuntu 下 github 使用方法 以及异常修改
  6. nginx配置注意事项1
  7. Windows Server 2012中的DirectAccess部署
  8. OpenCV-黑帽运算(BLACKHAT)
  9. hashset如何检查重复_如何使用 C# 中的 HashSet
  10. c语言计算结果为1. inf0000,C语言复习题及答案老师给的