实战项目实现以下功能:

对图片 hua.png 进行轮廓提取,并在同一窗口中完成以下两个绘制操作:

  1. 用红色画出花的外部轮廓(即最外层轮廓)

  2. 用绿色画出该轮廓的近似多边形,其中近似精度参数 ε 设置为轮廓周长的 0.005

项目完整代码:

import cv2
hua = cv2.imread('picture/hua.png')#读取原图
hua_gray = cv2.cvtColor(hua,cv2.COLOR_BGR2GRAY)#灰度图的处理
cv2.imshow('hua_b',hua_gray)
cv2.waitKey(0)
# hua_gray=cv2.imread('hua.png',0)  #读取灰度图
ret, hua_binary = cv2.threshold(hua_gray, 240, 255, cv2.THRESH_BINARY_INV)#阈值处理为二值
cv2.imshow('hua_binary',hua_binary)
cv2.waitKey(0)
_,contours, hierarchy = cv2.findContours(hua_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  #cv2.RETR_EXTERNAL:只检测外轮廓(黑底),所有子轮廓被忽略
# _,contours, hierarchy = cv2.findContours(hua_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# sortcnt=contours[0]
print(len(contours))# image_copy = hua.copy()
# cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1,color=(0,255,0),thickness=2)
# cv2.imshow('Contours_show', image_copy)
# cv2.waitKey(0)image_copy = hua.copy()
sortcnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]  # 选取最大面积的轮廓
image_contours = cv2.drawContours(image_copy,[sortcnt],contourIdx=-1,color=(0,0,255),thickness=3)#绘制轮廓
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)epsilon = 0.005  * cv2.arcLength(sortcnt,True)        #设置近似精度   【h要<ε;ε越小,点越多,越精确】
approx = cv2.approxPolyDP(sortcnt, epsilon, True)   #对轮廓进行近似
print(sortcnt.shape)
print(approx.shape)image_contours = cv2.drawContours(image_copy,[approx],contourIdx=-1,color=(0,255,0),thickness=3)#绘制轮廓
cv2.imshow('image_contours',image_contours)
cv2.waitKey(0)

整体功能概述

此代码实现了以下核心功能:

  1. 图像预处理 → 灰度转换 + 反向二值化
  2. 轮廓检测 → 提取所有轮廓并筛选最大面积轮廓
  3. 轮廓可视化 → 绘制原始轮廓与多边形逼近结果
  4. 几何简化 → 使用 Douglas-Peucker 算法对轮廓进行多点精简

 模块 1: 图像加载与预处理

import cv2
hua = cv2.imread('picture/hua.png')          # ① 读取原图
hua_gray = cv2.cvtColor(hua, cv2.COLOR_BGR2GRAY)  # ② 转为灰度图
cv2.imshow('hua_b', hua_gray)                 # ③ 显示灰度图
cv2.waitKey(0)                               # ④ 暂停等待按键
关键点解析:
  • 灰度转换必要性:减少颜色干扰,聚焦亮度信息,提升后续二值化效果
  • cv2.COLOR_BGR2GRAY:OpenCV 默认 BGR 色彩空间,此处正确转换
  • 可视化验证:通过 imshow 确保灰度转换无误

模块 2: 二值化处理

ret, hua_binary = cv2.threshold(hua_gray, 240, 255, cv2.THRESH_BINARY_INV)  # ⑤ 反向二值化
cv2.imshow('hua_binary', hua_binary)           # ⑥ 显示二值图
cv2.waitKey(0)
关键参数详解
参数说明
thresh=240阈值像素值 >240 → 设为255(白);≤240 → 设为0(黑)
maxval=255饱和值超过阈值时的赋值上限
THRESH_BINARY_INV反向模式关键! 将高亮区域变为黑色背景,低亮区域变为白色前景

为何选择反向模式?
如果花朵主体比背景更暗(常见情况),正向二值化会使背景变白,导致轮廓断裂。反向模式可保留暗色前景的完整性。

模块 3: 轮廓检测

