【OpenCV】轮廓提取——findContours、drawContours

一、简介

  轮廓发现:是基于图像边缘提取的基础上寻找对象轮廓的方法。所以边缘提取的阈值选择将会影响最终轮廓的发现。轮廓提取的API可以是边缘提取后的图像,也可以是直接二值化的图像

二、实战

  两种方法都可以使用,根据实际情况选择。

2.1 基于二值图像

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

'''二值图像直接作为轮廓提取API的输入'''
def find_contours_binary_demo(image):
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #得到二值图像
    ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
    cv.imshow('binary',binary)
    #提取边缘
    cloneImage,contours,Heriachy=cv.findContours(binary,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
    for i,contour in enumerate(contours):
        #绘制边缘
        cv.drawContours(image, contours, i, (0, 0, 255), 2)
        #cv.drawContours(image,contours,i,(0,0,255),-1)#填充轮廓可以直接将最后一个参数置为-1
    cv.imshow('find_contours', image)

img = cv.imread(r'D:\Project\Opencv\Learning01\angelababy.jpg')
cv.imshow('origin',img)
find_contours_binary_demo(img)
cv.waitKey(0)

在这里插入图片描述

2.2 基于边缘提取图像

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
'''边缘提取后的图像作为轮廓提取API的输入'''
def find_contours_Canny_demo(image):
    # 1.高斯模糊:最后两个参数给定一个就可以自动求取另一个,所以只给其中一个赋值就可以
    blur=cv.GaussianBlur(image,(3,3),0)
    #2.灰度处理
    gray=cv.cvtColor(blur,cv.COLOR_BGR2GRAY)
    #3.求取梯度,也可以不用梯度,直接将灰度图传入cv.canny
    grad_x=cv.Sobel(gray,cv.CV_16SC1,1,0)
    grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
    #4.得到提取边缘后的图像
    edge_output=cv.Canny(grad_x,grad_y,50,150)#参数:x梯度,y梯度 ,低阈值,高阈值
    cv.imshow('binary',edge_output)
    #提取边缘
    cloneImage,contours,Heriachy=cv.findContours(edge_output,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
    for i,contour in enumerate(contours):
        #绘制边缘
        cv.drawContours(image, contours, i, (0, 0, 255), 2)
        #cv.drawContours(image,contours,i,(0,0,255),-1)#填充轮廓可以直接将最后一个参数置为-1

    cv.imshow('find_contours', image)
img = cv.imread(r'D:\Project\Opencv\Learning01\angelababy.jpg')
cv.imshow('origin',img)
find_contours_Canny_demo(img)
cv.waitKey(0)

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值