【OpenCV--边缘检测】

目录

一、边缘检测概念

二、Sobel算子

1.描述:

2.方法:

3.Sobel算子的应用:

 三、Laplacian算子

1.描述:

2.应用:

四、Canny边缘检测

1.原理:

2.应用

一、边缘检测概念

1.边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,往往以轮廓的形式表现出来

2.分类:边缘检测大幅度减少了数据量,删除了不相干的信息,保留图像重要的结构属性,它大幅可以分为两类

1>基于搜索:通过寻找图像一阶导数中最大值来检测边界利用计算结果估计边缘局部方向,通常采用梯度方向,利用此方向找到局部梯度模最大值,代表算法是Sobel算子和Scharr算子

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

二、Sobel算子

1.描述:

Sobel边缘检测算法相对简单,实际应用时效率比canny要高,但是没有其精确,Sobel算子是高斯平滑和微分操作的结合体,其抗噪声能力强,当对效率要求较高,而对细纹理不太关心时,普遍应用Sobel算子

2.方法:

将图像I与基数大小的模板进行卷积,当模板大小为3时,垂直变化以及水平变化:

 基于以上两个结果,求出每一点:

 注意:当内核大小为3时,Sobel算子会产生比较明显误差,需要使用Scharr算法(只有大小为3核)

 

 3.Sobel算子的应用:

Sobel_x_y=cv.Sobel(src,ddepth,dx,dy,dst,ksize,scale,delta,borderType)

参数:

dx,dy指求导的阶数,取值为0(表示没有求导),1

ksize:卷积核大小,为奇数,默认是3,当为-1时,演变成3*3Scharr算子

scale:缩放导数比例常数,默认没有

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('cat.png',0)
#显示原图
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
#计算Sobel卷积结果
x=cv.Sobel(img,cv.CV_16S,1,0)#cv.CV_16S表示图像转换成16位有符号数据类型
y=cv.Sobel(img,cv.CV_16S,0,1)
#将数据进行转换会uint8形式
Sobel_x=cv.convertScaleAbs(x)
Sobel_y=cv.convertScaleAbs(y)
#利用函数将结果进行合成
result=cv.addWeighted(Sobel_x,0.5,Sobel_y,0.5,0)
#t图像显示
#plt.imshow(result,cmap=plt.cm.gray)
#plt.show()
#利用Scharr算子
x1=cv.Sobel(img,cv.CV_16S,1,0,ksize=-1)
y1=cv.Sobel(img,cv.CV_16S,0,1,ksize=-1)
Sobel_x1=cv.convertScaleAbs(x1)
Sobel_y1=cv.convertScaleAbs(y1)
result1=cv.addWeighted(Sobel_x1,0.5,Sobel_y1,0.5,0)
plt.imshow(result1,cmap=plt.cm.gray)
plt.show()

 三、Laplacian算子

 1.描述:

Laplacian算子是利用二阶导来检测边缘,不连续函数二阶导数计算:

 则卷积核大小为:

 

2.应用:

laplacian=cv.Laplacian(src,ddepth,dst,ksize,scale,delta,borderType)

ddepth:图像的深度,-1表示和原图像深度相同,目标图像的深度大于等于原图像

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('cat.png',0)
#显示原图
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
#计算Laplacian卷积结果
laplacian=cv.Laplacian(img,cv.CV_16S)
#数据进行转换成uint8形式
result=cv.convertScaleAbs(laplacian)
plt.imshow(result,cmap=plt.cm.gray)
plt.show()

四、Canny边缘检测

1.原理:

1>噪声去除:由于边缘检测很容易受到噪声的影响,所以首先使用5 * 5高斯滤波器去除噪声

2>计算图像梯度:对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数(Gx 和Gy)。根据得到的这两幅梯度,找到边界梯度和方向

3>非极大值抑制:在获得梯度的方向和大小之后,对整幅图像进行扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的

4>滞后阈值:确定真正的边界,设置两个阈值: minVal 和maxVal。当图像的灰度梯度高于maxVal时被认为是真的边界,低于minVal的边界会被抛弃

2.应用:

canny=cv.Canny(src,threshold1,threshold2)

threshold1:较小的阈值minval,threshold2:较大的阈值maxval

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('cat.png',0)
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
canny=cv.Canny(img,0,100)
plt.imshow(canny,cmap=plt.cm.gray)
plt.show()

  • 8
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
OpenCV-Python是一个用于计算机视觉和图像处理的开源库。边缘检测OpenCV-Python中一个重要的图像处理操作。根据引用的内容,边缘检测的方法包括Laplacian边缘检测、Sobel边缘检测和Canny边缘检测。其中,Laplacian边缘检测是一种基于二阶导数的方法,Sobel边缘检测是一种基于一阶导数的方法,而Canny边缘检测是一种综合了多种方法的优化算法。您可以根据引用中的文章目录了解更多关于这些方法的详细信息。 引用给出了一个使用OpenCV-Python进行自动确定阈值的边缘检测的示例代码。该代码首先读取一张名为'bee.jpg'的图像,并将其转换为灰度图像。然后,通过应用高斯模糊对图像进行预处理,使用自动确定阈值的方法计算合适的阈值,最后使用Canny边缘检测算法检测图像的边缘。您可以根据需要调整代码中的参数来适应不同的图像。 总而言之,OpenCV-Python提供了多种边缘检测方法,包括Laplacian边缘检测、Sobel边缘检测和Canny边缘检测。您可以根据具体需求选择适合的方法,并使用OpenCV-Python提供的函数进行图像处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【OpenCV-Python】14.OpenCV边缘检测](https://blog.csdn.net/weixin_43843069/article/details/121950301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

In my opinion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值