Laplacian()、Sobel()以及 Scharr()。

简介: Laplacian()、Sobel()以及 Scharr()。

Laplacian()Sobel()Scharr() 都是 OpenCV 中用于边缘检测的函数。它们通过计算图像的导数来增强图像的边缘,但每种方法都有其特定的应用场景和特点。

Laplacian()

Laplacian() 函数是一个二阶导数算子,它对图像的亮度变化进行响应,可以用来突出图像的边缘。当应用于图像时,它会在边缘位置产生峰值。

功能:检测图像中的快速亮度变化,即边缘。

效果:产生一个强度表示边缘的二进制图像。

使用

lap = cv2.Laplacian(image, cv2.CV_16S, ksize)
  • image:输入的图像。
  • cv2.CV_16S:输出的深度。推荐使用 16 位有符号数据类型以避免溢出。
  • ksize:内核的大小。

Sobel()

Sobel() 函数是一个一阶导数算子,它通过计算图像的梯度幅度来检测边缘。Sobel 算子在水平和垂直方向上都是敏感的,因此它可以检测到两个方向上的边缘。

功能:在水平和垂直方向上检测边缘。

效果:产生一个灰度图像,其中边缘被增强。

使用

sobelx = cv2.Sobel(image, cv2.CV_16S, 1, 0, ksize)
sobely = cv2.Sobel(image, cv2.CV_16S, 0, 1, ksize)
  • image:输入的图像。
  • cv2.CV_16S:输出的深度。
  • 1, 00, 1:分别表示水平和垂直方向上的导数。
  • ksize:内核的大小。

Scharr()

Scharr() 函数是 Sobel() 函数的一个变种,它使用了不同的内核系数,对斜向的边缘有更好的响应。

功能:检测斜向边缘。

效果:产生一个灰度图像,其中斜向边缘被增强。

使用

scharr = cv2.Sobel(image, cv2.CV_16S, dx, dy, ksize=-1)
  • image:输入的图像。
  • cv2.CV_16S:输出的深度。
  • dxdy:分别表示 x 方向和 y 方向的导数。对于 Scharr(),通常使用 dx=1dy=0dx=0dy=1
  • ksize=-1:自动选择内核大小。

示例代码

以下是使用这些函数进行边缘检测的示例代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 加载图像
image = cv2.imread('path_to_image', cv2.IMREAD_GRAYSCALE)

# Laplacian 边缘检测
lap = cv2.Laplacian(image, cv2.CV_16S)
lap = cv2.convertScaleAbs(lap)

# Sobel 边缘检测
sobelx = cv2.Sobel(image, cv2.CV_16S, 1, 0, ksize=5)
sobely = cv2.Sobel(image, cv2.CV_16S, 0, 1, ksize=5)
sobel = cv2.convertScaleAbs(cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0))

# Scharr 边缘检测
scharr = cv2.Sobel(image, cv2.CV_16S, dx=1, dy=0, ksize=-1)
scharr = cv2.convertScaleAbs(scharr)

# 显示结果
plt.figure(figsize=(16, 6))

plt.subplot(2, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_GRAY2BGR))
plt.title('Original Image')

plt.subplot(2, 2, 2)
plt.imshow(cv2.cvtColor(lap, cv2.COLOR_GRAY2BGR))
plt.title('Laplacian Edge Detection')

plt.subplot(2, 2, 3)
plt.imshow(cv2.cvtColor(sobel, cv2.COLOR_GRAY2BGR))
plt.title('Sobel Edge Detection')

plt.subplot(2, 2, 4)
plt.imshow(cv2.cvtColor(scharr, cv2.COLOR_GRAY2BGR))
plt.title('Scharr Edge Detection')

plt.show()

这段代码展示了如何使用 Laplacian()Sobel()Scharr() 函数进行边缘检测,并通过 matplotlib 库显示了原始图像和边缘检测的结果。每种方法都产生了不同的边缘图像,可以根据具体的应用场景选择最合适的方法。

目录
相关文章
|
8月前
|
计算机视觉 Python
透视变换
【5月更文挑战第15天】透视变换。
51 1
|
7月前
Sobel边缘检测
【6月更文挑战第7天】Sobel边缘检测。
50 1
|
7月前
Laplacian(拉普拉斯)边缘检测
【6月更文挑战第7天】Laplacian(拉普拉斯)边缘检测。
110 1
|
7月前
|
算法
Canny边缘检测
【6月更文挑战第7天】Canny边缘检测。
44 1
|
8月前
|
机器学习/深度学习 计算机视觉
均值滤波
【5月更文挑战第15天】均值滤波。
49 1
|
8月前
|
算法 计算机视觉 Python
Canny
Canny
55 8
|
8月前
|
算法 计算机视觉 Python
【OpenCV】-算子(Sobel、Canny、Laplacian)学习
【OpenCV】-算子(Sobel、Canny、Laplacian)学习
257 2
|
8月前
|
资源调度 API 计算机视觉
【OpenCV】—非线性滤波:中值滤波、双边滤波
【OpenCV】—非线性滤波:中值滤波、双边滤波
|
计算机视觉
OpenCV-Laplacian边缘检测
OpenCV-Laplacian边缘检测