图像预处理-绘制图像轮廓与凸包

一.绘制图像轮廓

1.1 轮廓

相对于边缘,轮廓是连续闭合的,边缘不一定连续。

边缘检测 主要用于判断图像中的物件类型轮廓 则获取物件形态(比如矩形宽高)

1.2 寻找轮廓

寻找轮廓需要将图像做一个二值化处理,要绘制轮廓的部分置为白色,其余部分置为黑色。

一个白色像素 相邻(上下左右及两条对角线)位置有黑色像素 存在或者一个黑色像素 相邻(上下左右及两条对角线)位置有白色像素 存在时,那么该像素点就会被认定为边界像素点,轮廓就是有无数个这样的边界点组成的。

contours,hierarchy = cv2.findContours(image,mode,method)

  • 返回值 :[ 轮廓点坐标 ] 和 [ 层级关系 ]。

  • contours :表示获取到的轮廓点的列表,是一个元组 。检测到有多少个轮廓,该列表就有多少子列表,每一个子列表 都代表了一个轮廓中所有点的坐标

  • hierarchy :表示轮廓之间的关系。对于第i条轮廓,hierarchy[i][0], hierarchy[i][1] , hierarchy[i][2] , hierarchy[i][3]分别表示其后一条 轮廓、前一条 轮廓、(同层次的第一个子轮廓父轮廓的索引(如果没有相应的轮廓,则对应位置为-1)。该参数的使用情况会比较少。

  • image:表示输入的二值化图像。

  • mode:表示轮廓的检索模式。

  • method:轮廓的表示方法。

1.2.1 mode参数

  • RETR_EXTERNAL

查找最外层 的轮廓。并且在hierarchy里的轮廓关系中,每一个轮廓只有前一条 轮廓与后一条 轮廓的索引,而没有父轮廓与子轮廓的索引。

  • RETR_LIST

查找所有轮廓 ,每一个轮廓只有前一条轮廓与后一条轮廓的索引,而没有父轮廓与子轮廓的索引。

  • RETR_CCOMP

查找所有轮廓,列出所有的轮廓。并且在hierarchy里的轮廓关系中,会像下图一样显示六条数据:

  • RETR_TREE

表示列出所有的轮廓。并且在hierarchy里的轮廓关系中,轮廓会按照树的方式显示,其中最外层的轮廓作为树根,其子轮廓是一个个的树枝。(这个方法作了解)

1.2.2 method参数

轮廓存储方法:

  • CHAIN_APPROX_NONE表示将所有的轮廓点都进行存储

  • CHAIN_APPROX_SIMPLE 表示只存储有用的点,比如直线 只存储起点终点 ,四边形只存储四个顶点,默认使用这个方法

1.2.3 绘制轮廓

cv2.drawContours(image, contours, contourIdx, color, thickness)

  • image:原始图像,一般为单通道或三通道的 numpy 数组。

  • contours :一个元组包含多个轮廓的列表(有几个轮廓元组就有几个元素),每个轮廓本身也是一个由点坐标构成的二维数组(numpy数组)。

  • contourIdx :要绘制的轮廓索引。如果设为 -1 ,则会绘制所有轮廓。根据索引找到轮廓点绘制出来。默认是-1。

  • color:绘制轮廓的颜色,可以是 BGR 值或者是灰度值(对于灰度图像)。

  • thickness :轮廓线的宽度 ,如果是正数,则画实线 ;如果是负数 ,则填充轮廓内的区域

python 复制代码
import cv2 as cv

img = cv.imread('../images/pig.png')
img1 = cv.imread('../images/pig.png')

# 灰度化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 二值化
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_OTSU)

# 只绘制外部轮廓
contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cv.drawContours(img, contours, -1, (0, 255, 0), 3)

