图像处理——轮廓检测

一、图像轮廓

  1. 图像轮廓与图像边界区别
    图像轮廓指的是图像整体,连接在一起,而图像边界可能是零散的线段。

二、图像轮廓检测的实现

  1. opencv轮廓检测函数

    def findContours(image: Any,
                     mode: Any,
                     method: Any,
                     contours: Any = None,
                     hierarchy: Any = None,
                     offset: Any = None)
    

    部分参数说明:

    ①mode:轮廓检索模式
    常用的模式
    RETR_EXTERNAL:只检测最外边轮廓
    RETR_LIST:检测所有轮廓,并将其保存到一条链表当中
    RETR_CCOMP:检测所有轮廓,并将他们组织为两层,顶层为各部分的外部边界,第二层为空洞的边界
    RETR_TREE:检索所有轮廓,并重构嵌套轮廓的整个层次。最常用模式。
    ②method:轮廓逼近方法
    CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形。
    CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分(只保留他们终点部分)。

  2. 轮廓检测过程
    ①读取图像灰度图

    lena = cv2.imread("Lena.png")
    gray = cv2.cvtColor(lena, cv2.COLOR_BGR2GRAY)
    

    ②图像二值化

    ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    

    在这里插入图片描述

    ③图像轮廓检测

    binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    

    ④绘制轮廓

    # 绘制轮廓信息
    draw_img = lena.copy()
    # 默认取-1,全部轮廓,取其他的值的时候,通常会绘制出部分轮廓。
    res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
    showImg(res, 'res')
    

    在这里插入图片描述

三、轮廓特征

  1. 轮廓面积计算
    cnt = contours[0]
    cv2.contourArea()
    
  2. 轮廓周长计算
    # True表示闭合的
    cv2.arcLength(cnt,True)
    

四、轮廓近似

  1. 将部分折线部分化为直,近似为一个形状。

    counter = cv2.imread("counter.png")
    # 图像轮廓检测
    gray = cv2.cvtColor(counter, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    # 绘制轮廓信息
    draw_img = lena.copy()
    res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
    showImg(res, 'res')
    cnt = contours[0]
    # 通过改变系数,来改变近似的效果
    epsilon = 0.1 * cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, epsilon, True)
    draw_img = lena.copy()
    res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
    showImg(res, 'res')
    

    原始轮廓
    在这里插入图片描述

    部分进行轮廓近似
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值