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

news2024/12/26 0:13:06

图像轮廓检测初学

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

1. 引言

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

2. 代码示例

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

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的混乱空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1467480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化 RAG 数据 - 用于检索增强生成的 EDA

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Visualize your RAG Data — EDA for Retrieval-Augmented Generation 原文地址:https://medi…

网络原理 - HTTP/HTTPS(5)

HTTPS HTTPS也是一个应用层协议.在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输的. 这就导致了在传输过程中出现了一些被篡改的情况. 臭名昭著的"运营商劫持" 下载一个天天动听. 未被劫持的效果,点击下载按钮,就会弹出天天动听的…

yolov5-tracking-xxxsort yolov5融合六种跟踪算法(三)--目标跟踪

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接:https://github.com/zzhmx/yolov5-tracking-xxxsort.git 先按照之前的博客配置好环境: yolov5-tracking-xxxsort yolov5融合六种跟踪算法(一)–环境配…

java医院综合信息管理云HIS系统源码(前后端分离、SaaS模式)

目录 综合管理系统 业务系统 技术框架 系统基础数据录入 系统功能介绍 云his综合管理系统 云his业务系统 门诊管理系统 住院管理系统 药房管理系统 药库管理系统 系统管理 云HIS系统分为两个大的系统:综合管理系统和业务系统 综合管理系统 由运营商、开…

【Linux】 logout命令使用

logout命令 Linux logout命令用于前登录的用户退出系统。 它会终止当前用户的会话并返回到登录界面或者重新登录。当使用logout命令时,系统会关闭所有与当前用户相关的进程和程序,并释放占用的资源。 使用logout命令可以方便地切换用户或者注销当前用…

力扣日记2.22-【回溯算法篇】47. 全排列 II

力扣日记:【回溯算法篇】47. 全排列 II 日期:2023.2.22 参考:代码随想录、力扣 47. 全排列 II 题目描述 难度:中等 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输…

AMRT3D数字孪生引擎详解

AMRT 3D数字孪生引擎介绍 AMRT3D引擎是一款融合了眸瑞科技的AMRT格式与轻量化处理技术为基础,以降本增效为目标,支持多端发布的一站式纯国产自研的CS架构项目开发引擎。 引擎包括场景搭建、UI拼搭、零代码交互事件、光影特效组件、GIS/BIM组件、实时数据…

汽水分离器——矿用分离过滤装置

去找一个奋发向上能带动你的人,去找一个像太阳一样的人,帮你晒晒全部不值一提的迷茫! 一、结构: 气水分离器又称气水分离过滤器,主要由:进口、筒体、滤芯连接件、滤芯、密封圈、阀门连接件、出气管、排水口、压力表等…

c++ qt五子棋联网对战游戏

C qt 五子棋联网对战游戏运行环境 Qt 6.6.0 (MSVC 2019 64-bit) 代码文件编码格式 ANSI txt文件编码格式 ANSI 测试用例 服务端端口被占用 通过客户端端口被占用 通过客户端连接服务端 服务端中途断开 通过客户端连接服务端 客户端中途断开 通过服务端没有启动 客户端启动…

【微服务】国内微服务生态标准-SpringCloud Alibaba

现在已经是21世纪的二十年代,在未来的很长时间,以互联网、IOT物联网为代表的分布式应用必将越来越多,大量的软件企业对掌握微服务与高可用、高性能、高并发的架构人才也必定趋之若鹜。我们可以看看现阶段针对软件架构师的招聘需求和薪资&…

12 个顶级音频转换器软件(免费)

当涉及不受支持的音乐文件时,音频文件转换器软件总是会派上用场。当您希望缩小大量大型音乐文件的大小以节省设备存储空间时,它也很有帮助。您在寻找传输音频的软件吗?好吧,请仔细选择音频转换器,因为最好的音乐转换器…

【Android安全】Windows 环境下载 Android 源码

准备环境 安装 git 安装 Python 硬盘剩余容量最好大于 100G 打开 Git Bash,用 git 克隆源代码仓库 git clone https://android.googlesource.com/platform/manifest.git //没有梯子使用清华源 git clone https://aosp.tuna.tsinghua.edu.cn/platform/manifest.git…

重大更新:GPT-4 API 现全面向公众开放!

重大更新:GPT-4 API 现全面向公众开放! 在 AIGC(人工智能生成内容)领域内,我们一直致力于跟踪和分析如 OpenAI、百度文心一言等大型语言模型(LLM)的进展及其在实际应用中的落地情况。我们还专注…

基于springboot+vue的大学生竞赛管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

布隆过滤器笔记

课程地址 布隆过滤器由一个很长的二进制向量和一系列哈希函数组成 特性:布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存在,布隆过滤器说这个数存在可能不存在。这个特性能很好地被…

ClickHouse 指南(三)最佳实践 -- 稀疏主索引

在ClickHouse主索引的实用介绍 ClickHouse release 24.1, 2024-01-30 1、简介 在本指南中,我们将深入研究ClickHouse索引。我们将详细说明和讨论: ClickHouse中的索引与传统的关系数据库管理系统有何不同ClickHouse是如何构建和使用表的稀疏主索引的什么是在Clic…

Linux-基础命令(黑马学习笔记)

Linux的目录结构 Linux的目录结构 Linux的目录结构是一个树形结构 Windows系统可以拥有多个盘符,如C盘、D盘、E盘 Linux没有盘符这个概念,只有一个根目录 /,所有文件都在它下面 Linux路径的描述方式 ● 在Linux系统中,路径之…

选择适合你的编程语言

引言 在当今瞬息万变的技术领域中,选择一门合适的编程语言对于个人职业发展和技术成长至关重要。每种语言都拥有独特的设计哲学、应用场景和市场需求,因此,在决定投入时间和精力去学习哪种编程语言时,我们需要综合分析多个因素&a…

数据结构——链表OJ题

目录 1.给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 2.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(七)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…