OpenCV图像轮廓的绘制方法

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

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()

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • opencv python 图像轮廓/检测轮廓/绘制轮廓的方法

    图像的轮廓检测,如计算多边形外界.形状毕竟.计算感兴趣区域等. Contours : Getting Started 轮廓 简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度. 轮廓是形状分析和物体检测和识别的有用工具 NOTE 为获得更好的准确性,请使用二值图,在找到轮廓之前,应用阈值法或canny边缘检测 从OpenCV 3.2开始,findContours()不再修改源图像,而是将修改后的图像作为三个返回参数中的第一个返回 在OpenCV中,查找轮廓是从黑色背景中查找白色对

  • Python Opencv实现图像轮廓识别功能

    本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下 要求:用矩形或者圆形框住图片中的云朵(不要求全部框出) 轮廓检测 Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.th

  • opencv 图像轮廓的实现示例

    图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原始图像,通常使用原始图像的一份进行拷贝. 3.在opencv里,是从黑色背景里找白色.因此对象必须是白色,背景为黑色. 方法 cv2.findContours() cv2.drawContours() 通过cv2.findContours() 查找轮廓在哪里,再通过 cv2.drawContours

  • python-opencv获取二值图像轮廓及中心点坐标的代码

    python-opencv获取二值图像轮廓及中心点坐标代码: groundtruth = cv2.imread(groundtruth_path)[:, :, 0] h1, w1 = groundtruth.shape contours, cnt = cv2.findContours(groundtruth.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if len(contours) != 1:#轮廓总数 continue M = cv

  • python 基于opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手:而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图. 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一

  • OpenCV实现图像轮廓检测以及外接矩形

    前两篇博文分别介绍了图像的边缘检测和轮廓检测,本文接着介绍图像的轮廓检测和轮廓外接矩形: 一.代码部分: // extract_contours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<cv.h> #include<highgui.h> using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { /

  • Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

    可以直接跳到最后整体代码看一看是不是很少的代码!!!! 思路: 1. 数据的整合 2. 图片的灰度转化 3. 图片的二值转化 4. 图片的轮廓识别 5. 得到图片的顶点数 6. 依据顶点数判断图像形状 一.原数据的展示 图片文件共36个文件夹,每个文件夹有100张图片,共3600张图片. 每一个文件夹里都有形同此类的图形 二.数据的整合 对于多个文件夹,分析起来很不方便,所有决定将其都放在一个文件夹下进行分析,在python中具体实现如下: 本次需要的包 import cv2 import os

  • OpenCV图像轮廓的绘制方法

    本文实例为大家分享了检测几何图形轮廓和检测花朵图形轮廓,供大家参考,具体内容如下 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, 12

  • OpenCV 图像梯度的实现方法

    目录 概述 梯度运算 礼帽 黑帽 Sobel 算子 计算 x 计算 y 计算 x+y 融合 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. 梯度运算 梯度: 膨胀 (Dilating) - 腐蚀 (Eroding). 例子: # 读取图片 pie = cv2.imread("pie.png") # 核 kernel = np.ones((7, 7), np.uint8) # 计算梯度 gradient =

  • OpenCV图像轮廓提取的实现

    目录 前言 提取傅里叶变换的高频信息 通过蚁群算法进行图片轮廓提取 Canny边缘检测   使用cuda加速提取轮廓 前言 常用的轮廓提取算法有:Canny.阈值分割.提取傅里叶变换的高频信息,还有别具一格的蚁群算法,当然比较常见的作法是使用阈值分割+边缘查找,在OpenCV里是threshold和findContours两个函数的组合使用,和Canny. 轮廓提取的算法很多,而其目的都是为了找到图像中灰阶差比较大的位置.而所谓亚像素提取,则是使用了插值算法,以找出灰阶差最大的位置. 提取傅里叶

  • OpenCV半小时掌握基本操作之图像轮廓

    目录 概述 图像轮廓 绘制轮廓 轮廓特征 轮廓近似 边界矩形 外接圆 [OpenCV]⚠️高手勿入! 半小时学会基本操作 ⚠️ 图像轮廓 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. 图像轮廓 cv2.findContours可以帮助我们查找轮廓. 格式: cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=Non

  • Python+OpenCV之图像轮廓详解

    目录 1. 图像轮廓 1.1 findContours介绍 1.2 绘制轮廓 1.3 轮廓特征 2. 轮廓近似 2.1 轮廓 2.2 边界矩形 2.3 外界多边形及面积 1. 图像轮廓 1.1 findContours介绍 cv2.findContours(img, mode, method) mode:轮廓检索模式 RETR_EXTERNAL :只检索最外面的轮廓: RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中: RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是

  • OpenCV 轮廓周围绘制矩形框和圆形框的方法

    轮廓周围绘制介绍 没什么概念,就是给得出来的轮廓绘制周围图形,例如下图给左侧得出的轮廓去绘图得到右侧图像: 相关API 减少多边形轮廓点数:approxPolyDP 函数作用:基于RDP算法实现,目的是减少多边形轮廓点数 函数原型: //减少多边形轮廓点数 approxPolyDP( InputArray curve, // 一般是由图像的轮廓点组成的点集 Mat(vector) OutputArray approxCurve, // 表示输出的多边形点集 double epsilon, //

随机推荐