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 }