目录
  • 一、Sobel算法
    • 1、算法概述
    • 2、主要函数
  • 二、C++代码
    • 三、python代码
      • 四、结果展示
        • 五、相关链接

          一、Sobel算法

          1、算法概述

          Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,然而在很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是在对效率要求较高,而对细纹理不太关系的时候。

          使用Sobel算子提取图像边缘分3个步骤:

          提取X方向的边缘,X方向一阶Sobel边缘检测算法为:

          OpenCV实现Sobel边缘检测的示例

          提取Y方向的边缘,Y方向一阶Sobel边缘检测算法为:

          OpenCV实现Sobel边缘检测的示例

          综合两个方向的边缘信息得到整幅图像的边缘。

          2、主要函数

          Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
          • src:传入的图像
          • ddepth:图像的深度
          • dxdy:指的是求导的阶数,0表示这个方向上没有求导,所填的数一般为0、1、2。
          • ksize:是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7。如果ksize=-1,就演变成为3×3的Scharr算子,scale是缩放导数的比例常数,默认情况为没有伸缩系数。
          • borderType:是判断图像边界的模式,这个参数默认值为cv2.BORDER_DEFAULT。
          • dstdst之后的参数都是可选参数。

          二、C++代码

          #include <iostream>
          #include <opencv2\opencv.hpp>
          
          using namespace cv;
          using namespace std;
          
          int main()
          {
          	//----------------读取图像-----------------
          	Mat img = imread("1.jpg");
          	//黑白图像边缘检测结果较为明显
          	Mat gray_img;
          	cvtColor(img, gray_img, COLOR_BGR2GRAY);
          	Mat resultX, resultY, resultXY;
          	//-------------Sobel边缘检测--------------
          	//X方向一阶边缘
          	Sobel(img, resultX, CV_16S, 2, 0, 1);
          	convertScaleAbs(resultX, resultX);
          
          	//Y方向一阶边缘
          	Sobel(img, resultY, CV_16S, 0, 1, 3);
          	convertScaleAbs(resultY, resultY);
          
          	//整幅图像的一阶边缘
          	resultXY = resultX + resultY;
          
          	//显示图像
          	imshow("resultX", resultX);
          	imshow("resultY", resultY);
          	imshow("resultXY", resultXY);
          	waitKey(0);
          	return 0;
          }
          

          三、python代码

          import cv2
          
          img = cv2.imread("1.jpg")
          gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          
          # -------------------Sobel边缘检测------------------------
          x = cv2.Sobel(gray_img, cv2.CV_16S, 1, 0)
          y = cv2.Sobel(gray_img, cv2.CV_16S, 0, 1)
          # cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
          # 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
          Scale_absX = cv2.convertScaleAbs(x)  # convert 转换  scale 缩放
          Scale_absY = cv2.convertScaleAbs(y)
          result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
          # ----------------------显示结果----------------------------
          cv2.imshow('img', gray_img)
          cv2.imshow('Scale_absX', Scale_absX)
          cv2.imshow('Scale_absY', Scale_absY)
          cv2.imshow('result', result)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
          
          

          四、结果展示

          1、灰度图

          OpenCV实现Sobel边缘检测的示例

          2、X方向一阶边缘

          OpenCV实现Sobel边缘检测的示例

          2、Y方向一阶边缘

          OpenCV实现Sobel边缘检测的示例

          3、整幅图像的一阶边缘

          OpenCV实现Sobel边缘检测的示例

          五、相关链接

          [1] python+OpenCV图像处理(八)边缘检测

          声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。