OpenCV(6):图像边缘检测

news/2025/2/23 17:00:37

        图像边缘检测是计算机视觉和图像处理中的一项基本任务,它用于识别图像中亮度变化明显的区域,这些区域通常对应于物体的边界。是 OpenCV 中常用的边缘检测函数及其说明:

函数算法说明适用场景
cv2.Canny()Canny 边缘检测多阶段算法,检测效果较好,噪声抑制能力强。通用边缘检测,适合大多数场景。
cv2.Sobel()Sobel 算子基于一阶导数的边缘检测,可以检测水平和垂直边缘。检测水平和垂直边缘。
cv2.Scharr()Scharr 算子Sobel 算子的改进版本,对边缘的响应更强。检测细微的边缘。
cv2.Laplacian()Laplacian 算子基于二阶导数的边缘检测,对噪声敏感。检测边缘和角点。

1 Canny 边缘检测 (cv2.Canny())

        Canny 边缘检测是一种多阶段的边缘检测算法,由 John F. Canny 在 1986 年提出。Canny 边缘检测被认为是边缘检测的"金标准",因为它能够在噪声抑制和边缘定位之间取得良好的平衡。

1.1 Canny 边缘检测的步骤

        Canny 边缘检测算法主要包括以下几个步骤:

  1. 噪声抑制:使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。
  2. 计算梯度:使用 Sobel 算子计算图像的梯度幅值和方向。
  3. 非极大值抑制:沿着梯度方向,保留局部梯度最大的像素点,抑制其他像素点。
  4. 双阈值检测:使用两个阈值(低阈值和高阈值)来确定真正的边缘。高于高阈值的像素点被认为是强边缘,低于低阈值的像素点被抑制,介于两者之间的像素点如果与强边缘相连则保留。
  5. 边缘连接:通过滞后阈值处理,将弱边缘与强边缘连接起来,形成完整的边缘。

1.2 使用 OpenCV 实现 Canny 边缘检测

        在 OpenCV 中,可以使用 cv2.Canny() 函数来实现 Canny 边缘检测。该函数的原型如下:

edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)
  • image:输入图像,必须是单通道的灰度图像。
  • threshold1:低阈值。
  • threshold2:高阈值。
  • apertureSize:Sobel 算子的孔径大小,默认为 3。
  • L2gradient:是否使用 L2 范数计算梯度幅值,默认为 False(使用 L1 范数)。
import cv2

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用 Canny 边缘检测
edges = cv2.Canny(image, 100, 200)

# 显示结果
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 Sobel 算子 (cv2.Sobel())

        Sobel 算子是一种基于梯度的边缘检测算子,它通过计算图像在水平和垂直方向上的梯度来检测边缘。Sobel 算子结合了高斯平滑和微分操作,因此对噪声具有一定的抑制作用。

2.1 Sobel 算子的原理

        Sobel 算子使用两个 3x3 的卷积核分别计算图像在水平和垂直方向上的梯度:

  • 水平方向的卷积核:
    [-1, 0, 1]
    [-2, 0, 2]
    [-1, 0, 1]
  • 垂直方向的卷积核:
    [-1, -2, -1]
    [ 0,  0,  0]
    [ 1,  2,  1]

        通过这两个卷积核,可以分别得到图像在水平和垂直方向上的梯度 Gx 和 Gy。最终的梯度幅值可以通过以下公式计算:

G = sqrt(Gx^2 + Gy^2)

2.2 使用 OpenCV 实现 Sobel 算子

        在 OpenCV 中,可以使用 cv2.Sobel() 函数来计算图像的梯度。该函数的原型如下:

dst = cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
  • src:输入图像。
  • ddepth:输出图像的深度,通常使用 cv2.CV_64F
  • dx:x 方向上的导数阶数。
  • dy:y 方向上的导数阶数。
  • ksize:Sobel 核的大小,默认为 3。
  • scale:缩放因子,默认为 1。
  • delta:可选的 delta 值,默认为 0。
  • borderType:边界填充类型,默认为 cv2.BORDER_DEFAULT
import cv2
import numpy as np

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 计算 x 方向的梯度
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)

# 计算 y 方向的梯度
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)

# 计算梯度幅值
sobel_combined = np.sqrt(sobel_x ** 2 + sobel_y ** 2)

# 显示结果
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Sobel Combined', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

3 Scharr算子(cv2.Scharr())

3.1 Scharr算子的原理

        在离散的空间上,有很多方法可以用来计算近似导数,在使用 3×3 的 Sobel 算子时,可能计算结果并不太精准。OpenCV 提供了 Scharr 算子,该算子具有和 Sobel 算子同样的速度,且精度更高。可以将 Scharr 算子看作对 Sobel 算子的改进,其核通常为:

3.2 使用 OpenCV 实现 Scharr 算子

        OpenCV 提供了函数 cv2.Scharr()来计算 Scharr 算子,其语法格式如下:

dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )
  •  dst 代表输出图像。
  • src 代表原始图像。
  • ddepth 代表输出图像深度。该值与函数 cv2.Sobel()中的参数 ddepth 的含义相同。
  • dx 代表 x 方向上的导数阶数。
  • dy 代表 y 方向上的导数阶数。
  • scale 代表计算导数值时的缩放因子,该项是可选项,默认值是 1,表示没有缩放。
  • delta 代表加到目标图像上的亮度值,该项是可选项,默认值为 0。
  • borderType 代表边界样式。
import cv2

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 计算 x 方向的梯度
scharr_x = cv2.Scharr(image, cv2.CV_64F, 1, 0)

