Opencv实现Sobel算子、Scharr算子、Laplacian算子、Canny检测图像边沿 ...

打印 上一主题 下一主题

主题 829|帖子 829|积分 2487

图像边沿检测


  
1 Sobel算子


1.1概念

是一种用于图像处理处罚的算法,主要用于边沿检测。它通过盘算图像亮度的空间梯度来突出显示图像中的边沿。Sobel算子包罗两个核(卷积矩阵),分别用于检测水平边沿和垂直边沿。
1.2 两个卷积矩阵


1.3 函数及参数理解



  • cv2.Sobel(图片变量,数据类型,dx=1/0,dy=0/1),水平/垂直获取轮廓

    • 数据类型为数字-1时,与图片类型雷同,为cv2.CV_64F时,为浮点型有正负
    • dx为1时水平获取,dy为1时垂直获取,不能同时为1

  • cv2.convertScaleAbs(轮廓变量),对轮廓变量内的数值绝对值化,使其可以显示出来
  • cv2.addWeighted(x轮廓变量,1,y轮廓变量,1,0),组合轮廓变量使其完整
1.4 灰度图实际测试

代码展示:
  1. import cv2
  2. yuan = cv2.imread('yuan.png')
  3. cv2.imshow('yuan',yuan)
  4. cv2.waitKey(0)
  5. yuan_1 = cv2.Sobel(yuan,-1,dx=1,dy=0)
  6. yuan_64F = cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)
  7. yuan_Abs = cv2.convertScaleAbs(yuan_64F)
  8. yuan_1_y = cv2.Sobel(yuan,-1,dx=0,dy=1)
  9. yuan_64F_y = cv2.Sobel(yuan,cv2.CV_64F,dx=0,dy=1)
  10. yuan_Abs_y = cv2.convertScaleAbs(yuan_64F_y)
  11. # 组合
  12. yuan_xy = cv2.addWeighted(yuan_Abs,1,yuan_Abs_y,1,0)
  13. cv2.imshow('yuan_1',yuan_1)
  14. cv2.waitKey(0)
  15. cv2.imshow('yuan_64F',yuan_64F)
  16. cv2.waitKey(0)
  17. cv2.imshow('yuan_Abs',yuan_Abs)
  18. cv2.waitKey(0)
  19. cv2.imshow('yuan_1_y',yuan_1_y)
  20. cv2.waitKey(0)
  21. cv2.imshow('yuan_64F_y',yuan_64F_y)
  22. cv2.waitKey(0)
  23. cv2.imshow('yuan_Abs_y',yuan_Abs_y)
  24. cv2.waitKey(0)
  25. cv2.imshow('yuan_xy',yuan_xy )
  26. cv2.waitKey(0)
复制代码
运行结果:

1.5 BGR图测试

代码展示:
  1. import cv2
  2. at1 = cv2.imread('at1.png')
  3. cv2.imshow('at1',at1)
  4. cv2.waitKey(0)
  5. at1_64F = cv2.Sobel(at1,cv2.CV_64F,dx=1,dy=0)
  6. at1_Abs = cv2.convertScaleAbs(at1_64F)
  7. at1_64F_y = cv2.Sobel(at1,cv2.CV_64F,dx=0,dy=1)
  8. at1_Abs_y = cv2.convertScaleAbs(at1_64F_y)
  9. # 组合
  10. at1_xy = cv2.addWeighted(at1_Abs,1,at1_Abs_y,1,0)
  11. cv2.imshow('at1_64F',at1_64F)
  12. cv2.waitKey(0)
  13. cv2.imshow('at1_Abs',at1_Abs)
  14. cv2.waitKey(0)
  15. cv2.imshow('at1_64F_y',at1_64F_y)
  16. cv2.waitKey(0)
  17. cv2.imshow('at1_Abs_y',at1_Abs_y)
  18. cv2.waitKey(0)
  19. cv2.imshow('at1y_xy_sobel',at1_xy )
  20. cv2.waitKey(0)
复制代码
运行结果:

2 Scharr算子


2.1概念

它是Sobel算子的一种改进版本,专门用于盘算图像的梯度。Scharr算子与Sobel算子的主要区别在于它们的卷积核不同。Scharr算子在处理处罚边沿时比Sobel算子具有更高的精度,但它们在盘算时间和复杂度上是一样的,函数cv2.Scharr(),内涵参数与Sobel算子雷同,同样需要绝对值和组合。
2.2 实际测试

