opencv实现sobel边缘检测

来源:互联网 发布:linux 电池管理 编辑:程序博客网 时间:2024/06/02 22:51
void sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scaler - 1, double delta=0, int borederType = BORDER_DEFAULF)
函数解析:
ddepth输出图像的深度,dx是x方向的导数,dy是y方向的导数;ksize是sobel内核的大小,设置为奇数,默认是3.scale为可选的所犯导数的比例常数。delta为可选的增量常数,被叠加到导数中,borderType用于判断图像的边界模式
代码如下:
  1. #include "opencv2/highgui/highgui.hpp"
  2. #include "opencv2/imgproc/imgproc.hpp"
  3. #include "opencv2/opencv.hpp"
  4. #include "opencv2/core/core.hpp"
  5. #include <iostream>
  6. #include "opencv2/photo/photo.hpp"
  7. using namespace std;
  8. using namespace cv;
  9. int main()
  10. {
  11. cv::Mat srcImage = cv::imread("C:\\Users\\LP\\Desktop\\C++\\ConsoleApplication4\\ConsoleApplication4\\1.jpg");
  12. if (srcImage.empty())
  13. {
  14. return -1;
  15. }
  16. cv::Mat srcGray;
  17. cvtColor(srcImage, srcGray, CV_BGR2GRAY);
  18. cv::imshow("srcGray", srcGray);
  19. //定义边缘图,水平及垂直
  20. cv::Mat edgeMat, edgeXMat, edgeYMat;
  21. //计算x和Y方向的Sobel边缘
  22. Sobel(srcGray, edgeXMat, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
  23. Sobel(srcGray, edgeYMat, CV_16S, 0, 1, 3, 1, 0, BORDER_DEFAULT);
  24. //线性变换,转换输入数组元素为8位无符号整形
  25. convertScaleAbs(edgeXMat, edgeXMat);
  26. convertScaleAbs(edgeYMat, edgeYMat);
  27. //两个方向边缘叠加
  28. addWeighted(edgeXMat, 0.5, edgeYMat, 0.5, 0.0, edgeMat);
  29. cv::imshow("edgeMat", edgeMat);
  30. //定义Scharr边缘图像
  31. cv::Mat edgeMats, edgeXMats, edgeYMats;
  32. Scharr(srcGray, edgeXMats, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT);
  33. Scharr(srcGray, edgeYMats, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT);
  34. //线性变换,转换输入数组元素为8为无符号整形
  35. convertScaleAbs(edgeXMats, edgeXMats);
  36. convertScaleAbs(edgeYMats, edgeYMats);
  37. addWeighted(edgeXMats, 0.5, edgeYMats, 0.5, 0.0, edgeMats);
  38. cv::imshow("edgeMats", edgeMats);
  39. cv::waitKey(0);
  40. return 0;
  41. }