图像轮廓检测与绘制:OpenCV 实战指南

目录

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

[2. 寻找轮廓](#2. 寻找轮廓)

[2.1 图像预处理](#2.1 图像预处理)

[2.2 cv2.findContours() 函数](#2.2 cv2.findContours() 函数)

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

[2.4 效果](#2.4 效果)

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

示例代码

效果

[4. 实际应用](#4. 实际应用)

总结


在图像处理和计算机视觉中,轮廓检测是一种非常重要的技术。轮廓可以被看作是物体的边界,通过检测轮廓,我们可以提取物体的形状信息,进而实现目标识别、分割等任务。本文将详细介绍如何使用 OpenCV 进行图像轮廓的检测和绘制。

1. 什么是轮廓?

轮廓是一系列相连的点组成的曲线,它代表了物体的基本外形。与边缘不同,轮廓是连续的,而边缘可能并不连续。轮廓主要用于分析物体的形态,例如计算物体的周长和面积等。简单来说,轮廓可以帮助我们更好地理解图像中物体的形状。

2. 寻找轮廓

在 OpenCV 中,我们使用 cv2.findContours() 函数来寻找轮廓。这个函数的原理比较复杂,但我们可以简单理解为它会遍历图像中的像素,找到边界点并将它们连接起来形成轮廓。

2.1 图像预处理

在寻找轮廓之前,我们需要对图像进行预处理,包括灰度化和二值化。这是因为轮廓检测需要在二值图像上进行,这样可以更清晰地识别边界。

python 复制代码
import cv2

# 读取图像
img = cv2.imread('./opencv_work/src/num.png')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 进行二值化处理
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

2.2 cv2.findContours() 函数

cv2.findContours() 函数的原型如下:

python 复制代码
contours, hierarchy = cv2.findContours(image, mode, method)
  • image:输入的二值化图像。

  • mode:轮廓的检索模式,常用的有:

    • cv2.RETR_EXTERNAL:只检测最外层的轮廓。

    • cv2.RETR_LIST:检测所有轮廓,但不建立轮廓之间的层次关系。

    • cv2.RETR_TREE:检测所有轮廓,并建立轮廓之间的层次关系。

  • method:轮廓的表示方法,常用的有:

    • cv2.CHAIN_APPROX_SIMPLE:只存储轮廓的顶点信息,减少冗余点。

    • cv2.CHAIN_APPROX_NONE:存储所有轮廓点。

2.3 示例代码

python 复制代码
import cv2

# 读取图像
img = cv2.imread('./opencv_work/src/num.png')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 进行二值化处理
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

# 寻找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 打印轮廓数量
print(f"Number of contours found: {len(contours)}")

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

# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Binary Image', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.4 效果

运行上述代码后,我们可以在原始图像上看到检测到的轮廓。cv2.findContours() 函数会返回轮廓的坐标列表,我们可以通过 cv2.drawContours() 函数将这些轮廓绘制出来。

3. 绘制轮廓

找到轮廓后,我们可以使用 cv2.drawContours() 函数将轮廓绘制到图像上。这个函数的原型如下:

python 复制代码
cv2.drawContours(image, contours, contourIdx, color, thickness)
  • image:要绘制轮廓的目标图像。

  • contours:轮廓列表。

  • contourIdx :要绘制的轮廓索引。如果设为 -1,则绘制所有轮廓。

  • color:轮廓的颜色,BGR 格式。

  • thickness:轮廓的线宽,如果是负数,则填充轮廓内的区域。

示例代码

python 复制代码
import cv2

# 读取图像
img = cv2.imread('./opencv_work/src/num.png')

# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 进行二值化处理
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

# 寻找轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

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

# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Binary Image', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果

运行上述代码后,我们可以在原始图像上看到绿色的轮廓。这些轮廓清晰地勾勒出了图像中物体的形状。

4. 实际应用

轮廓检测在许多实际应用中都非常有用,例如:

  • 目标识别:通过轮廓可以识别出图像中的物体。

  • 图像分割:将图像中的物体与背景分离。

  • 形状分析:计算物体的周长、面积等特征。

总结

本文介绍了如何使用 OpenCV 进行图像轮廓的检测和绘制。通过灰度化、二值化和轮廓检测,我们可以提取图像中物体的形状信息,并通过绘制轮廓将其可视化。希望本文对你有所帮助!如果你有任何问题或需要进一步的解释,请随时留言。

相关推荐
TTGGGFF1 小时前
机器视觉:智能车大赛视觉组技术文档——用 YOLO3 Nano 实现目标检测并部署到 OpenART
人工智能·目标检测·计算机视觉
CodeJourney.1 小时前
Python开发可视化音乐播放器教程(附代码)
数据库·人工智能·python
强德亨上校1 小时前
神经网络详解
人工智能·深度学习·神经网络
视***间1 小时前
275TOPS算力边缘计算盒子的价值洞察与市场定位---视程空间
人工智能·边缘计算
AI模块工坊1 小时前
AAAI 2025 | 即插即用,川大Mesorch刷新SOTA,用「介观」Transformer架构终结图像造假
人工智能·深度学习·计算机视觉·架构·transformer
周杰伦_Jay1 小时前
【OpenManus深度解析】MetaGPT团队打造的开源AI智能体框架,打破Manus闭源壁垒。包括架构分层、关键技术特点等内容
人工智能·深度学习·opencv·架构·开源
文火冰糖的硅基工坊2 小时前
[嵌入式系统-146]:五次工业革命对应的机器人形态的演进、主要功能的演进以及操作系统的演进
前端·网络·人工智能·嵌入式硬件·机器人
猫头虎2 小时前
openAI发布的AI浏览器:什么是Atlas?(含 ChatGPT 浏览功能)macOS 离线下载安装Atlas完整教程
人工智能·macos·chatgpt·langchain·prompt·aigc·agi
老六哥_AI助理指南2 小时前
为什么AI会改变单片机的未来?
人工智能·单片机·嵌入式硬件
SEO_juper2 小时前
2026 AI可见性:构建未来-proof策略的顶级工具
人工智能·搜索引擎·百度·工具·数字营销