【OpenCV

阅读: 评论:0

【OpenCV

【OpenCV

文章目录

  • 1 边缘检测原理
  • 2 Sobel算子和Scharr算子
    • 2.1 Sobel算子
    • 2.2 Scharr算子
  • 3 Laplacian算子
  • 4 canny算子

  学习目标:
  了解Sobel算子,Scharr算子和拉普拉斯算子
  掌握canny边缘检测的原理及应用
   边缘检测之后获取得到二值图像


1 边缘检测原理

  定义: 标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反应了属性的重要事件和变化,边缘的表现形式如下图所示:

  作用: 图像边缘检测大幅度减少数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。
  边缘检测的分类:
  (1)基于搜索:通过寻找图像一阶导数中的最大值来检测边界。然后利用计算结果估计边缘的局部方向,通常采用梯度方向,并利用此方向找到局部梯度最大值,代表算法是Sobel算子和Scharr算子

  (2)基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,代表算法为Laplacian算子。

2 Sobel算子和Scharr算子

  共同点: 都是利用一阶导数进行边缘检测的方法(一阶导数的最大值),速度快。
  原理:
  对于不连续的函数(图像),某点的一阶导数可以写做:f(x)=f(x)-f(x-1) 或 f(x)=f(x+1)-f(x)
  一阶导数:

2.1 Sobel算子

  Sobel算子原理:
  (1)假设要处理的图像为I,要在水平方向和垂直方向分别求一阶导数

  (2)在图像的每一个点,结合以上两个结果求出:

  (3)统计G中极大值所在的位置,就是图像的边缘
  Sobel边缘检测流程:
  (1)API: Sobel_x_or_y=cv2.Sobel(src,ddepth,dx,dy,dst,ksize,scale,delta,borderType)
  参数:
    src:传入图像
    ddepth:图像深度
    dx和dy:代表是否在这个方向上求导,0代表不求导,1代表求导
    ksize:是Sobel算子的大小,既卷积核的大小,必须为奇数。如果ksize=-1,就演变成为3×3的Scharr算子。
    scale:缩放导数的比例常数,默认情况为没有伸缩系数
    BorderType:图像边界的模式。默认值为cv2.BORDER_DEFAULT
  (2) Sobel函数在某方向上求导,求导后可能会有负值,还可能会有大于255的值。而原图像是uint8,既8位无符号数,所以Sobel建立的图像位数不够,会有阶段。因此要使用16位有符号的数据类型,既cv2.CV_16S,处理完图像后,再利用vertScaleAbs()函数将其转换为uint8格式,否者图像无法显示。
  (3) Sobel算子是在两个方向上计算的,最后还需要用cv2.addWeighted()函数将其组合起来。

import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像,灰度形式
img=cv2.imread('suanzi.png',1)#灰度值的方式读取图像#2.计算x方向和y方向的梯度
x=cv2.Sobel(img,cv2.CV_16S,1,0)
y=cv2.Sobel(img,cv2.CV_16S,0,1)#3.格式转换
abax&#vertScaleAbs(x)
abay&#vertScaleAbs(y)#4.xy方向加权
res=cv2.addWeighted(abax,0.5,abay,0.5,0)cv2.imshow('origin',img)
cv2.imshow('sobel',res)
cv2.waitKey(0)


  Sobel算子缺点:
  当内核大小为3时,Sobel算子内核可能产生比较明显的误差。为解决这一个问题,使用Scharr函数

2.2 Scharr算子

  特点:
  Scharr函数仅作用于大小为3的内核,该函数的运算与Sobel函数一样快,但是结果却更加准确
  Scharr算子原理:
  (1)假设要处理的图像为I,要在水平方向和垂直方向分别求一阶导数

  (2)在图像的每一个点,结合以上两个结果求出:

  (3)统计G中极大值所在的位置,就是图像的边缘。

import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像,灰度形式
img=cv2.imread('suanzi.png',1)#灰度值的方式读取图像#2.计算x方向和y方向的梯度(scharr算子)
x=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=-1)
y=cv2.Sobel(img,cv2.CV_16S,0,1,ksize=-1)#3.格式转换格式
abax&#vertScaleAbs(x)#转换为uint
abay&#vertScaleAbs(y)#4.xy方向加权
res=cv2.addWeighted(abax,0.5,abay,0.5,0)cv2.imshow('origin',img)
cv2.imshow('scharr',res)
cv2.waitKey(0)

3 Laplacian算子

  原理:
  利用二阶导数来检测边缘,因为图像是2维,我们需要在两个方向上进行求导:

  不连续函数(图像)的二阶导数:f’’(x)=f(x+1)-f(x)=f(x+1)-f(x)-f(x)+f(x-1)=f(x+1)=f(x-1)-2f(x)
  使用的卷积核为:

  API: cv2.Laplacian(src,ddepth,ksize)
  参数:
    src:需要处理的图像
    Ddepth:图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于源图像的深度
    ksize:算子的大小,即卷积核的大小,必须为奇数。

import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像,灰度形式
img=cv2.imread('suanzi.png',1)#灰度值的方式读取图像#2.laplacian边缘检测(算子)
res=cv2.Laplacian(img,cv2.CV_16S)#3.格式转换格式
res&#vertScaleAbs(res)#转换为uint8cv2.imshow('origin',img)
cv2.imshow('laplacian',res)
cv2.waitKey(0)

4 canny算子

  被认为是最优的边缘检测算法
  边缘检测流程:
  (1)噪声去除——高斯滤波
  由于边缘检测很容易受到噪声的影响,所以首先使用5×5的高斯滤波去除噪声。
  (2)计算图像梯度
  2.1 平滑后的图像使用Sobel算子计算水平和垂直方向的一阶导数(Gx和Gy)
  2.2 根据梯度图计算边界的梯度值和梯度方向,公式如下:

  如果某个像素点是边缘,则其梯度方向总是垂直于边缘。梯度方向被归为4类:垂直、水平和两个对角线方向。
  (3)非极大值抑制
  在获得梯度的方向和大小后,对整幅图像进行扫描,去除那些非边界的点。对每一个像素进行检查,看该点梯度值是不是周围具有相同梯度方向的点中是最大的,如果是最大的则保留该点,否则该点被抑制。扫描完整个图像后,结果为具有‘细边’的二进制图像。

  (4)滞后阈值
  确定真正的边界,设定两个阈值:minVal和maxVal。当图像的灰度梯度高于maxVal时被认为是真正的边界,低于minVal的边界被抛弃;如果灰度梯度值介于两者之间,就要看这个点是否与某个被确定为真正的边界点的点相连,如果是就认为该点是边界点,保留该点,否者抛弃该点。

  边缘检测:
  (1)API
  canny=cv2.Canny(image,threshold1,threshold2)
  (2)参数:
    image:灰度图
    threshold1:minVal,较小的阈值,将间断的边缘连接起来
    threshold2:maxVal较大的阈值检测图像中明显的边缘。

import cv2
import matplotlib.pyplot as plt
import numpy as np
#1. 读取图像,灰度形式
img=cv2.imread('suanzi.png',1)#灰度值的方式读取图像#2.canny边缘检测
canny=cv2.Canny(img,0,100)cv2.imshow('origin',img)
cv2.imshow('laplacian',canny)
cv2.waitKey(0)

本文发布于:2024-01-31 09:36:29,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170666499227573.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:OpenCV
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23