【Python】OpenCV-图像轮廓检测初学

图像轮廓检测初学

在图像处理领域中,轮廓检测是一项重要的任务,用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测,并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。

1. 引言

图像轮廓检测是图像处理中的一项关键技术,可用于检测物体的形状、边界等信息。在本文中,我们将演示如何使用OpenCV进行图像轮廓检测,并通过示例代码展示这一过程。

2. 代码示例

以下是一个使用OpenCV的示例代码,演示了图像轮廓检测的过程:

python 复制代码
import cv2
import numpy as np

# 读取图像
src_img = cv2.imread("demo.png") # 例如简单的5个英文验证码图片

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

# 阈值化处理,生成二值图像
thresh, img = cv2.threshold(img, 190, 255, cv2.THRESH_BINARY)  # 白底黑字
print("阈值1:", thresh)

thresh, img = cv2.threshold(img, 190, 255, cv2.THRESH_BINARY_INV)  # 黑底白字
print("阈值2:", thresh)

thresh, img = cv2.threshold(img, 1, 255, cv2.THRESH_OTSU)  # 自动寻找阈值
print("自动阈值:", thresh)

# 膨胀操作,填充小的空洞(去掉周围的点点)
kernel = np.ones([5, 5])
img = cv2.dilate(img, kernel)

# 腐蚀操作,消除噪声(把有用的英文扩大)
kernel = np.ones([7, 7])
img = cv2.erode(img, kernel)

# 寻找图像轮廓
contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 计算轮廓面积
areas = []
for c in contours:
    area = cv2.contourArea(c)
    areas.append(area)
areas = np.array(areas)
print("轮廓面积:", areas)

# 获取面积最大的5个轮廓
index = np.argsort(areas)[-6:-1] # 不是[-5:],因为最大的面积是边框 
print("前5个轮廓的索引:", index)

# 提取前5个轮廓
top5_contours = []
for i in range(5):
    top5_contours.append(contours[index[i]])

# 在原图上绘制矩形框
for c in top5_contours:
    # 获取矩形框坐标
    x, y, w, h = cv2.boundingRect(c)
    # 绘制矩形框
    cv2.rectangle(src_img, [x, y, x + w, y + h], [0, 0, 255], 2)

# 显示结果图像
cv2.imshow("demo", src_img)
cv2.waitKey(0)
  • 原图
  • 识别并画框

3. 代码解释

3.1 图像预处理

首先,读取图像并将其转换为灰度图像。接着,通过阈值化处理得到二值图像,其中包括白底黑字和黑底白字两种处理方式。

3.2 形态学操作

通过膨胀(dilate)和腐蚀(erode)操作,对图像进行形态学处理,以填充小的空洞并消除噪声。

3.3 轮廓检测

使用OpenCV的findContours函数寻找图像中的轮廓,并计算每个轮廓的面积。

3.4 提取前5个轮廓

通过面积排序,提取前5个面积最大的轮廓。

3.5 绘制矩形框

在原图上绘制包围每个轮廓的矩形框,以突显检测到的物体。

4. 结论

通过上述代码示例,我们演示了如何使用OpenCV进行图像轮廓检测,并通过一系列预处理操作找到并突显图像中的主要物体。轮廓检测在计算机视觉和图像处理中有着广泛的应用,可用于目标检测、图像分割等任务。详细的注释帮助理解代码的每一步操作,为初学者提供了一个学习的起点。

代码参考源自:Shady的混乱空间

相关推荐
云姜.3 分钟前
java抽象类和接口
java·开发语言
nLsUCWFJR11 分钟前
(Matlab)基于贝叶斯优化卷积双向长短期记忆网络(CNN-BiLSTM)回归预测
opencv
xyq202412 分钟前
Pandas 安装指南
开发语言
xixixin_22 分钟前
【JavaScript 】从 || 到??:JavaScript 空值处理的最佳实践升级
开发语言·javascript·ecmascript
玩大数据的龙威25 分钟前
农经权二轮延包—各种地块示意图
python·arcgis
ZH154558913127 分钟前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep36 分钟前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手36 分钟前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
m0_7369191037 分钟前
C++中的委托构造函数
开发语言·c++·算法
喵手1 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出