【python】OpenCV—Extreme Points in the Contour

在这里插入图片描述

文章目录

  • 1、需求描述
  • 2、功能实现
  • 3、更多的例子
  • 4、完整代码
  • 5、参考

1、需求描述

给一张图片,找出其轮廓,并画出轮廓的上下左右极值点

输入图片

在这里插入图片描述

输出效果

在这里插入图片描述

2、功能实现

# 导入必要的包
import imutils
import cv2
# 加载图像,将其转换为灰度,并稍微模糊
image = cv2.imread("6.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray.jpg", gray)

在这里插入图片描述

gray = cv2.GaussianBlur(gray, (5, 5), 0)
cv2.imwrite("GaussianBlur.jpg", gray)

在这里插入图片描述

# 对图像设置阈值,然后执行一系列腐蚀 + 膨胀以去除任何小的噪声区域
thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]
cv2.imwrite("thresh.jpg", thresh)

在这里插入图片描述

腐蚀一下

thresh = cv2.erode(thresh, None, iterations=2)
cv2.imwrite("erode.jpg", thresh)

在这里插入图片描述

thresh = cv2.dilate(thresh, None, iterations=2)
cv2.imwrite("dilate.jpg", thresh)

在这里插入图片描述

# 在阈值图像中找到轮廓,然后获取最大的一个
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
c = max(cnts, key=cv2.contourArea)# 确定轮廓的极值点
extLeft = tuple(c[c[:, :, 0].argmin()][0])
extRight = tuple(c[c[:, :, 0].argmax()][0])
extTop = tuple(c[c[:, :, 1].argmin()][0])
extBot = tuple(c[c[:, :, 1].argmax()][0])# 画出物体的轮廓,然后画出每个极值点,最左边是红色,最右边是绿色,最上面是蓝色,最下面是青色
cv2.drawContours(image, [c], -1, (0, 255, 255), 2)
cv2.circle(image, extLeft, 8, (0, 0, 255), -1)
cv2.circle(image, extRight, 8, (0, 255, 0), -1)
cv2.circle(image, extTop, 8, (255, 0, 0), -1)
cv2.circle(image, extBot, 8, (255, 255, 0), -1)
# 显示输出图像
cv2.imshow("Image", image)
cv2.imwrite("result.jpg", image)
cv2.waitKey(0)

在这里插入图片描述

3、更多的例子

输入

在这里插入图片描述
输出

在这里插入图片描述

输入

在这里插入图片描述

输出

在这里插入图片描述

只画面积最大的轮廓

输入图片

在这里插入图片描述
输出图片

在这里插入图片描述

输入图片

在这里插入图片描述
输出图片

在这里插入图片描述

去掉了腐蚀和膨胀操作,才能分割出来完整的树叶

输入图片

在这里插入图片描述

输出图片

在这里插入图片描述

注意到均为黑色背景,从第二小节详细实现来看,也能知道,白色背景效果直接扑街

4、完整代码

