OpenCV——Sobel边缘检测

x33g5p2x  于2021-10-17 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(383)

一、Sobel算法

1、算法概述

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

  1. 提取X方向的边缘,X方向一阶Sobel边缘检测算法为:
    [ − 1 0 1 − 2 0 2 − 1 0 1 ] (1) \left[ \begin{matrix} -1 & 0 & 1\ -2 & 0 & 2 \ -1 & 0 & 1 \end{matrix} \right] \tag{1}⎣⎡​−1−2−1​000​121​⎦⎤​(1)
  2. 提取Y方向的边缘,Y方向一阶Sobel边缘检测算法为:
    [ − 1 − 2 − 1 0 0 0 1 2 1 ] (2) \left[ \begin{matrix} -1 & -2 & -1\ 0 & 0 & 0 \ 1 & 2 & 1 \end{matrix} \right] \tag{2}⎣⎡​−101​−202​−101​⎦⎤​(2)
  3. 综合两个方向的边缘信息得到整幅图像的边缘。

2、主要函数

  1. 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,就演变成为3x3的Scharr算子,scale是缩放导数的比例常数,默认情况为没有伸缩系数。
  • borderType:是判断图像边界的模式,这个参数默认值为cv2.BORDER_DEFAULT。
  • dstdst之后的参数都是可选参数。

二、C++代码

  1. #include <iostream>
  2. #include <opencv2\opencv.hpp>
  3. using namespace cv;
  4. using namespace std;
  5. int main()
  6. {
  7. //----------------读取图像-----------------
  8. Mat img = imread("1.jpg");
  9. //黑白图像边缘检测结果较为明显
  10. Mat gray_img;
  11. cvtColor(img, gray_img, COLOR_BGR2GRAY);
  12. Mat resultX, resultY, resultXY;
  13. //-------------Sobel边缘检测--------------
  14. //X方向一阶边缘
  15. Sobel(img, resultX, CV_16S, 2, 0, 1);
  16. convertScaleAbs(resultX, resultX);
  17. //Y方向一阶边缘
  18. Sobel(img, resultY, CV_16S, 0, 1, 3);
  19. convertScaleAbs(resultY, resultY);
  20. //整幅图像的一阶边缘
  21. resultXY = resultX + resultY;
  22. //显示图像
  23. imshow("resultX", resultX);
  24. imshow("resultY", resultY);
  25. imshow("resultXY", resultXY);
  26. waitKey(0);
  27. return 0;
  28. }

三、python代码

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

四、结果展示

1、灰度图

2、X方向一阶边缘

2、Y方向一阶边缘

3、整幅图像的一阶边缘

五、相关链接

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

相关文章