OpenCV图像轮廓的绘制方法
作者:404_久夏青 发布时间:2022-10-17 22:05:54
标签: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()
运行结果:
来源:https://blog.csdn.net/qq_53703628/article/details/119779014


猜你喜欢
- 应用场景在数据表中,要记录的每条数据是什么时候创建的,不需要应用程序去特意记录,而是由数据库获取当前时间自动记录创建时间。在数据库中,要记录
- 本文首先举例阐述了两种排序方法的操作步骤,然后列出了用python进行的实现过程,最后对桶式排序方法的优劣进行了简单总结。一、桶排序:排序一
- 无法打开用户默认数据库,登录失败,其原因是登录帐户的默认数据库被删除。 解决办
- 最近在给某网站的后台添加一系列的统计功能,遇到很多需要按条件计数的情况。尝试了几种方法,下面简要记录,供大家参考。问题描述为使讨论简单易懂,
- 前言回调函数是我们在python编程中经常会遇到的一个问题,而想在将来某一时刻进行函数回调,可以使用call_later()函数来实现,第一
- 实际上face_recognition这个项目尤其是dlib更适用于Linux系统。经过我的测试,在性能方面,编译同样规格的项目,这个工具在
- 简单了解多子图学习matplotlib的时候,有人肯定会觉得为啥不用Excel,为啥不用origin,为啥不直接使用软件,其实matplot
- 为什么在facebook交友会更容易?facebook与传统的BSP(Blog Service Provider)到底有什么不同?是因为它有
- PIL:使用python自带图像处理库读取出来的图片格式numpy:使用python-opencv库读取出来的图片格式tensor:pyto
- 阅读上一篇:一个完美网站的101项指标.第六部分.性能 符合 W3C 标准是网站的发展趋势,目前,几乎所有的浏览器都使用 W3C 标准,W3
- 记得之前learn python一书里面,因为当时没有官方支持,只能通过hack的方式实现抽象方法,具体如下 最简单的写法class MyC
- 从接触互联网开始,一直在关注每个网站页面浏览速度,不管大小国内外网站,而且每个用户的浏览时间都不一样,从而了解用户在浏览页面上时间体验尺度的
- 1 为什么要分库分表物理服务机的CPU、内存、存储设备、连接数等资源有限,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈。为
- 没人愿意等待。所以,没有访问者真的能够忍受一个打开速度极慢的网站。但是,网页打开速度到底对用户行为有什么影响,恐怕没几个人能够说清楚吧。前几
- 一、闭包闭包的形成条件:1.函数嵌套。2.内部函数使用了外部函数的变量或者参数。3.外部函数返回了使用外 部变量的内部函数。二、一个简单的例
- 将字符串字段转为数字排序或比大小mysql里面有个坑就是,有时按照某个字段的大小排序(或是比大小)发现排序有点错乱。后来才发现,是我们想当然
- 这里只列举了部分方法,其他方法或python库暂时还没使用到1.不用库,直接打印:代码样例:import time#demo1def pro
- 利用python开发了一个提取sim.log 中的各个关键步骤中的时间并进行统计的程序:#!/usr/bin/python2.6import
- 一、激活函数1.Sigmoid函数函数图像以及表达式如下:通过该函数,可以将输入的负无穷到正无穷的输入压缩到0-1之间。在x=0的时候,输出
- 2020.3.7准备scrapy,使用anaconda创建一个新的环境,执行“conda create -n scrapyEnv pytho