# 导入必要的包
import imutils
import cv2
# 加载图像,将其转换为灰度,并稍微模糊
image = cv2.imread("6.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite("gray.jpg", gray)gray = cv2.GaussianBlur(gray, (5, 5), 0)
cv2.imwrite("GaussianBlur.jpg", gray)# 对图像设置阈值,然后执行一系列腐蚀 + 膨胀以去除任何小的噪声区域
thresh = cv2.threshold(gray, 45, 255, cv2.THRESH_BINARY)[1]
cv2.imwrite("thresh.jpg", thresh)thresh = cv2.erode(thresh, None, iterations=2)
cv2.imwrite("erode.jpg", thresh)thresh = cv2.dilate(thresh, None, iterations=2)
cv2.imwrite("dilate.jpg", thresh)# 在阈值图像中找到轮廓,然后获取最大的一个
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
c = max(cnts, key=cv2.contourArea)# 确定轮廓的极值点
extLeft = tuple(c[c[:, :, 0].argmin()][0])
extRight = tuple(c[c[:, :, 0].argmax()][0])
extTop = tuple(c[c[:, :, 1].argmin()][0])
extBot = tuple(c[c[:, :, 1].argmax()][0])# 画出物体的轮廓,然后画出每个极值点,最左边是红色,最右边是绿色,最上面是蓝色,最下面是青色
cv2.drawContours(image, [c], -1, (0, 255, 255), 2)
cv2.circle(image, extLeft, 8, (0, 0, 255), -1)
cv2.circle(image, extRight, 8, (0, 255, 0), -1)
cv2.circle(image, extTop, 8, (255, 0, 0), -1)
cv2.circle(image, extBot, 8, (255, 255, 0), -1)
# 显示输出图像
cv2.imshow("Image", image)
cv2.imwrite("result.jpg", image)
cv2.waitKey(0)

5、参考

参考学习来自:imutils基础(7)使用 OpenCV 查找轮廓中的极值点

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

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

相关文章

JavaSE从零开始到精通(六) - 多态

1. 前言 现实中的多态:同一个对象在不同时刻展现出的不同形态! 编程中的多态: 对于具体的类型和调用的方法,在编程时并不确定,而是在程序运行期间才确定,这样,不用修改源程序代码,…

git rebase 和 git merge区别

# 在自己的分支feature上开发,从master上拉最新改动, # 避免自己的分支落后master git checkout feature git rebase master1. 合并方式 merge:合并操作。它会取出一个公共的祖先节点,然后尝试将两个分支从该节点开始发生的所有变化都合并到…

【网络】linux实现双网卡热备:优先走A,故障后走B

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

vue3 + antd vue 纯前端 基于xlsx 实现导入excel 转 json,将json数据转换XLSX并下载(下载模版)

一、导入 0、关键代码 // 安装插件 npm i xlsx/yarn add xlsx // 导入xlsx import * as XLSX from xlsx; 点击提交的时候才整理数据。上传的时候文件保存在 state.form.file[0] 中的 // 定义字段映射关系 const fieldMap {sheet2json: {技能名称: skill_name,技能等级: …

uni-app 影视类小程序开发从零到一 | 开源项目分享

引言 在数字娱乐时代,移动设备已成为我们生活中不可或缺的一部分,尤其是对于电影爱好者而言,随时随地享受精彩影片成为一种日常需求。爱影家,一款基于 uni-app 开发的影视类小程序,正是为此而生。它不仅提供了丰富的影…

栈的概念—函数调用

也是一块内存空间,CPU的SP寄存器指向它,可用于函数调用、局部变量、多任务系统里保存现场 每个任务都有自己的栈

【Django+Vue3 线上教育平台项目实战】购物车与订单模块的精简实现与数据安全策略

文章目录 前言一、购物车模块1.后端核心逻辑2.前端页面代码3.操作流程及演示 二、订单模块1.订单模块模型类设计1.展示订单信息a.页面展示b.前端核心代码c.后端核心逻辑 2.订单是否使用优惠券与积分a.页面展示b.前端核心代码 3.订单支付方式a.页面展示b.前端核心代码 4.提交订单…

Perl脚本的魔法:打造自定义文件系统视图

Perl脚本的魔法:打造自定义文件系统视图 在文件管理与自动化任务中,Perl以其强大的文本处理能力而闻名。通过Perl,我们可以轻松实现自定义的文件系统视图,以满足特定的需求。这不仅可以帮助我们更好地组织和访问文件,…

PyTorch Autograd内部实现

原文: 克補 爆炸篇 25s (youtube.com) 必应视频 (bing.com)https://www.bing.com/videos/riverview/relatedvideo?&qPyTorchautograd&qpvtPyTorchautograd&mid1B8AD76943EFADD541E01B8AD76943EFADD541E0&&FORMVRDGAR 前面只要有一个node的re…

北京交通大学《深度学习》专业课,实验3卷积、空洞卷积、残差神经网络实验

一、实验要求 1. 二维卷积实验(平台课与专业课要求相同) ⚫ 手写二维卷积的实现,并在至少一个数据集上进行实验,从训练时间、预测精 度、Loss变化等角度分析实验结果(最好使用图表展示) ⚫ 使用torch.nn…

Matlab基础语法篇(下)

Matlab基础语法(下) 一、逻辑基础(一)逻辑运算符(二)all、any、find函数(三)练习 二、结构基础(一)条件结构(1)if-elseif-else-end&am…

Android构建任务assemble、bundle、compile、package、install

1. assemble 开头的任务: assembleDebug:构建 debug 版本的 APK 文件。assembleRelease:构建 release 版本的 APK 文件。assembleAndroidTest:构建测试 APK 文件,用于测试应用程序。assembleAndroidTestDebug&#xf…

十、操作符详解

目录 1、操作符分类 2、二进制转换 2.1二进制转十进制 2.1.1、十进制转二进制 2.2、二进制转八进制和十六进制 2.2.1、二进制转八进制 2.2.2、二进制转十六进制 3、原码、反码、补码 4、移位操作符(移动的是二进制位) 4.1、左移操作符 4.2、右…

VMware虚拟机下安装Ubuntu(详细教程,最小系统的安装,含VMware Tools)

1.VM的下载安装 VMware的下载安装教程_vm16 pro下载-CSDN博客 2. Ubuntu 下载 在官网或者镜像站下载所需版本的.ios镜像,这个镜像在接下来的步骤中会用到: Ubuntu 22.04.4 LTS 下载 和 清华大学开源软件镜像站 - Ubuntu 22.04.4 下载 3. 创建虚拟机 […

【C语言】深入解析希尔排序

文章目录 什么是希尔排序?希尔排序的基本实现代码解释希尔排序的优化希尔排序的性能分析希尔排序的实际应用结论 在C语言编程中,希尔排序是一种高效的排序算法,是插入排序的一种更高效的改进版本。它通过比较相距一定间隔的元素来进行排序&am…

智能水果保鲜度检测:基于YOLO和深度学习的完整实现

引言 水果新鲜程度直接影响其口感和营养价值。为了提高水果品质管理的效率和准确性,本文介绍了一种基于深度学习的水果新鲜程度检测系统。该系统包括用户界面,利用YOLO(You Only Look Once)v8/v7/v6/v5模型进行水果新鲜程度检测&…

RocketMQ中概念知识点记录 和 与SpringBoot集成实现发送 同步、异步、延时、批量、tag、key、事务消息等

1. 消息模型 消息(Message): 是 RocketMQ 中数据传输的基本单位,由主题、标签、键值、消息体等组成。主题(Topic): 消息的分类,类似于邮件的主题,用于对消息进行粗粒度的分类。标签&#xff08…

Zookeeper是什么,为什么要用,怎么用?

关于Zookeeper的全面了解与应用 前言:这几天在开发过程中,遇到了zk相关的一些问题,大体先复习下 Zookeeper作为分布式系统中的协调服务,起着至关重要的角色。本篇文章将从以下几个方面详细讲解什么是Zookeeper,为什么…

【Go系列】RPC和grpc

承上启下 介绍完了Go怎么实现RESTFul api,不可避免的,今天必须得整一下rpc这个概念。rpc是什么呢,很多人都想把rpc和http一起对比,但是他们不是一个概念。RPC是一种思想,可以基于tcp,可以基于udp也可以基于…

【STM32嵌入式系统设计与开发---拓展】——1_10矩阵按键

这里写目录标题 1、矩阵按键2、代码片段分析 1、矩阵按键 通过将4x4矩阵按键的每一行依次设为低电平,同时保持其它行为高电平,然后读取所有列的电平状态,可以检测到哪个按键被按下。如果某列变为低电平,说明对应行和列的按键被按下…