当前位置 博文首页 > OpenCV图像轮廓的绘制方法

    OpenCV图像轮廓的绘制方法

    作者:404_久夏青 时间:2021-09-17 18:36

    本文实例为大家分享了检测几何图形轮廓和检测花朵图形轮廓,供大家参考,具体内容如下

    OpenCV绘制图像轮廓

    绘制轮廓的一般步骤:

    1、读取图像

    image = cv2.imread('image_path')

    2、将原图转化为灰度图像

    image_gray  = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

    3、将灰度图像进行二值化阈值处理

    # 这里将阈值设置为127为例,最大阈值为255
    t, binary = cv.threshold(image_gray, 127, 255, cv.THRESH_BINARY)

    4、检测二值化图像中边缘轮廓

    # 这里以检测所有轮廓,不建立层次关系为例
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

    5、在原图上绘制图像

    # 这里将轮廓索引设置为-1,绘制出所有轮廓,颜色设置为红色,宽度为2为例
    cv2.drawContours(image, contours, -1, (0, 0, 255), 2)

    6、显示图像

    cv2.imshow('image', image)

    测试检测几何图形轮廓:

    代码如下:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/8/17
    # @Author  : ZYh
    """
    Introduction:
    图像轮廓检测:
        OpenCV提供的findContours()方法可以通过计算图像梯度来判断出图像的边缘,然后将边缘的点封装成数组返回
        contours, hierarchy = cv2.findContours(image, mode, mothode)
        参数:
            image->被检测图像必须是8位单通道二值图像。如果原图是rgb图像,必须转为灰度图像,在进行二值化阈值处理
            mode->轮廓的检索模式
                参数值                     含义
                cv2.RETR_EXTERNAL       只检测外轮廓
                cv2.RETR_LIST           检测所有轮廓,但不建立层次关系
                cv2.RETR_CCOMP          检测所有轮廓,并建立两级层次关系
                cv2.RETR_TREE           检测所有轮廓,并建立树状结构的层次关系
            mothode->检测轮廓时使用的方法
                参数值                     含义
                cv2.CHAIN_NONE                储存轮廓上的所有点
                cv2.CHAIN_APPROX_SIMPLE       只保存水平、垂直或对角线轮廓的端点
                cv2.CHAIN_APPROX_TC89_L1      Ten_Chinl近似算法的一种
                cv2.CHAIN_APPROX_TC89_KCOS    Ten_Chinl近似算法的一种
        retval:
            contours->检测出的所有轮廓,list类型,每一个元素都是某个轮廓的像素坐标数组
            hierarchy->轮廓之间的层次关系
    图像轮廓绘制:
        image = cv2.drawContours(image, contours, contourIdx, color, thickness, lineTypee, hierarchy,
            maxLevel, offse)
        参数:
            image->被绘制轮廓的原始图像,可以是多通道图像
            contours->findContours()方法得出的轮廓列表
            contourIdx->绘制轮廓的索引,如果为-1则绘制所有轮廓
            color:绘制颜色,BGR格式
            thickness->可选参数,画笔的粗细,如果为-1则绘制实心轮廓
            lineTypee->可选参数,绘制轮廓的线型
            hierarchy->可选参数,findContours()方法得出的层次关系
            maxLevel->可选参数,绘制轮廓的层次深度,最深绘制第maxLevel层
            offse->可选参数,偏移量,可以改变绘制结果的位置
    """
    import cv2 as cv
    # 读取加载图像
    image1 = cv.imread('shape1.png')
    image2 = cv.imread('shape1.png')
    # 将图像由RGB格式转为灰度图像
    gray1 = cv.cvtColor(image1, cv.COLOR_BGR2GRAY)
    gray2 = cv.cvtColor(image2, cv.COLOR_BGR2GRAY)
    # 将图像进行二值化阈值处理, 返回t是处理时采用的阈值,binary是阈值处理后的图像
    t1, binary1 = cv.threshold(gray1, 127, 255, cv.THRESH_BINARY)
    t2, binary2 = cv.threshold(gray2, 127, 255, cv.THRESH_BINARY)
    # 检测图像中出现的所有轮廓,记录轮廓的每一个点
    contours1, hierarchy1 = cv.findContours(binary1, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
    # 显示原图
    cv.imshow('image', image1)
    # 绘制所有轮廓,宽度为3,颜色为红色
    cv.drawContours(image1, contours1, -1, (0, 0, 255), 3)
    cv.imshow('cv.RETR_LIST', image1)
    
    # 检测图像中的外轮廓,记录轮廓的每一个点
    contours2, hierarchy2 = cv.findContours(binary2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
    # 使用cv2.RETR_EXTERNAL做参数绘制外轮廓,宽度为3,颜色为蓝色
    cv.drawContours(image2, contours2, -1, (255, 0, 0), 3)
    cv.imshow('cv.RETR_EXTERNAL', image2)
    
    cv.waitKey()
    cv.destroyAllWindows()

    运行结果:

    测试检测花朵图形轮廓:

    代码如下:

    # -*- coding: utf-8 -*-
    # @Time    : 2021/8/18
    # @Author  : ZYh
    """
    Introduction:
    绘制花朵所有轮廓
    """
    import  cv2 as cv
    
    image_flower = cv.imread('flower.png')
    # 显示原图
    cv.imshow('flower1', image_flower)
    # 对图像进行中值滤波处理,去除噪声
    image_flower = cv.medianBlur(image_flower, 5)
    cv.imshow('flower2', image_flower)
    # 将图像从RGB转为单通道灰度图像
    gray_flower = cv.cvtColor(image_flower, cv.COLOR_BGR2GRAY)
    # 灰度图像进行二值化阈值处理
    t, binary = cv.threshold(gray_flower, 127, 255, cv.THRESH_BINARY)
    # 显示二值化图像
    cv.imshow('binary', binary)
    # 获取二值化图像中的轮廓以及轮廓层次
    contours, hierarchy = cv.findContours(binary, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
    # 在原图中绘制轮廓
    cv.drawContours(image_flower, contours, -1, (0, 255, 255), 2)
    # 显示绘制轮廓后的图像
    cv.imshow('cv.RETR_LIST', image_flower)
    
    cv.waitKey()
    cv.destroyAllWindows()

    运行结果:

    jsjbwy
    下一篇:没有了