美文网首页
OpenCV+Python边缘检测

OpenCV+Python边缘检测

作者: 音符纸飞机 | 来源:发表于2018-07-12 16:41 被阅读103次

Sobel算子

sobel算子计算的是图像的一阶梯度。灰度值变化越快的地方,梯度越大,如下图所示。


一阶导数
dst = cv2.Sobel(img, ddepth, dx, dy, k_size)
# ddepth: dst的图像深度,一般使用 cv2.CV_64F
# dx = 1, dy = 0 表示x方向上的梯度
# dx = 0, dy = 1 表示y方向上的梯度
# k_size 默认是3, 当k_size设为-1时,会使用3x3的scharr算子,这个算子的实现精度比Sobel更高

使用Sobel算子进行边缘检测的一般步骤:

  1. 计算x方向的一阶梯度Gx
  2. 计算y方向的一阶梯度Gy
  3. 计算G = |Gx|+|Gy|, 当G大于一个阈值时,判定为边缘点

其实可以直接传dx = 1, dy = 1。和上面步骤的结果不太一样,进过实验,分三步的效果更好,见本文最后实例部分。

拉普拉斯算子

拉普拉斯算子是图像的二阶导数,如下图所示,一阶导数的极值位置,二阶导数为0。所以我们也可以用这个特点来作为检测图像边缘的方法。 但是, 二阶导数的0值不仅仅出现在边缘(它们也可能出现在无意义的位置),但是可以过滤掉这些点。
\bigtriangledown ^{2}f(x,y)=\frac{\partial^2 f(x,y)}{\partial x^2}+\frac{\partial^2 f(x,y)}{\partial y^2}

二阶导数
对于二维离散信号:
Sobel和Laplacian效果图

Canny边缘检测

cv2.Canny(img, low_thresh, high_thresh)
算法
  1. 高斯滤波平滑图像
  2. 用Sobel算子计算出一阶偏导,以及各个像素点的梯度方向
    Edge\_Gradient(G)=\sqrt{G_{x}^{2}+G_{y}^{2}}
    Angle(\theta )=tan^{-1}(\frac{G_{y}}{G_{x}})
  3. 对梯度值进行非最大值抑制(non-maximum suppression),只保留那些比其梯度方向上前后两个像素的梯度都大的像素。直观的表现是瘦化了边缘
  4. 滞后阈值处理
    一般的边缘检测算法用一个阈值来滤除噪声或颜色变化引起的小的梯度值,而保留大的梯度值。Canny算法应用双阈值,即一个高阈值和一个低阈值来区分边缘像素。如果边缘像素点梯度值大于高阈值,则被认为是强边缘点。如果边缘梯度值小于高阈值,大于低阈值,则标记为弱边缘点。小于低阈值的点则被抑制掉。
    所有像素点标记完滞后,针对每个弱边缘点,检查其周围8个连通领域像素,只要有强边缘点存在,则保留该边缘点,否则抛弃。
实例
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('laugh.jpg', 0)

canny = cv2.Canny(img, 100, 200)
titles = ['Original','canny']
imgs = [img, canny]

for i in range(2):
    plt.subplot(1, 2, i + 1), plt.imshow(imgs[i], cmap='gray')
    plt.title(titles[i]), plt.xticks([]), plt.yticks([])

plt.show()
canny效果图

相关文章

  • OpenCV+Python边缘检测

    Sobel算子 sobel算子计算的是图像的一阶梯度。灰度值变化越快的地方,梯度越大,如下图所示。 使用Sobel...

  • opencv+python -- 图像边缘检测

    图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图...

  • opencv+python学习记录(二十)边缘检测

    边缘检测包含:Prewitt边缘检测、Sobel边缘检测、Scharr算子、Canny边缘检测、Laplacian...

  • Canny边缘检测---OpenCV-Python开发指南(22

    什么是Canny边缘检测 Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。该方法由John F. Ca...

  • Opencv第三课---边缘检测

    边缘检测 边缘检测是图像领域非常重要的一种处理手段,要理解边缘检测,首先要理解什么是边缘。边缘是图像局部强度具有非...

  • Task06 边缘检测

    6.1 简介 6.1.1 什么是边缘? 边缘是图像强度函数快速变化的地方 6.1.2 如何检测边缘? 为了检测边缘...

  • cv领域之边缘检测技术学习

    一、边缘检测简单介绍 边缘检测是图像分割中最常见的操作之一,一般提到边缘可能有三个概念: 边缘检测:定位边缘像素的...

  • 图像轮廓(1)

    边缘检测虽然能够检测出边缘,但是边缘不是连续的,检测到的边缘不是一个整体。图像轮廓是指将边缘连接起来形成一个整体 ...

  • 数字图像 - 边缘检测原理 - Sobel, Laplace,

    先来看张图,左边是原图,右边是边缘检测后的图,边缘检测就是检测出图像上的边缘信息,右图用白色的程度表示边缘的深浅。...

  • 【Unity Shader入门精要学习】高级(二)

    屏幕后处理效果 边缘检测 边缘检测的原理是利用一些边缘检测算子对图像进行卷积(convolution)操作 一、卷...

网友评论

      本文标题:OpenCV+Python边缘检测

      本文链接:https://www.haomeiwen.com/subject/wyphpftx.html