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)

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)

2、效果展示

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

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法小白(真小白)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值