代码展示:
  1. import cv2
  2. at1 = cv2.imread('at1.png')
  3. cv2.imshow('at1',at1)
  4. cv2.waitKey(0)
  5. at1_64F = cv2.Sobel(at1,cv2.CV_64F,dx=1,dy=0)
  6. at1_Abs = cv2.convertScaleAbs(at1_64F)
  7. at1_64F_y = cv2.Sobel(at1,cv2.CV_64F,dx=0,dy=1)
  8. at1_Abs_y = cv2.convertScaleAbs(at1_64F_y)
  9. # # 组合
  10. at1_xy = cv2.addWeighted(at1_Abs,1,at1_Abs_y,1,0)
  11. cv2.imshow('at1y_xy_sobel',at1_xy )
  12. cv2.waitKey(0)
  13. # # scharr
  14. at1_64F_Scharr = cv2.Scharr(at1,cv2.CV_64F,dx=1,dy=0)
  15. at1_Abs_Scharr = cv2.convertScaleAbs(at1_64F_Scharr)
  16. at1_64F_y_Scharr = cv2.Scharr(at1,cv2.CV_64F,dx=0,dy=1)
  17. at1_Abs_y_Scharr = cv2.convertScaleAbs(at1_64F_y_Scharr)
  18. at1_xy_Scharr = cv2.addWeighted(at1_Abs_Scharr,1,at1_Abs_y_Scharr,1,0)
  19. cv2.imshow('at1y_xy_Scharr',at1_xy_Scharr)
  20. cv2.waitKey(0)
复制代码
运行结果:

3 Laplacian算子


3.1概念

是一种用于边沿检测的数学工具。在图像处理处罚中,Laplacian算子通常用于找到图像中的亮度快速变革的区域,这些区域每每对应于图像中的边沿大概物体边界。
   不需要再进行图片组合。
  3.2 函数



  • cv2.Laplacian(图片变量,数据类型)
  • cv2.convertScaleAbs(轮廓变量)
3.3 实际测试

代码展示:
  1. import cv2
  2. yuan = cv2.imread('yuan.png')
  3. cv2.imshow('yuan',yuan)
  4. cv2.waitKey(0)
  5. at1 = cv2.imread('at1.png')
  6. cv2.imshow('at1',at1)
  7. cv2.waitKey(0)
  8. ## Sobel
  9. at1_64F = cv2.Sobel(at1,cv2.CV_64F,dx=1,dy=0)
  10. at1_Abs = cv2.convertScaleAbs(at1_64F)
  11. at1_64F_y = cv2.Sobel(at1,cv2.CV_64F,dx=0,dy=1)
  12. at1_Abs_y = cv2.convertScaleAbs(at1_64F_y)
  13. # # # 组合
  14. at1_xy = cv2.addWeighted(at1_Abs,1,at1_Abs_y,1,0)
  15. cv2.imshow('at1y_xy_sobel',at1_xy )
  16. cv2.waitKey(0)
  17. # # # scharr
  18. at1_64F_Scharr = cv2.Scharr(at1,cv2.CV_64F,dx=1,dy=0)
  19. at1_Abs_Scharr = cv2.convertScaleAbs(at1_64F_Scharr)
  20. at1_64F_y_Scharr = cv2.Scharr(at1,cv2.CV_64F,dx=0,dy=1)
  21. at1_Abs_y_Scharr = cv2.convertScaleAbs(at1_64F_y_Scharr)
  22. at1_xy_Scharr = cv2.addWeighted(at1_Abs_Scharr,1,at1_Abs_y_Scharr,1,0)
  23. cv2.imshow('at1y_xy_Scharr',at1_xy_Scharr)
  24. cv2.waitKey(0)
  25. # laplacian
  26. at1_64F_Laplacian = cv2.Laplacian(at1,cv2.CV_64F)
  27. at1_Abs_Laplacian = cv2.convertScaleAbs(at1_64F_Laplacian)
  28. cv2.imshow('at1_Abs_Laplacian ',at1_Abs_Laplacian )
  29. cv2.waitKey(0)
  30. yuan_64F_Laplacian = cv2.Laplacian(yuan,cv2.CV_64F)
  31. yuan_Abs_Laplacian = cv2.convertScaleAbs(yuan_64F_Laplacian)
  32. cv2.imshow('yuan_Abs_Laplacian ',yuan_Abs_Laplacian )
  33. cv2.waitKey(0)
复制代码
运行结果:

4 Canny边沿检测


4.1 概念

Canny边沿检测是一种流行的图像处理处罚算法,用于检测图像中的边沿,并被认为是边沿检测中最优的算法之一。
4.2 步调


  • 噪声降低

    • 使用高斯滤波器对图像进行平滑处理处罚,以减少图像中的噪声。高斯滤波器可以有用地降低噪声,同时保持边沿的尖锐度。

  • 盘算梯度幅度和方向

    • 通过盘算图像中每个像素点的梯度幅度和方向,来确定可能的边沿。通常使用Sobel算子来盘算水平和垂直方向的梯度。

  • 非极大值抑制

    • 对梯度幅度进行非极大值抑制,这一步会沿着梯度方向查抄每个像素,只有当该像素的梯度幅度是局部最大值时,才将其保存为边沿候选点,否则将其抑制(即设为0)。

  • 双阈值确定边沿

    • 应用两个阈值(高阈值和低阈值)来确定真实边沿和潜在边沿。梯度幅度高于高阈值的像素被标记为强边沿,梯度幅度低于低阈值的像素被抑制,梯度幅度在两个阈值之间的像素被标记为弱边沿。

  • 边沿跟踪和边沿毗连

    • 最后,通过边沿跟踪和边沿毗连来强化边沿。通常,算法会查抄弱边沿像素是否与强边沿像素相连,如果是,则将其标记为强边沿。这个过程可以确保边沿是一连的。

4.3 优点

Canny边沿检测算法的优点包括:


  • 精良的检测效果:Canny算法可以或许检测到图像中的真实边沿,同时抑制噪声。
  • 边沿定位精度:由于使用了梯度方向,Canny算法可以或许更精确地定位边沿。
  • 参数可调:通过调解高斯滤波器的大小、阈值等参数,可以适应不同的图像和边沿检测需求。
Canny边沿检测算法在盘算机视觉和图像处理处罚领域得到了广泛应用,尤其是在需要精确边沿检测的场所。
4.4 函数及参数理解



  • cv2.Canny(图像变量,低阈值,高阈值),低于低阈值为0,高于高阈值为255
4.5 实际测试

代码展示:
  1. import cv2
  2. at1 = cv2.imread('at1.png')
  3. cv2.imshow('at1',at1)
  4. cv2.waitKey(0)
  5. at1_64F = cv2.Sobel(at1,cv2.CV_64F,dx=1,dy=0)
  6. at1_Abs = cv2.convertScaleAbs(at1_64F)
  7. at1_64F_y = cv2.Sobel(at1,cv2.CV_64F,dx=0,dy=1)
  8. at1_Abs_y = cv2.convertScaleAbs(at1_64F_y)
  9. #
  10. # # # 组合
  11. at1_xy = cv2.addWeighted(at1_Abs,1,at1_Abs_y,1,0)
  12. cv2.imshow('at1y_xy_sobel',at1_xy )
  13. cv2.waitKey(0)
  14. # #
  15. # # scharr
  16. at1_64F_Scharr = cv2.Scharr(at1,cv2.CV_64F,dx=1,dy=0)
  17. at1_Abs_Scharr = cv2.convertScaleAbs(at1_64F_Scharr)
  18. at1_64F_y_Scharr = cv2.Scharr(at1,cv2.CV_64F,dx=0,dy=1)
  19. at1_Abs_y_Scharr = cv2.convertScaleAbs(at1_64F_y_Scharr)
  20. at1_xy_Scharr = cv2.addWeighted(at1_Abs_Scharr,1,at1_Abs_y_Scharr,1,0)
  21. cv2.imshow('at1y_xy_Scharr',at1_xy_Scharr)
  22. cv2.waitKey(0)
  23. # laplacian
  24. at1_64F_Laplacian = cv2.Laplacian(at1,cv2.CV_64F)
  25. at1_Abs_Laplacian = cv2.convertScaleAbs(at1_64F_Laplacian)
  26. cv2.imshow('at1_Abs_Laplacian ',at1_Abs_Laplacian )
  27. cv2.waitKey(0)
  28. # # canny
  29. at1_canny = cv2.Canny(at1,130,255)
  30. cv2.imshow('at1_canny',at1_canny )
  31. cv2.waitKey(0)
复制代码
运行结果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表