# 绘制内外
contours1, hierarchy1 = cv.findContours(binary, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
cv.drawContours(img1, contours1, -1, (0, 255, 0), 3)

cv.imshow('img', img)
cv.imshow('img1', img1)
cv.imshow('binary', binary)
cv.waitKey(0)
cv.destroyAllWindows()

二.凸包特征检测

凸包 其实就是将一张图片中物体的最外层的点连接 起来构成的凸多边形,它能包含物体中所有 的内容。存在凸包,那么这个点集里面的所有点要么在凸包上 ,要么在凸包内凸包点 则是最外层的点。

2.1 获取凸包点的方法

  • 穷举法

将集中的点进行随机 两两配对,并进行连线,对于每条直线,检查其余所有的点是否处于该直线的同一侧 ,如果是,那么说明构成该直线的两个点就是凸包点,其余的线依次进行计算,从而获取所有的凸包点。

  • QuickHull法

所有点放在二维坐标系中,找到横坐标最小最大 的两个点并连线。此时整个点集被分为两部分,直线上为上包,直线下为下包。

找到上包中的点距离该直线最远的点,连线并寻找之前连的左直线左侧的点和右直线右侧的点,然后重复本步骤,直到找不到为止。对下包也是这样操作。

上图就是 QuickHull的寻找过程,顺序已经在图中标出。

2.2 获取凸包点函数

cv2.convexHull(points)

  • points :输入参数,图像的轮廓(需要先获取 ,若有多个轮廓 要调用for循环获取contours元组里的所有坐标)

2.3 绘制凸包

cv2.polylines(image, pts, isClosed, color, thickness=1)

  • pts :一个二维 numpy 数组,每个元素是一维数组,代表一个多边形的一系列顶点坐标(凸包点)。

  • isClosed :布尔值,表示是否闭合多边形 ,如果为 True ,会在最后一个顶点和第一个顶点间自动添加一条线段,形成封闭的多边形

  • color :线条颜色,可以是一个三元组或四元组,分别对应BGRBGRA 通道的颜色值,或者是灰度图像 的一个整数值

  • thickness (可选):线条宽度,默认值为1。

python 复制代码
import cv2 as cv

img = cv.imread('../images/tu.png')
img1 = cv.imread('../images/tu.png')

# 灰度化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 二值化
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)

# 轮廓发现
contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

# 获取凸包
# 这里是用一个列表包装了所有坐标,所以后面的hull传参不需要加[]
hull = [cv.convexHull(c) for c in contours]
# 两种方式都可以,这种需要传hull套上[],毕竟只能传一个参数进去
hull1 = cv.convexHull(contours[0])

# 绘制轮廓
cv.drawContours(img, hull, -1, (0, 255, 0), 2)
cv.drawContours(img1, [hull1], -1, (0, 0, 255), 2)

cv.imshow('img', img) 
cv.imshow('img1', img1)
cv.waitKey(0)
cv.destroyAllWindows()
相关推荐
feng995201 小时前
技术伦理双轨认证如何重构AI工程师能力评估体系——基于AAIA框架的技术解析与行业实证研究
人工智能·aaif·aaia·iaaai
2301_776681652 小时前
【用「概率思维」重新理解生活】
开发语言·人工智能·自然语言处理
蜡笔小新..2 小时前
从零开始:用PyTorch构建CIFAR-10图像分类模型达到接近1的准确率
人工智能·pytorch·机器学习·分类·cifar-10
富唯智能2 小时前
转运机器人可以绕障吗?
人工智能·智能机器人·转运机器人
视觉语言导航3 小时前
湖南大学3D场景问答最新综述!3D-SQA:3D场景问答助力具身智能场景理解
人工智能·深度学习·具身智能
AidLux3 小时前
端侧智能重构智能监控新路径 | 2025 高通边缘智能创新应用大赛第三场公开课来袭!
大数据·人工智能
引量AI3 小时前
TikTok矩阵运营干货:从0到1打造爆款矩阵
人工智能·矩阵·自动化·tiktok矩阵·海外社媒
Hi-Dison3 小时前
神经网络极简入门技术分享
人工智能·深度学习·神经网络
奋斗者1号3 小时前
机器学习之决策树模型:从基础概念到条件类型详解
人工智能·决策树·机器学习
LinkTime_Cloud4 小时前
谷歌引入 AI 反诈系统:利用语言模型分析潜在恶意网站
人工智能·语言模型·自然语言处理