目录
实验原理
示例代码
运行结果
实验原理
在OpenCV中,Canny边缘检测是一种广泛使用的边缘检测算法。它是由John F. Canny在1986年提出的,并且因其性能优良而被广泛应用。在OpenCV中,Canny边缘检测是通过Canny函数实现的。
函数原型
void Canny(InputArray src, OutputArray edges,
double threshold1, double threshold2,
int apertureSize=3, bool L2gradient=false);
参数的含义如下:
src: 输入图像,应该是单通道的8位或者32位浮点型图像。
edges: 输出图像,也是单通道的8位图像,用来存放检测到的边缘。
threshold1: 第一个阈值(低阈值),用于弱边缘的检测。
threshold2: 第二个阈值(高阈值),用于强边缘的检测。
apertureSize: Sobel算子的尺寸,默认为3。
L2gradient: 如果设为true,则使用L2范数来计算梯度幅度;如果设为false,
则使用L1范数(即|Gx| + |Gy|)。默认为false。
示例代码
以下是一个简单的C++程序示例,演示如何使用OpenCV中的Canny函数进行边缘检测:
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
// 加载图像
cv::Mat src = cv::imread("0.png", cv::IMREAD_COLOR); // 读取彩色图像
if (!src.data) // 检查是否成功加载图像
{
std::cout << "Error loading image" << std::endl;
return -1;
}
// 转换为灰度图像
cv::Mat gray;
cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
// 高斯模糊
cv::Mat blurred;
cv::GaussianBlur(gray, blurred, cv::Size(3, 3), 0);
// Canny边缘检测
cv::Mat edges;
double threshold1 = 50; // 第一个阈值
double threshold2 = 150; // 第二个阈值
cv::Canny(blurred, edges, threshold1, threshold2);
// 显示结果
cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
cv::imshow("Original Image", src);
cv::namedWindow("Detected Edges", cv::WINDOW_NORMAL);
cv::imshow("Detected Edges", edges);
// 等待按键,然后关闭所有窗口
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
基本步骤
读取图像 - 使用imread函数从文件中加载图像。
灰度转换 - 将彩色图像转换为灰度图像是必要的,因为Canny算法通常应用于单通道图像上。
高斯模糊 - 在进行边缘检测之前,通常会先对图像应用高斯滤波器以减少噪声。
Canny边缘检测 - 应用Canny边缘检测算法。
显示结果 - 显示原始图像和处理后的图像。