当前位置:   article > 正文

OpenCV实现图像边缘检测(sobel算子、laplacian算子、Canny边缘检测)_对图像进行基于laplacian算子的边缘检测。

对图像进行基于laplacian算子的边缘检测。
Sobel算子:
Sobel算子是一种基于梯度的边缘检测方法。它使用两个3x3的卷积核,一个用于检测水平边缘,另一个用于检测垂直边缘。这两个卷积核分别计算图像中每个像素的水平和垂直梯度。然后,通过组合这两个梯度,可以获得每个像素的梯度幅值和方向。梯度值大的像素通常表示边缘。

Laplacian算子:
Laplacian算子是一种二阶导数算子,用于检测图像中的边缘。它对图像进行二次卷积,以查找像素值的变化率。Laplacian算子通常会增强边缘的轮廓,但它不提供边缘的方向信息。因此,它常常需要与其他方法一起使用,如Sobel算子,以获得更精确的边缘信息。

Canny边缘检测:
Canny边缘检测是一种多步边缘检测算法,它具有良好的边缘定位和噪声抑制能力。它的步骤包括:
a. 高斯滤波:首先,对图像进行高斯平滑以减少噪声。
b. 梯度计算:使用Sobel算子计算图像的梯度幅值和方向。
c. 非极大值抑制:在梯度方向上,只保留局部梯度最大的像素,以细化边缘。
d. 滞后阈值:应用双阈值,将像素分类为强边缘、弱边缘和非边缘。
e. 边缘跟踪:通过连接强边缘像素,形成连续的边缘。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Canny边缘检测具有良好的噪声抑制和边缘连接能力,通常被广泛用于实际图像处理应用中。

总的来说,这三种方法都是基于图像中像素值的变化来检测边缘的。Sobel和Laplacian算子是基于梯度信息的方法,而Canny边缘检测是一个更复杂的多步骤算法,提供了更准确的边缘检测结果。选择哪种方法取决于具体应用需求,以及对噪声和精度的要求。
图像边缘检测是计算机视觉中的重要任务,用于识别图像中物体的边界和轮廓,通常是在图像处理和分析中的第一步。在本文中,我们将介绍三种常用的图像边缘检测方法,包括Sobel算子、Laplacian算子和Canny边缘检测。这些算法基于不同的原理和技术,用于检测图像中的边缘特征。
Sobel算子

Sobel算子是一种基于梯度的边缘检测方法,用于寻找图像中的边缘。该算子使用卷积操作来计算图像中每个像素点的梯度,以检测灰度变化最为显著的区域。Sobel算子通常分为两个方向:水平方向和垂直方向。分别用SobelX和SobelY表示。

Sobel算子的原理如下:

对图像进行灰度化处理,将彩色图像转换为灰度图像。
使用SobelX和SobelY卷积核对灰度图像进行卷积操作,分别计算水平和垂直方向的梯度。
计算每个像素点的梯度幅值和梯度方向。
通过设置阈值,将梯度幅值高于阈值的像素点标记为边缘点。
  • 1
  • 2
  • 3
  • 4

Sobel算子的优点是简单且计算速度较快,但它对噪声敏感,可能会产生一些假阳性边缘。
Laplacian算子

Laplacian算子是一种基于二阶导数的边缘检测方法,它可以捕捉图像中的灰度变化的二阶导数峰值,从而定位边缘。Laplacian算子的原理如下:

对图像进行灰度化处理。
使用Laplacian卷积核对灰度图像进行卷积操作,计算图像中每个像素点的二阶导数值。
通过设置阈值,将二阶导数值高于阈值的像素点标记为边缘点。
  • 1
  • 2
  • 3

Laplacian算子在检测边缘时对噪声具有一定的抑制作用,但它也可能导致边缘断裂和边缘细节丢失。
Canny边缘检测

Canny边缘检测是一种多阶段的边缘检测算法,它结合了Sobel算子和高斯滤波,以及非极大值抑制和边缘跟踪等步骤。Canny边缘检测的原理如下:

对图像进行灰度化处理,以及应用高斯滤波来降低噪声。
使用Sobel算子计算图像的梯度幅值和梯度方向。
针对梯度方向,执行非极大值抑制,以保留梯度幅值最大的边缘响应。
应用双阈值处理,将边缘点分为强边缘和弱边缘。
执行边缘跟踪,通过连接强边缘的像素点,形成完整的边缘。
  • 1
  • 2
  • 3
  • 4
  • 5

Canny边缘检测具有较好的边缘定位和噪声抑制性能,通常被认为是最有效的边缘检测方法之一。

总结:

图像边缘检测是计算机视觉中的关键任务,可以帮助识别物体的轮廓和边界。Sobel算子、Laplacian算子和Canny边缘检测是常用的图像边缘检测方法,它们基于不同的原理和技术来检测图像中的边缘。每种方法都有其优点和局限性,选择合适的方法取决于应用需求和图像特性。因此,在实际应用中,可以根据具体情况选择合适的边缘检测算法来实现最佳的边缘检测效果。

边缘检测原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1,Sobel算子

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1代码实现

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png",0)

#计算sobel卷积结果
x = cv.Sobel(img,cv.CV_16S,1,0)
y = cv.Sobel(img,cv.CV_16S,0,1)

#将数据进行转换
Scale_absX = cv.convertScaleAbs(x)   #convert 转换  scale  缩放
Scale_absY = cv.convertScaleAbs(y)

#结果合成
result = cv.addWeighted(Scale_absX,0.5,Scale_absY,0.5,0)


#图像显示
plt.figure(figsize=(5,4),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title("原图")
plt.xticks([]),plt.yticks([])

plt.subplot(122),plt.imshow(result,cmap = plt.cm.gray),plt.title("sobel滤波后结果")
plt.xticks([]),plt.yticks([])

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

1.2结果展示

在这里插入图片描述

2 Laplacian算子(拉普拉斯)

在这里插入图片描述
在这里插入图片描述

2.1代码实现

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png",0)

#laplacian转换
result = cv.Laplacian(img ,cv.CV_16S)
'''cv.Laplacian 函数用于对图像进行 Laplacian 边缘检测。img 是输入的灰度图像,cv.CV_16S 是输出结果的数据类型,
表示存储边缘检测结果的图像矩阵的元素类型为 16 位带符号整数。'''
Scale_abs = cv.convertScaleAbs(result)
'''使用 cv.convertScaleAbs 函数将 result 转换为绝对值图像,使其在显示时不受正负值影响。'''

#图像显示
plt.figure(figsize=(5,4),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title("原图")
plt.xticks([]),plt.yticks([])

plt.subplot(122),plt.imshow(Scale_abs,cmap=plt.cm.gray),plt.title("laplacian检测后结果")
plt.xticks([]),plt.yticks([])
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

2.2结果展示

在这里插入图片描述

3 Canny 边缘检测算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1 代码实现

import cv2 as cv
import numpy as np
import  matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png",0)

#canny边缘检测
lowThreshold = 0
max_lowThreshold = 100

canny = cv.Canny(img,lowThreshold,max_lowThreshold)

#图像显示
plt.figure(figsize=(5,4),dpi=100)
plt.subplot(121),plt.imshow(img, cmap=plt.cm.gray),plt.title("原图")
plt.xticks([]),plt.yticks([])

plt.subplot(122),plt.imshow(canny,cmap=plt.cm.gray),plt.title("Canny检测后结果")
plt.xticks([]),plt.yticks([])

plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

3.2 结果展示

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/523760
推荐阅读
相关标签
  

闽ICP备14008679号