# 计算 y 方向的梯度
scharr_y = cv2.Scharr(image, cv2.CV_64F, 0, 1)

# 计算梯度幅值
scharr_combined = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)

# 显示结果
cv2.imshow('Scharr X', scharr_x)
cv2.imshow('Scharr Y', scharr_y)
cv2.imshow('Scharr Combined', scharr_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

4 Laplacian 算子 (cv2.Laplacian())

        Laplacian 算子是一种二阶微分算子,它通过计算图像的二阶导数来检测边缘。Laplacian 算子对噪声比较敏感,因此通常在使用之前会对图像进行高斯平滑处理。

4.1 Laplacian 算子的原理

        Laplacian 算子使用以下卷积核来计算图像的二阶导数:

[ 0,  1,  0]
[ 1, -4,  1]
[ 0,  1,  0]

        通过这个卷积核,可以得到图像的 Laplacian 值。Laplacian 值较大的区域通常对应于图像的边缘。

4.2 使用 OpenCV 实现 Laplacian 算子

        在 OpenCV 中,可以使用 cv2.Laplacian() 函数来计算图像的 Laplacian 值。该函数的原型如下:

dst = cv2.Laplacian(src, ddepth, ksize=1, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
  • src:输入图像。
  • ddepth:输出图像的深度,通常使用 cv2.CV_64F
  • ksize:Laplacian 核的大小,默认为 1。
  • scale:缩放因子,默认为 1。
  • delta:可选的 delta 值,默认为 0。
  • borderType:边界填充类型,默认为 cv2.BORDER_DEFAULT
import cv2

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用 Laplacian 算子
laplacian = cv2.Laplacian(image, cv2.CV_64F)

# 显示结果
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

5 常用边缘检测函数对比

函数算法优点缺点适用场景
cv2.Canny()Canny 边缘检测噪声抑制能力强,边缘检测效果好。参数调节较为复杂。通用边缘检测,适合大多数场景。
cv2.Sobel()Sobel 算子计算简单,适合检测水平和垂直边缘。对噪声敏感,边缘检测效果一般。检测水平和垂直边缘。
cv2.Scharr()Scharr 算子对边缘的响应更强,适合检测细微边缘。对噪声敏感。检测细微的边缘。
cv2.Laplacian()Laplacian 算子可以检测边缘和角点。对噪声非常敏感。检测边缘和角点。

http://www.niftyadmin.cn/n/5863605.html

相关文章

机器学习实战(7):聚类算法——发现数据中的隐藏模式

第7集:聚类算法——发现数据中的隐藏模式 在机器学习中,聚类(Clustering) 是一种无监督学习方法,用于发现数据中的隐藏模式或分组。与分类任务不同,聚类不需要标签,而是根据数据的相似性将其划…

MATLAB学习之旅:数据建模与仿真应用

在MATLAB的学习之旅中,我们已经积累了丰富的基础知识和实用的编程技巧。从前面的学习中,我们对MATLAB的基础操作、数据处理、统计分析等方面都有了深入的了解。如今,我们将迈向一个充满创造力和实用性的阶段——数据建模与仿真应用。这部分内…

Oracle 10g数据库资源下载分享

简介:Oracle 10g是Oracle公司推出的一款数据库管理系统版本,本教程将向读者详细说明如何在不同的操作系统平台上安装、配置Oracle 10g,包括系统需求、安装步骤、数据库启动关闭、用户和表空间管理、网络配置及性能调优。同时,还介…

3DGS(三维高斯散射)与SLAM技术结合的应用

3DGS(三维高斯散射)与SLAM(即时定位与地图构建)技术的结合,为动态环境感知、高效场景建模与实时渲染提供了新的可能性。以下从技术融合原理、应用场景、优势挑战及典型案例展开分析: 一、核心融合原理 1. …

使用AWS服务Amazon Bedrock构建大模型应用

文章目录 背景Amazon Bedrock支持多模型选择 实验demo列出Amazon Bedrock服务支持的模型从读取用户评论、调用Amazon Bedrock模型进行分类如何利用AWS的嵌入模型进行文本处理和分析 背景 2023年,生成式人工智能、大模型、ChatGPT等概念无处不在,但是到底…

数据结构:实验题目:单链表归并。将两个非递减次序排列的单链表归并为一个非递增次序排列的单链表,并计算表长。要求利用原来两个单链表的结点存放合并后的单链表。

输出样例如图&#xff1a; 代码如下&#xff1a; #include<stdio.h>#include<stdlib.h>//链表节点结构 typedefstructListNode{intval;structListNode*next; } ListNode;// 创建新节点 ListNode* createNode(int val){ListNode* newNode (ListNode*)malloc(sizeo…

EndNote与Word关联:科研写作的高效助力

在科研领域&#xff0c;文献管理与论文写作是紧密相连的重要环节。EndNote作为一款强大的文献管理工具&#xff0c;与Word实现有效关联后&#xff0c;能极大地提升科研写作效率。本文将详细介绍EndNote与Word关联的方法、关联后的优势、常见问题及解决办法&#xff0c;助力科研…

抓包工具(三)Wireshark代理抓包Java程序的HTTPS请求

目录 一、需求背景二、操作步骤2.1 jSSLKeyLog 工具下载2.2 jSSLKeyLog工具使用2.3 将sslkeylog导入Wireshark2.4 测试Demo2.5 测试结果1&#xff09;使用工具解密HTTPS前&#xff1a;2&#xff09;实用工具解密HTTPS后&#xff1a; 三、补充&#xff1a;如果出现未解密成功的情…