opencv c++ 边缘提取

本文介绍了图像处理中的边缘检测技术,包括边缘定义、类别以及两种主要的边缘提取方法:基于梯度的边缘提取和Canny边缘提取。基于梯度的方法通过高斯模糊去噪并使用不同算子提取边缘;Canny算法则进一步优化了边缘提取过程,通过非最大抑制和高低阈值链接提高了边缘图像的质量。

1、边缘

1.1 边缘定义

        以图像像素值突变最大的方向作为边缘法线,与边缘法线垂直的就是边缘。

        边缘强度:局部图像上的像素值突变程度(图像局部一阶梯度和二阶梯度值)。

        

 1.2 边缘类别

跃迁类型                                                           屋脊类型

 2、边缘提取

2.1 基于梯度的边缘提取

        步骤:高斯模糊去噪(选用3×3的核),再基于梯度提取边缘(使用robert算子、sobels算子、prewitt算子),最后对图像梯度进行阈值处理,大于T的保留,小于T的舍弃。

         缺点:单一阈值使得边缘图像不够连贯

 2.2 Canny边缘提取

        步骤:

        1、滤波处理(高斯滤波)。

        2、使用梯度算子获取梯度值G、梯度方向\Theta

        3、非最大抑制:保留与\Theta垂直方向上,梯度值最大的像素点,如下左1、2图上,当红框的像素点值,是在橙色箭头方向上最大的,则保留。

在实际应用中为减少运算量,只会对如下\frac{\pi }{4}\frac{\pi }{2}\frac{3\pi }{4}等角度的梯度进行非最大抑制。

        4、高低阈值链接,分别设定高低阈值T1、T2,一般T1/T2 = 2~3,将像素值大于T1的像素点全部保留,小于T2的全部舍弃,T1到T2之间的如果在其八邻域内高阈值保留像素点,则保留,反之丢弃。

  

 代码示例:

static void cannny_track_bar(int b, void* image_data) {
	//canny
	Mat image = *((Mat*)image_data);
	Mat edge1;
	Canny(image, edge1, b, b*2, 3);
	imshow("canny", edge1);
}
void edge_catch(Mat& image)
{
	namedWindow("canny", WINDOW_FREERATIO);
	int t = 50;
	createTrackbar("canny bar", "canny", &t, 100, cannny_track_bar,(void*)&image);
	cannny_track_bar(50, &image);
}

 结果:

 

 

 

### OpenCV C++ 边缘检测方法 在计算机视觉领域,边缘检测是一种重要的预处理技术,用于识别图像中的显著边界。OpenCV 提供了多种算法来实现这一目标,其中最常用的是 **Canny 边缘检测** 和 **Laplace 算子**。 #### 使用 `cv::Canny` 实现边缘检测 `cv::Canny()` 是一种基于多阶段算法的边缘检测器,能够有效抑制噪声并保留强边缘。以下是其实现方式: 1. 需要先将彩色图像转换为灰度图像,因为灰度图像是边缘检测的最佳输入形式[^4]。 2. 对图像进行高斯模糊以减少噪声干扰。 3. 调用 `cv::Canny()` 函数完成边缘提取操作。 下面是完整的代码示例: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat src = imread("image.jpg", IMREAD_GRAYSCALE); // 加载灰度图像 if (src.empty()) return -1; // 检查图像加载状态 Mat blurredImage; GaussianBlur(src, blurredImage, Size(5, 5), 0); // 应用高斯模糊降噪 Mat cannyEdges; Canny(blurredImage, cannyEdges, 25, 75, 3, false); // 执行Canny边缘检测 imshow("Original Image", src); imshow("Canny Edges", cannyEdges); waitKey(0); return 0; } ``` 上述代码中,低阈值设为 25,高阈值设为 75,这些参数可以根据实际应用场景调整[^3]。 --- #### 使用 Laplace 算子进行边缘检测 除了 Canny 方法外,还可以通过拉普拉斯算子 (`cv::Laplacian`) 来检测图像中的二阶导数变化点。这种方法适用于某些特定场景下的边缘增强任务。 以下是使用 `cv::Laplacian` 的代码片段: ```cpp Mat laplacianEdges; Laplacian(src, laplacianEdges, CV_16S, 3, 1, 0, BORDER_DEFAULT); // 计算拉普拉斯梯度 convertScaleAbs(laplacianEdges, laplacianEdges); // 将结果转回8位无符号整型 imshow("Laplacian Edges", laplacianEdges); waitKey(0); ``` 需要注意的是,拉普拉斯算子通常会产生双极性输出(正负值),因此需要调用 `convertScaleAbs` 将其映射到可见范围内[^2]。 --- #### 总结 - 如果追求高质量的边缘检测效果,推荐优先考虑 `cv::Canny` 方法。 - 若希望快速获取粗略的边缘轮廓,则可以尝试使用 `cv::Laplacian` 或其他简单的一阶微分算子如 Sobel。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值