OpenCV中Canny、Sobel和Laplacian边界检测算法原理和使用示例

OpenCV 中提供了多种 边界检测(Edge Detection)算法,常用于图像分割、特征提取、物体识别等任务。以下是 OpenCV 中几种常见的边缘检测算法及其原理、使用方法:


一、Canny 边缘检测(最常用)

原理:

Canny 是一种多阶段边缘检测算法,步骤如下:

  1. 高斯滤波(降噪)
  2. 计算梯度(Sobel 算子)
  3. 非极大值抑制(NMS)
  4. 双阈值处理
  5. 边缘连接(滞后阈值)

OpenCV 示例:

#include <opencv2/opencv.hpp>
using namespace cv;

int main() {
    Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
    Mat edges;
    Canny(img, edges, 50, 150); // 低、高阈值
    imshow("Canny", edges);
    waitKey(0);
    return 0;
}

二、Sobel 算子(梯度边缘)

原理:

使用 Sobel 卷积核分别对 X 和 Y 方向进行一阶导数计算,得到图像的梯度图。

OpenCV 示例:

Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
Mat grad_x, grad_y;
Sobel(img, grad_x, CV_64F, 1, 0, 3);
Sobel(img, grad_y, CV_64F, 0, 1, 3);
Mat grad;
magnitude(grad_x, grad_y, grad);
imshow("Sobel", grad / 255.0);

三、Laplacian 算子(二阶边缘)

原理:

Laplacian 是图像的二阶导数,用于检测图像中的快速变化区域。

OpenCV 示例:

Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
Mat lap;
Laplacian(img, lap, CV_64F);
imshow("Laplacian", lap / 255.0);

四、Scharr 算子(增强的 Sobel)

原理:

Scharr 是 Sobel 的增强版本,对梯度方向的响应更强,适合检测细节丰富的边缘。

OpenCV 示例:

Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
Mat scharr_x, scharr_y;
Scharr(img, scharr_x, CV_64F, 1, 0);
Scharr(img, scharr_y, CV_64F, 0, 1);
Mat grad;
magnitude(scharr_x, scharr_y, grad);
imshow("Scharr", grad / 255.0);

五、Prewitt 算子(经典算子之一)

OpenCV 中没有内置 Prewitt 算子,但可以通过自定义卷积核实现:

Mat prewitt_x = (Mat_<char>(3,3) << -1,0,1,-1,0,1,-1,0,1);
Mat prewitt_y = (Mat_<char>(3,3) << -1,-1,-1,0,0,0,1,1,1);
Mat img = imread("image.jpg", IMREAD_GRAYSCALE);
Mat dx, dy;
filter2D(img, dx, CV_32F, prewitt_x);
filter2D(img, dy, CV_32F, prewitt_y);
Mat grad;
magnitude(dx, dy, grad);
imshow("Prewitt", grad / 255.0);

六、边缘检测算法选择建议:

算法特点适用场景
Canny最稳健,抗噪声强,多阶段处理通用边缘检测任务
Sobel简单快速,一阶导,方向明显图像梯度可视化、边缘粗提
Laplacian二阶导,响应强精确轮廓,可能含噪点
Scharr精度高,响应强精细边缘,高噪场景
Prewitt基础,教学用途多教学、复现基础算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云SLAM

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

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

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

打赏作者

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

抵扣说明:

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

余额充值