Canny边缘检测是一种流行的边缘检测算法,由John F. Canny在1986年开发。它是一种多阶段过程,包括噪声滤波、计算图像强度的梯度、非最大值抑制以及双阈值检测。本文通过函数原型解读和示例对cv::Canny()函数进行详解,以帮助大家理解和使用。

原理

Canny边缘检测的步骤如下:

(1)高斯滤波(噪声滤波):使用高斯滤波器平滑图像以减少噪声。高斯滤波器是一种线性滤波器,可以消除图像中的高频噪声。
(2)计算梯度强度和方向:计算图像中每个像素的梯度强度和方向。梯度强度表示像素点处的边缘强度,而梯度方向表示边缘的方向。
(3)非最大值抑制:在计算梯度强度和方向后,非最大值抑制将抑制那些不是局部最大值的像素点。这意味着只有局部最大值的像素点才会被保留下来。
(4)双阈值检测:最后,双阈值检测用于检测边缘。这需要两个阈值,通常称为低阈值和高阈值。如果像素的梯度强度大于高阈值,则该像素被视为边缘;如果像素的梯度强度在两个阈值之间,则该像素被视为边缘候选;如果像素的梯度强度低于低阈值,则该像素被视为非边缘。

函数介绍

void cv::Canny(InputArray image, OutputArray edges, double lowThreshold, double highThreshold, int apertureSize = 3);

参数解释:

image:输入图像,应该是灰度图像。
edges:输出图像,即检测到的边缘图像。
lowThreshold:低阈值,用于双阈值检测。
highThreshold:高阈值,用于双阈值检测。
apertureSize:指定Sobel算子的大小,默认为3。

运行示例

设置阈值分别为50和150。
代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    Mat image = imread("ceshi.jpg", IMREAD_COLOR); // 读取输入图像
    if (image.empty()) {
        cout << "Failed to read image." << endl;
        return -1;
    }
    Mat gray_image; cvtColor(image, gray_image, COLOR_BGR2GRAY); // 转换为灰度图像
    Mat edges_image;

    // 应用Canny边缘检测算法
    Canny(gray_image, edges_image, 50, 150);

    // 显示结果图像
    imshow("Input", image);
    imshow("Edges", edges_image);
    imwrite("cnany.jpg", edges_image);
    waitKey(0);
    return 0;
}

在上面的示例中,我们首先读取输入图像并将其转换为灰度图像。然后,我们使用Canny函数应用Canny边缘检测算法,并指定两个阈值(低阈值和高阈值)。最后,我们显示原始图像和检测到的边缘图像。图像对比如下所示。

在这里插入图片描述
上面为原图,下面为边缘检测效果图。
在这里插入图片描述

小结

选择使用Canny函数进行边缘计算时,应根据项目需求和场景,设置合适的低阈值和高阈值参数,以获得最佳的边缘检测结果。较低的阈值可能会导致更多的边缘被检测到,而较高的阈值可能会导致较少的边缘被检测到。因此,选择适当的阈值是使用Canny边缘检测函数的关键之一。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