_, contours, hierarchy = cv2.findContours(hua_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # ⑦ 检测所有轮廓
print(len(contours))                                                                    # ⑧ 输出轮廓数量
核心概念解析
  1. 三个返回值

    • _:忽略的 retval(通常无用)
    • contours:存储所有轮廓点的列表(每个轮廓是一个 numpy 数组)
    • hierarchy:轮廓层级关系矩阵(父子兄弟关系)
  2. 关键参数

    • cv2.RETR_TREE:检索所有轮廓并建立完整层级树(包括嵌套轮廓)
    • cv2.CHAIN_APPROX_SIMPLE:压缩水平/垂直方向连续点,仅保留端点

典型轮廓数量:若输出 n,表示检测到 n 个独立轮廓(含嵌套结构)


模块 4: 筛选最大面积轮廓

image_copy = hua.copy()                                  # ⑨ 创建原图副本用于绘图
sortcnt = sorted(contours, key=cv2.contourArea, reverse=True)[0]  # ⑩ 按面积降序排序,取最大轮廓
关键操作
  • cv2.contourArea():计算单个轮廓的面积(像素数)
  • sorted(..., reverse=True):按面积从大到小排序
  • [0]:取排序后的第一个元素(最大面积轮廓)

注意事项
如果图像存在多个相似大小的物体,此方法可能无法稳定选取目标。建议结合位置/形状特征进一步过滤。


模块 5: 绘制原始轮廓

image_contours = cv2.drawContours(image_copy, [sortcnt], contourIdx=-1, color=(0,0,255), thickness=3)  # ⑪ 绘制红色轮廓
cv2.imshow('image_contours', image_contours)                                                 # ⑫ 显示结果
cv2.waitKey(0)
绘图参数详解
参数说明
imageimage_copy在原图副本上绘制
contours=[sortcnt]仅绘制最大轮廓注意传入的是单元素列表
contourIdx=-1绘制全部层级-1 表示绘制轮廓的所有层级
color=(0,0,255)纯红色BGR 格式
thickness=3线宽较大的线宽使轮廓更醒目

模块 6: 多边形逼近(几何简化)

epsilon = 0.005 * cv2.arcLength(sortcnt, True)      # ⑬ 计算近似精度(基于轮廓周长)
approx = cv2.approxPolyDP(sortcnt, epsilon, True)    # ⑭ 执行多边形逼近
print(sortcnt.shape)                                 # ⑮ 输出原始轮廓点数
print(approx.shape)                                # ⑯ 输出逼近后点数
 核心算法解析
  1. 近似精度计算

    • cv2.arcLength(sortcnt, True):计算轮廓总长度(闭合路径)
    • epsilon = 0.005 * 周长:控制逼近误差容忍度(经验值)
    • 原理:ε 越小,保留的细节越多;越大,简化程度越高
  2. Douglas-Peucker 算法

    • 递归删除偏离直线距离小于 ε 的中间点
    • closed=True:保证首尾相连形成闭合多边形

点数对比示例
假设原始轮廓有 1000 个点 → 逼近后可能只剩 10-20 个顶点,大幅减少数据量


模块 7: 绘制逼近轮廓

image_contours = cv2.drawContours(image_copy, [approx], contourIdx=-1, color=(0,255,0), thickness=3)  # ⑰ 绘制绿色逼近轮廓
cv2.imshow('image_contours', image_contours)                                                # ⑱ 显示结果
cv2.waitKey(0)
可视化对比
颜色含义特点
红色原始轮廓显示实际边缘细节
绿色多边形逼近结果展示几何简化后的顶点分布

应用场景
可用于形状识别(如判断是否为多边形)、尺寸测量、碰撞检测等需要简化几何表示的场景


 常见问题与优化建议

  1. 二值化失效怎么办?

    • 调整阈值(尝试 127 或自适应阈值 adaptiveThreshold
    • 添加高斯模糊去噪:blurred = cv2.GaussianBlur(hua_gray, (5,5), 0)
  2. 轮廓断裂如何处理?

    • 提高阈值使前景更连贯
    • 使用形态学操作连接断开部分:kernel = np.ones((3,3), np.uint8); closed = cv2.morphologyEx(hua_binary, cv2.MORPH_CLOSE, kernel)
  3. 多目标场景改进方案

    # 过滤小面积噪声
    min_area = 100  # 根据实际调整
    valid_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area]
    

完整流程总结

读取图像 → 灰度转换 → 反向二值化 → 检测所有轮廓 → 筛选最大轮廓 → 绘制原始轮廓 → 多边形逼近 → 绘制简化轮廓

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源鸿蒙北向框架开发:系统服务理论详解

系统服务的启动 基本可以认为:OpenHarmony 的系统服务进程都是“由 init 直接或间接拉起”的。 直接方式: init 按 /system/etc/init/.cfg 启动可执行(如 /system/bin/sa_main、/system/bin/samgr 等),这些进程的 PPid…

龙虎榜——20250909

上证指数今天缩量收阴线,跌破10日均线,目前日线总体处于高位宽幅震荡中,小级别暂未明确方向,指数面临方向选择,需要注意高位股的风险。 深证指数今天缩量收阴线,跌破5日均线,接下来几天方向的选…

基于dijkstra算法的WSN网络MAC协议matlab仿真,分析网络延迟与网络开销

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.完整程序 1.程序功能描述 无线传感器网络(WSN, Wireless Sensor Network)是由大量低成本、低功耗的传感器节点组成,通过无线通信实现数据采集、传输与…

ES数据库启动时可以设置1G一下内存吗

可以,但强烈不建议在生产环境中这样做。ES 7.0 版本确实可以设置小于 1GB 的堆内存,但这会带来严重的性能问题和稳定性风险。 快速回答 # 最小化配置示例 - 仅用于测试或开发环境 export ES_JAVA_OPTS"-Xms512m -Xmx512m" ./bin/elasticsearch…

TI-92 Plus计算器:单位换算功能介绍

1 TI-92 Plus计算器:单位换算功能介绍 TI-92 Plus 内置了全面的单位换算功能,支持长度、质量、时间、温度、面积、体积、速度等数十种物理量的单位转换,操作直观,无需手动输入换算系数。以下是具体使用方法、示例及功能特点&#…

雪球科技Java开发工程师笔试题

单选 1.下列哪些语句关于内存回收的说明是正确的?( C ) A.内存回收程序允许程序员直接释放内存 B.程序员必须创建一个线程来释放内存 C.内存回收程序负责释放无用内存 D.内存回收程序可以在指定的时间释放内存对象 2.以下哪项不是Java基础类型(A) A.String B.int C.b…

NV3041A-01芯片屏幕

1. 核心概览这是一款集成了电源管理、显示内存(RAM)、时序控制等多种功能的单片显示驱动芯片(通常称为Driver IC)。它采用COG(Chip-On-Glass) 工艺,直接将芯片绑定在玻璃基板上,使得…

aiagent知识点

一、MCP (Model Context Protocol) 1. 核心概念是什么:MCP是一个开放协议,用于在应用(如IDE、Agent) 和工具/数据源(如服务器、数据库) 之间建立标准化的通信。目标:解决AI工具生态的碎片化问题…

第2节-过滤表中的行-WHERE

摘要:在本教程中,您将学习如何使用 PostgreSQL 的 WHERE 子句来筛选表中的行。 PostgreSQL WHERE 子句 SELECT FROM 语句从表中所有行的一个或多个列中查询数据。实际上,你经常需要选择满足某个条件的行。 要根据条件从表中筛选行&#xf…

IACheck赋能AI环评报告审核,推动环保设备制造行业发展

在“双碳目标”和绿色制造的背景下,环保设备制造行业正在迎来快速发展。然而,环评报告作为项目合规的“通行证”,却一直是企业最头疼的环节之一:编写复杂、审核周期长、错误率高。传统的审核模式不仅耗时耗力,还容易出…

常见的多态

一、核心概念多态(Polymorphism) 的字面意思是“多种形态”。在Java中,它指的是:同一个行为(方法)具有多个不同表现形式或形态的能力。更具体地说,它允许你:父类的引用指向子类的对象…

20250909_排查10.1.1.190档案库房综合管理系统20250908备份缺失问题+优化scp脚本(把失败原因记录进日志)并测试脚本执行情况

目录 一、现象(图中现象) 二、可能原因 1、本地源文件没生成(最可能原因) 2、清理逻辑误删 三、时间同步检查 1、运行命令查看当前时间源:w32tm /query /source 2、修改为内网 NTP 服务器 10.1.10.251: 四、脚本优化 1、scp.bat vs roboscp.bat 对比表 2、robo…

OpenHarmony之有源NFC-connected_nfc_tag模块详解

1. 模块概述 Connected NFC Tag模块是OpenHarmony NFC子系统的一部分,专门用于处理有源NFC标签的读写操作。与基础NFC模块不同,该模块专注于与已连接的有源NFC标签进行交互,提供更高层次的API供应用层使用。 设备必须具备有源NFC标签芯片,才能使用有源NFC标签的读和写服务…

MySql案例详解之事务

下面我会从“事务是什么”→“为什么需要事务”→“事务的四大特性(ACID)”→“MySQL中怎么用事务”→“常见坑与调试技巧”→“完整实战案例(含代码、输出、讲解)”六个层次,给你一个“看完就能上手”的MySQL事务速查…

Linux之环境变量(内容由浅入深,层层递进)

一、概念介绍(来源:比特就业课)环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数环境变量通常具有某些特殊用途,并且在系统中通常具有全局特性二、现象引入与解答 1.为什么像ls这样的系统指令可以直接执行&#x…

监控 Linux 服务器资源

使用 Bash 脚本监控 Linux 服务器资源并发送告警邮件前言一、🛠️ 脚本功能概览二、 📜 脚本核心逻辑分解2.1. 变量初始化2.2. CPU 使用率监控2.3. 内存使用率监控2.4. 磁盘使用率监控2.5. 磁盘 IO 延迟监控(await)2.6. 网络流量监…

随机获取数组内任意元素

Math.random() * arr.length 是 JavaScript 中常用的表达式,用于生成一个范围在 [0, arr.length) 之间的随机浮点数(包含 0,但不包含数组长度本身)。 作用说明: Math.random() 生成一个 [0, 1) 区间的随机浮点数&#…

android studio gradle 访问不了

1.通过国内镜像站 2.通过本地部署 参考这个搞定 https://blog.csdn.net/2401_82819685/article/details/144542784

科普:企业微信的第三方应用涉及的“配置应用权限”

企业微信的第三方应用涉及“配置应用权限”,它在不同阶段含义不同:开发阶段意指应用自身所需的功能权限,安装阶段意指企业管理员对应用使用范围的控制,产生此歧义的问题,归根到低还是语言的缩写问题,设想一…

YOLOv11改进大全:从卷积层到检测头,全方位提升目标检测性能

## 1 引言YOLO(You Only Look Once)系列作为目标检测领域的重要算法,以其**高效推理**和**良好精度**赢得了广泛认可。2024年9月,Ultralytics团队正式发布了YOLOv11,在先前版本基础上引入了**多项架构改进**和**训练优…