当前位置: 首页 > news >正文

计算机视觉--Opencv(郁金香图像轮廓提取与多边形逼近)

本次项目的核心目标有两个:

一是从郁金香图像中精准提取出整束花的外部原始轮廓,排除图像中的背景杂质与无关干扰;

二是通过多边形逼近算法对原始轮廓进行简化,得到平滑的近似轮廓,同时保留郁金香的核心形状特征。

代码如下:

1. 读取图像并预处理 img = cv2.imread(r"C:\Users\LEGION\Desktop\fb312a897160f2c9036096f52dbdecf6.png") # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理(针对白色背景郁金香,阈值240提升轮廓提取精度) _, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV) # 2. 提取外部轮廓(OpenCV 3.x专属:返回3个值,下划线忽略无用的处理后图像) _, contours, hierarchy = cv2.findContours( thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) if len(contours) == 0: raise ValueError("未检测到图像轮廓,请调整二值化阈值或检查图像质量") # 选取面积最大的轮廓(确保是整束花的外部轮廓,排除杂质小轮廓) target_contour = max(contours, key=cv2.contourArea) # 3. 计算近似轮廓(ε=周长×0.005,符合题目要求) contour_perimeter = cv2.arcLength(target_contour, closed=True) epsilon = 0.005 * contour_perimeter approx_contour = cv2.approxPolyDP(target_contour, epsilon, closed=True) # 4. 核心:创建两个独立图像副本,分别绘制单一轮廓(避免叠加,实现分开输出) # 副本1:仅绘制红色原始外部轮廓 img_red_original = img.copy() cv2.drawContours( img_red_original, [target_contour], 0, (0, 0, 255), # OpenCV BGR格式:红色 2 # 线宽 ) # 副本2:仅绘制绿色近似轮廓 img_green_approx = img.copy() cv2.drawContours( img_green_approx, [approx_contour], 0, (0, 255, 0), # OpenCV BGR格式:绿色 2 # 线宽 ) # 5. 分开显示:两个独立窗口展示结果(可视化查看) # 窗口1:红色原始轮廓 cv2.namedWindow("Result 1: Red Original Contour", cv2.WINDOW_NORMAL) cv2.imshow("Result 1: Red Original Contour", img_red_original) # 窗口2:绿色近似轮廓 cv2.namedWindow("Result 2: Green Approx Contour", cv2.WINDOW_NORMAL) cv2.imshow("Result 2: Green Approx Contour", img_green_approx) # 6. 分开保存:两个独立文件持久化存储(可长期查看,保存在代码同级目录) cv2.imwrite('flower_red_original_contour.png', img_red_original) cv2.imwrite('flower_green_approx_contour.png', img_green_approx) # 打印保存提示 print("分开保存完成,文件路径:") print("1. 红色原始轮廓:flower_red_original_contour.png") print("2. 绿色近似轮廓:flower_green_approx_contour.png") # 等待按键输入后关闭所有显示窗口 cv2.waitKey(0) cv2.destroyAllWindows()

注释:

二值化处理:二值化处理是将灰度图像转换为只有黑色和白色两种像素值的图像,这样能够突出目标物体与背景的边界,方便后续轮廓提取。我们使用cv2.threshold()函数进行二值化处理,该函数有四个核心参数:

  • 第一个参数:待二值化的灰度图像(gray);

  • 第二个参数:阈值(240),本次实战中郁金香图像的背景是白色,像素值接近 255,郁金香本身的像素值低于 240,因此选择 240 作为阈值能够很好地区分郁金香和背景

  • 第三个参数:最大值(255),当像素值超过阈值(或低于阈值,取决于二值化类型)时,将其设置为该最大值;

  • 第四个参数:二值化类型(cv2.THRESH_BINARY_INV),表示反向二值化,即像素值低于阈值的设置为 255(白色),高于阈值的设置为 0(黑色)。这样处理后,郁金香会变成白色,背景会变成黑色,更符合 OpenCV 轮廓提取的要求。

cv2.findContours()函数有三个核心参数:

  • 第一个参数:二值化图像(thresh);

  • 第二个参数:轮廓检索模式(cv2.RETR_EXTERNAL),表示只提取最外层的轮廓,忽略内部的子轮廓,这正是我们需要的郁金香外部轮廓;

  • 第三个参数:轮廓逼近方法(cv2.CHAIN_APPROX_SIMPLE),表示压缩轮廓点,只保留轮廓的关键点(如直线的端点、曲线的拐点),能够大幅减少轮廓点的数量,节省内存空间。

运行结果:

(红色的为原始轮廓,绿色的为近似轮廓)

将两个图像的结果放在成同一张图上

代码如下:

'''郁金香图像的轮廓提取、轮廓近似(多边形逼近)- 结果合并在同一张图中''' import cv2 # 1. 读取图像并预处理 img = cv2.imread(r"C:\Users\LEGION\Desktop\fb312a897160f2c9036096f52dbdecf6.png") # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理(针对白色背景郁金香,阈值240提升轮廓提取精度) _, thresh = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV) # 2. 提取外部轮廓(OpenCV 3.x专属:返回3个值,下划线忽略无用的处理后图像) _, contours, hierarchy = cv2.findContours( thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) if len(contours) == 0: raise ValueError("未检测到图像轮廓,请调整二值化阈值或检查图像质量") # 选取面积最大的轮廓(确保是整束花的外部轮廓,排除杂质小轮廓) target_contour = max(contours, key=cv2.contourArea) # 3. 计算近似轮廓(ε=周长×0.005,符合题目要求) contour_perimeter = cv2.arcLength(target_contour, closed=True) epsilon = 0.005 * contour_perimeter approx_contour = cv2.approxPolyDP(target_contour, epsilon, closed=True) # 4. 核心:创建单个图像副本,在同一张图上绘制两种轮廓(红色原始+绿色近似) img_combined = img.copy() # 仅创建一个图像副本,用于合并两种轮廓 # 先绘制红色原始外部轮廓 cv2.drawContours( img_combined, [target_contour], 0, (0, 0, 255), # OpenCV BGR格式:红色 2 # 线宽 ) # 再绘制绿色近似轮廓(在同一个副本上叠加绘制) cv2.drawContours( img_combined, [approx_contour], 0, (0, 255, 0), # OpenCV BGR格式:绿色 2 # 线宽 ) # 5. 可视化展示:单个窗口展示合并结果 cv2.namedWindow("Result: Red Original Contour + Green Approx Contour", cv2.WINDOW_NORMAL) cv2.imshow("Result: Red Original Contour + Green Approx Contour", img_combined) # 6. 保存结果:单个文件保存合并后的图像 cv2.imwrite('flower_combined_contours.png', img_combined) # 打印保存提示 print("合并结果保存完成,文件路径:") print("合并轮廓图像:flower_combined_contours.png") # 等待按键输入后关闭所有显示窗口 cv2.waitKey(0) cv2.destroyAllWindows()

轮廓叠加绘制:在img_combined上先调用cv2.drawContours()绘制红色原始轮廓,再调用一次该函数绘制绿色近似轮廓,OpenCV 会自动将两种轮廓叠加在同一张图上,红色和绿色对比清晰,能直观看到轮廓近似的简化效果。

运行结果:

http://www.jsqmd.com/news/313539/

相关文章:

  • 陨落的天才
  • Clawedbot 完整对接飞书教程 手把手搭建你的专属 AI 助手
  • 免费公众号SVG互动怎么制作,新手学这几个SVG公众号编辑器就够了?
  • 你不是没能力,是没选对赛道:测试人转型AI的3个黄金入口
  • 2026主管技师备考书籍怎么选?三阶段核心资料规划与实战指南
  • 2026 年主管护师网络课程推荐:主流机构对比
  • 双口USB-C接口ESD管共用一颗防护够用吗?
  • 2026铜母线采购全攻略:源头厂家、知名品牌与深度盘点
  • 主管技师备考核心书籍推荐,如何适配不同基础考生实现高效提分?
  • Mybatis多表查询,从“学”到“不会”
  • Java 大视界 -- Java 大数据在智慧养老服务需求分析与个性化服务匹配中的应用 - 实践
  • 尝试使用 Kimi 生成网页
  • 26年寒假生活指导1.28
  • 洗发水防脱生发哪个牌子好,口碑好的洗发水品牌,好用的防脱生发洗发水推荐
  • 2026长沙GEO服务商推荐:实测TOP5榜单及核心竞争力解析
  • 2026年电力施工仪器推荐:六氟化硫气体检测仪品牌榜单
  • 2026扬州办公设备租赁优质服务商推荐榜
  • 2026问题肌护理优质品牌推荐榜 云兮颜专业之选
  • 2026年辅酶Q10品牌核心优势深度盘点与推荐:解码细胞级靶向抗衰的科技突围
  • 高维向量空间的加法|Transformer的位置向量
  • 机器学习模型部署:将模型转化为Web API
  • Jupyter Notebook/Lab使用技巧大全
  • Python迭代器(Iterator)揭秘:for循环背后的故事
  • 自动化与脚本
  • 实时操作系统中的C++
  • Python性能优化技巧:让你的代码飞起来
  • 将Python Web应用部署到服务器(Docker + Nginx)
  • 嵌入式C++实时内核
  • 225_尚硅谷_类型断言最佳实践(2)
  • iso 22301认证/iso 27001认证/iso 5001认证/iso认证/企业做认证/特种设备充装许可证/选择指南