Sobel算子是应用广泛的离散微分算子之一,用于图像处理中的边缘检测,计算图像灰度的近似梯度。

基于图像卷积来实现在水平方向和垂直方向检测对应方向上的边缘。

对于源图像与奇数Sobel水平核Gx、垂直核Gy进行卷积可计算水平与垂直变换。

Sobel算子在进行边缘检测时候效率较高,对精度要求不是很高时候,是一种较为常用的边缘检测方法。

Sobel算子对沿着x轴和y轴的排列表示得很好,但是对于其他角度的表示却不够精确,这时候我们可以使用Scharr滤波器。

5.2.1 非极大值一直Sobel检测

步骤1/2/3/4

https://blog.csdn.net/gone_huilin/article/details/53223622

https://bbs.csdn.net/topics/370004267

5.2.2 图像直接卷积实现Sobel

5.2.3 图像卷积下非极大值抑制Sobel

非极大值抑制虽然能够较好剔除虚假边缘点,但对于某些特定场景下的边缘检测并不适用,例如污损文本字符识别。

5.2.4 Sobel库函数实现

 1 /////////////////////////////////5.2.4 Sobel库函数实现//////////////////////////////
 2 ////////https://blog.csdn.net/gone_huilin/article/details/53223636
 3 #include <opencv2/core/core.hpp>
 4 #include <opencv2/highgui/highgui.hpp>
 5 #include "opencv2/imgproc/imgproc.hpp"
 6 #include <iostream>
 7 using namespace cv;
 8 int main()
 9 {
10     cv::Mat srcImage = imread("D:\\楼房.jpg");
11     if (!srcImage.data)
12         return -1;
13     cv::Mat srcGray;
14     cvtColor(srcImage, srcGray, CV_RGB2GRAY);
15     imshow("srcGray", srcGray);
16     // 定义边缘图,水平及垂直
17     cv::Mat edgeMat, edgeXMat, edgeYMat;
18     // 求x方向Sobel边缘
19     Sobel(srcGray, edgeXMat, CV_16S, 1, 0, 3, 1,
20         0, BORDER_DEFAULT);
21     // 求y方向Sobel边缘
22     Sobel(srcGray, edgeYMat, CV_16S, 0, 1, 3, 1,
23         0, BORDER_DEFAULT);
24     // 线性变换转换输入数组元素成8位无符号整型
25     convertScaleAbs(edgeXMat, edgeXMat);
26     convertScaleAbs(edgeYMat, edgeYMat);
27     // x与y方向边缘叠加
28     addWeighted(edgeXMat, 0.5, edgeYMat, 0.5, 0, edgeMat);
29     cv::imshow("edgeYMat", edgeYMat);
30     imshow("edgeMat", edgeMat);
31     // 定义Scharr边缘图像
32     cv::Mat edgeMatS, edgeXMatS, edgeYMatS;
33     // 计算x方向Scharr边缘
34     Scharr(srcGray, edgeXMatS, CV_16S, 1, 0, 1,
35         0, BORDER_DEFAULT);
36     convertScaleAbs(edgeXMatS, edgeXMatS);
37     // 计算y方向Scharr边缘
38     Scharr(srcGray, edgeYMatS, CV_16S, 0, 1, 1,
39         0, BORDER_DEFAULT);
40     // 线性变换转换输入数组元素成8位无符号整型
41     convertScaleAbs(edgeYMatS, edgeYMatS);
42     // x与y方向边缘叠加
43     addWeighted(edgeXMatS, 0.5, edgeYMatS, 0.5, 0, edgeMatS);
44     cv::imshow("edgeMatS", edgeMatS);
45     cv::waitKey(0);
46     return 0;
47 }
View Code

相关文章: