当前位置:   article > 正文

opencv(七)Canny边缘检测和图像轮廓检测_边缘检测代码

边缘检测代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、Canny边缘检测

1、检测步骤

  • 1)使用高斯滤波器,以平滑图像,滤掉噪声。

  • 2)计算图像中每个像素点的梯度强度和方向

  • 3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应

  • 4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

  • 5)通过抑制孤立的弱边缘最终完成边缘检测

  • cv2.Canny(img,minval,maxval)

    • minval:低阈值。如果检测到的像素点的梯度比低阈值还小那就舍弃掉
    • maxval:高阈值。如果检测到的像素点的梯度比高阈值还大则是边缘点保留下来
    • 在两者之间的像素点,如果其梯度有比maxval大的则是潜在的边缘保留下来,其余舍弃掉

2、代码展示

import cv2
import show_img as si
import numpy as np
import matplotlib.pyplot as plt

# 读取图片并灰度化处理
lena = cv2.imread('../data/lena.jpeg',cv2.IMREAD_GRAYSCALE)

# canny边缘检测
v1 = cv2.Canny(lena,80,150)
v2 = cv2.Canny(lena,50,100)

# 对比效果
res = np.hstack((v1,v2))
si.show_img('res',res)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3、效果对比图及说明

  • 先看原图

在这里插入图片描述

  • 效果对比

  • 我们我们看到左边这张是低阈值设置的80,高阈值设置的150,经过检测后所呈现出来的边缘信息比右边设置的低阈值50,高阈值100呈现出来的信息要少,是因为低阈值设置的高了,有的潜在边缘在低阈值以下就给舍弃掉了,而且有的边缘信息达不到你设置的高阈值也就被舍弃掉了。这就是左边内容不太丰富的原因。故我们在进行边缘检测时双阈值设置的要差不多合理(可以反复进行尝试)。
    在这里插入图片描述

二、图像轮廓检测

1、cv2.findContours(img,mode,method)

  • cv2.findContours(img,mode,method)
    • mode:轮廓检索模式
      • RETR_EXTERNAL:只检索最外面的轮廓;
      • RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
      • RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分最外面的边界,第二层是空洞的边界;
      • RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;
    • method:轮廓逼近方法
      • CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)
      • CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分
  • 之后我们用的时候主要用 RETR_TREE模式就可以了。
import cv2
import show_img as si
import numpy as np

# 读取图片
lena = cv2.imread('../data/lena.jpeg',cv2.IMREAD_GRAYSCALE)
# 进行阈值处理
ret,thresh = cv2.threshold(lena,127,255,cv2.THRESH_BINARY)
# si.show_img('thresh',thresh)

#轮廓检测
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

# 绘制轮廓
# 传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
# 注意需要copy,要不原图会变
draw_img = lena.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
# si.show_img('res',res)

#draw_img1 = lena.copy()
#res = cv2.drawContours(draw_img1,contours,0,(0,0,255),2)
# si.show_img('res',res)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2、效果展示

我们可以看到大致轮廓已经画出来了。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/846121
推荐阅读
相关标签
  

闽ICP备14008679号