opencv-5 边缘检测Canny和sober

ゞ 浴缸里的玫瑰 2022-03-12 07:42 344阅读 0赞
  1. #include<opencv.hpp>
  2. #include<highgui.hpp>
  3. using namespace std;
  4. using namespace cv;
  5. /*
  6. 在边缘检测中,常用的一种模板是Sobel 算子。
  7. Sobel 算子有两个,一个是检测水平边缘的 ;
  8. 另一个是检测垂直边缘的 。与Prewitt算子相比,
  9. Sobel算子对于像素的位置的影响做了加权,
  10. 可以降低边缘模糊程度,因此效果更好。
  11. 由于Sobel算子是滤波算子的形式,
  12. 用于提取边缘,可以利用快速卷积函数, 简单有效,
  13. 因此应用广泛。美中不足的是,Sobel算子并没有将
  14. 图像的主体与背景严格地区分开来,换言之就是Sobel
  15. 算子没有基于图像灰度进行处理,由于Sobel算子没有
  16. 严格地模拟人的视觉生理特征,所以提取的图像轮廓
  17. 有时并不能令人满意。
  18. */
  19. void main()
  20. {
  21. /*
  22. //Canny 算子
  23. Mat img = imread("jack1.jpg");
  24. Mat edge, gray;
  25. cvtColor(img,gray,CV_RGB2GRAY);
  26. imshow("gray", gray);
  27. blur(gray, edge, Size(3,3));
  28. Canny(edge,edge,50,100,3);
  29. imshow("edge",edge);
  30. */
  31. //--------------------------------------------
  32. //sober
  33. /*
  34. void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
  35. 函数参数解释:
  36. InputArray src:输入的原图像,Mat类型
  37. OutputArray dst:输出的边缘检测结果图像,Mat型,大小与原图像相同。
  38. int ddepth:输出图像的深度,针对不同的输入图像,输出目标图像有不同的深度,具体组合如下:
  39. - 若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F
  40. - 若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F
  41. - 若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F
  42. - 若src.depth() = CV_64F, 取ddepth = -1/CV_64F
  43. 注:ddepth =-1时,代表输出图像与输入图像相同的深度。
  44. int dx:int类型dx,x 方向上的差分阶数,1或0
  45. int dy:int类型dy,y 方向上的差分阶数,1或0
  46. 其中,dx=1,dy=0,表示计算X方向的导数,检测出的是垂直方向上的边缘;dx=0,dy=1,表示计算Y方向的导数,检测出的是水平方向上的边缘。
  47. int ksize:为进行边缘检测时的模板大小为ksize*ksize,取值为1、3、5和7,其中默认值为3。特殊情况:ksize=1时,采用的模板为3*1或1*3。
  48. 当ksize=3时,Sobel内核可能产生比较明显的误差,此时,可以使用 Scharr 函数,该函数仅作用于大小为3的内核。具有跟sobel一样的速度,但结果更精确,其内核为:
  49. */
  50. Mat img = imread("jack1.jpg");
  51. Mat grad_x, grad_y;
  52. Mat abs_x, abs_y, dst;
  53. //X方向的梯度
  54. Sobel(img,grad_x,CV_16S,1,0,3,1,1,BORDER_DEFAULT);
  55. convertScaleAbs(grad_x, abs_x);
  56. imshow("abs_x", abs_x);
  57. //Y方向的梯度
  58. Sobel(img, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
  59. convertScaleAbs(grad_y, abs_y);
  60. imshow("abs_y", abs_y);
  61. //按照权重叠加
  62. addWeighted(abs_x,0.5, abs_y,0.5,0,dst);
  63. imshow("dst",dst);
  64. waitKey(0);
  65. return;
  66. }

发表评论

表情:
评论列表 (有 0 条评论,344人围观)

还没有评论,来说两句吧...

相关阅读

    相关 canny边缘检测

    Canny边缘检测算法是1986提出的多阶段的边缘检测算法。 预处理 由于边缘易受噪声影响,所以对图像利用高斯滤波器来去除噪声。 ![G\_\{0\}(x, y) =

    相关 Canny 边缘检测

    Canny 边缘检测主要步骤: 1. 先把图像变成灰色 2. 计算图像梯度,其中每个像素的亮度对应该店的梯度值。通过寻找最大的梯度值,就可以找到边缘。 首先,我们需要读