OpenCV:图像轮廓

目录

简述

[1. 什么是图像轮廓?](#1. 什么是图像轮廓?)

[2. 查找图像轮廓](#2. 查找图像轮廓)

[2.1 接口定义](#2.1 接口定义)

[2.2 参数说明](#2.2 参数说明)

[2.3 代码示例](#2.3 代码示例)

[2.4 运行结果](#2.4 运行结果)

[3. 绘制图像轮廓](#3. 绘制图像轮廓)

[3.1 接口定义](#3.1 接口定义)

[3.2 参数说明](#3.2 参数说明)

[3.3 代码示例](#3.3 代码示例)

[3.4 运行结果](#3.4 运行结果)

[4. 计算轮廓周长](#4. 计算轮廓周长)

[5. 计算轮廓面积](#5. 计算轮廓面积)

[6. 示例:计算图像轮廓的面积与周长](#6. 示例:计算图像轮廓的面积与周长)

[7. 应用场景](#7. 应用场景)


相关阅读

OpenCV:多边形逼近与凸包-CSDN博客


简述

在图像处理领域,轮廓是图像中物体的边界或形状信息的表达方式。通过提取轮廓,可以对图像中的目标进行识别、测量和分析。本文将从概念到实际操作详细介绍图像轮廓及其相关操作,并展示如何在 OpenCV 中实现。


1. 什么是图像轮廓?

图像轮廓是图像中物体边界的闭合曲线,表示具有相同强度或颜色像素的连接路径。它是一种重要的图像特征,常用于形状分析和对象检测。

特点

  • 轮廓基于二值图像计算,必须先将输入图像转换为二值图。
  • OpenCV 提供的轮廓查找算法将视图像中的白色区域为前景(目标)。
  • 轮廓的方向可以是顺时针或逆时针。

2. 查找图像轮廓

OpenCV 提供了 cv2.findContours() 函数来查找图像的轮廓。

2.1 接口定义

python 复制代码
contours, hierarchy = cv2.findContours(image, mode, method)

2.2 参数说明

image:输入的二值图像(通常是灰度图的阈值化结果)。

mode:轮廓的检索模式,常见值:

  • cv2.RETR_EXTERNAL:只检测最外层轮廓。
  • cv2.RETR_LIST:检测所有轮廓,不建立层级关系。
  • cv2.RETR_TREE:检测所有轮廓,并构建完整层级关系。

method:轮廓的近似方法:

  • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
  • cv2.CHAIN_APPROX_SIMPLE:只存储必要的轮廓点,压缩水平和垂直冗余点。

返回值:

  • contours:检测到的轮廓列表,每个轮廓是一个 Numpy 数组。
  • hierarchy:每个轮廓的层级关系。

2.3 代码示例

python 复制代码
import cv2

# 读取图像并转为灰度图
image = cv2.imread('D:\\resource\\filter\\find_contours.png', cv2.IMREAD_GRAYSCALE)

# 二值化
_, binary_img = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)

# 轮廓查找
#contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(contours)

# 显示图像 
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例说明:

  • 当前示例使用的图像为:白色背景,中间画了一个黑色的矩形。
  • 用win11自带的画图软件画出来的,并非纯粹的黑白图像,在代码中最好进行二值化处理
  • 该示例的作用是将图像中所有轮廓的必要点打印出来。

2.4 运行结果

打印结果显示的是:图像必要的轮廓点。

该图像包含2个轮廓 :

  • 最外层的白色背景边框。
  • 中间黑色矩形边框。

3. 绘制图像轮廓

OpenCV 提供了 cv2.drawContours() 函数用于绘制轮廓。

3.1 接口定义

python 复制代码
cv2.drawContours(image, contours, contourIdx, color, thickness)

3.2 参数说明

image:目标图像,轮廓将绘制在此图像上。

contours:轮廓数据,cv2.findContours() 的输出。

contourIdx:指定绘制的轮廓索引:

  • -1:绘制所有轮廓。
  • >=0:绘制特定索引的轮廓。

color:绘制轮廓的颜色(BGR 格式)。

thickness:线条粗细,-1 表示填充轮廓。

3.3 代码示例

python 复制代码
import cv2

# 读取图像
image = cv2.imread('D:\\resource\\filter\\find_contours.png')

# 转为灰度图
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化
_, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)

# 轮廓查找
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
result = cv2.drawContours(image, contours, -1, (0,0,255), 2)

# 显示图像 
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例说明:

  • 依旧使用同一张图片。
  • 该示例的作用是将图像中所有的轮廓用红色的线条绘制出来,其中线条的粗细数值为2。

3.4 运行结果

将图像中所有的轮廓绘制出来:


4. 计算轮廓周长

OpenCV 提供了 cv2.arcLength() 函数计算轮廓的周长。

接口定义

python 复制代码
perimeter = cv2.arcLength(curve, closed)

参数说明

  • curve:输入轮廓点。
  • closed:布尔值,是否将轮廓视为闭合曲线。

返回值

轮廓的周长(浮点数)。


5. 计算轮廓面积

OpenCV 提供了 cv2.contourArea() 函数计算轮廓的面积。

接口定义:

python 复制代码
area = cv2.contourArea(contour)

参数说明:

  • **contour:**输入轮廓点。

返回值

轮廓的面积(浮点数)。


6. 示例:计算图像轮廓的面积与周长

示例如下:

python 复制代码
import cv2

# 读取图像
image = cv2.imread('D:\\resource\\filter\\find_contours.png')

# 转为灰度图
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二值化
_, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)

# 轮廓查找
#contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# print(contours)

# 绘制轮廓
#result = cv2.drawContours(image, contours, -1, (0,0,255), 2)

# 计算面积
area = cv2.contourArea(contours[1])
print("area=%d"%(area))

# 计算周长
len = cv2.arcLength(contours[1], True)
print("len=%d"%(len))

# 显示图像 
#cv2.imshow('image', image)
#cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例说明:

  • 依旧使用同一张图像。
  • 查找图像轮廓,取索引为1的轮廓。
  • 计算其面积与周长,并打印出来。

打印输出:

PS D:\code\opencv_python> & "D:/Program Files/Python38-32/python.exe" d:/code/opencv_python/calc_contours.py

area=35951

len=769

PS D:\code\opencv_python>

7. 应用场景

  1. 目标检测与识别:通过轮廓提取图像中的特定对象。
  2. 形状分析:计算周长、面积等几何属性。
  3. 物体测量:用于测量物体的尺寸和外观特征。
相关推荐
2301_7875528717 分钟前
console-chat-gpt开源程序是用于 AI Chat API 的 Python CLI
人工智能·python·gpt·开源·自动化
layneyao22 分钟前
AI与自然语言处理(NLP):从BERT到GPT的演进
人工智能·自然语言处理·bert
jndingxin1 小时前
OpenCV 的 CUDA 模块中用于将多个单通道的 GpuMat 图像合并成一个多通道的图像 函数cv::cuda::merge
人工智能·opencv·计算机视觉
格林威2 小时前
Baumer工业相机堡盟工业相机的工业视觉中为什么偏爱“黑白相机”
开发语言·c++·人工智能·数码相机·计算机视觉
灬0灬灬0灬2 小时前
深度学习---常用优化器
人工智能·深度学习
_Itachi__2 小时前
Model.eval() 与 torch.no_grad() PyTorch 中的区别与应用
人工智能·pytorch·python
白光白光3 小时前
大语言模型训练的两个阶段
人工智能·机器学习·语言模型
巷9553 小时前
OpenCV图像金字塔详解:原理、实现与应用
人工智能·opencv·计算机视觉
科技小E3 小时前
WebRTC实时音视频通话技术EasyRTC嵌入式音视频通信SDK,助力智慧物流打造实时高效的物流管理体系
人工智能·音视频
BioRunYiXue3 小时前
一文了解氨基酸的分类、代谢和应用
人工智能·深度学习·算法·机器学习·分类·数据挖掘·代谢组学