【python】OpenCV—Extreme Points in the Contour

news2024/11/12 17:56:23

在这里插入图片描述

文章目录

  • 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.coloradmin.cn/o/1939434.html

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

相关文章

【python】错误 SyntaxError: invalid syntax的解决方法总结

【python】错误 SyntaxError: invalid syntax的解决方法总结 在Python编程中,SyntaxError: invalid syntax是一个常见的错误,通常表示Python解释器在尝试解析代码时遇到了语法错误。这种错误可能由多种原因引起,包括拼写错误、缺少关键字、不…

区间加减使得数组变成指定类型

这个问题要怎么去考虑呢,首先我们将两个数组做差得到相对大小,问题就变成了把我们构造的数组通过区间加一或者区间减一变成全部都是0的最小次数 这里就涉及到我们的一个技巧,我们需要把负数序列和正数序列分开处理,如何能得到最小…

SpringCloud的认识和初步搭建

目录 一.认识SpringCloud 二.SpringCloud的部署 2.1开发环境 2.2数据库的建立 2.3SpringCloud的部署 第一步: 创建Maven项目 第二步:完善pom文件 第三步:创建两个子项目 第四步:声明项目依赖以及构建插件 第五步&#xf…

vue2集成markdown编辑器及前台渲染

效果展示 后台编辑器 前台渲染 后台编辑器步骤 安装包 npm i kangc/v-md-editor -Smain.js里全局注册 编辑器VueMarkdownEditor组件 import Vue from vue; import VueMarkdownEditor from kangc/v-md-editor; import kangc/v-md-editor/lib/style/base-editor.css; im…

Docker核心技术:应用架构演进

云原生学习路线导航页(持续更新中) 本文是 Docker核心技术 系列文章:应用架构演进,其他文章快捷链接如下: 应用架构演进(本文)容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 1.1.架…

matlab simulink气隙局部放电仿真技术研究

1、内容简介 略 87-可以交流、咨询、答疑 2、内容说明 略 为了解决目前国内外局部放电仿真方法难以计算气隙局部放电暂态过程的问题 , 利用 MATLAB (SIMULINK ) 的公共模块库和电力系统专业模块库 , 根据单气隙局部放电仿真物理模型 , 构造了气隙局部放 电仿真计算的电…

进程间通信——共享内存,信号量,信号

进程 VS 线程通信 进程:共享内存,消息队列,管道,信号(条件变量,锁,信号量需要搭配共享内存使用); 线程:信号,条件变量,锁&#xff0c…

C语言·分支和循环语句(超详细系列·全面总结)

前言:Hello大家好😘,我是心跳sy,为了更好地形成一个学习c语言的体系,最近将会更新关于c语言语法基础的知识,今天更新一下分支循环语句的知识点,我们一起来看看吧~ 目录 一、什么是语句&#xf…

C语言航空售票系统

以下是系统部分页面 以下是部分源码&#xff0c;需要源码的私信 #include<stdio.h> #include<stdlib.h> #include<string.h> #define max_user 100 typedef struct ft {char name[50];//名字char start_place[50];//出发地char end_place[50];//目的地char …

【专项刷题】— 归并

1、排序数组 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 先找一个中间值&#xff0c;然后递归左边部分和递归右半部分直到左边和右边只剩一个数了就返回&#xff0c;然后再合并左右两个部分代码&#xff1a; class Solution {int[] tmp;public int[] sortArray(…

canvas:矢量点转栅格

案例描述 ArcGIS提供了“点转栅格”的工具,可以将矢量点转换为栅格数据,以下尝试基于canvas绘图技术,实现经纬度矢量点转换为canvas栅格数据,并在Cesium.js三维地图中进行渲染。 原始数据 转出栅格 案例分析 实现的关键点在于:如何将经纬度坐标与canvas画布坐标进…

Java代码基础算法练习-三角形判断-2024.07.21

任务描述&#xff1a; 解决思路&#xff1a; 一个函数&#xff0c;带入输入的三个边长参数&#xff0c;条件满足计算其周长、面积&#xff0c;否则不计算 代码示例&#xff1a; package a4_2024_07;import java.util.Scanner;public class j240721_2 {public static void mai…

Pytorch学习笔记【B站:小土堆】

文章目录 1 基础环境配置&#xff08;CPU版&#xff09;2 PyTorch学习2.1 Dataset和DataLoader2.1.1 Dataset2.1.2 DataLoader 2.2 Tensorboardadd_scalaradd_imageadd_graph 2.3 Transforms2.3.1 ToTensor2.3.2 Normalize2.3.3 Resize2.3.4 Compose 2.4 torchvision中的数据集…

MQTTX连接华为云IoTDA

目录 华为IoTDA平台 MQTTX连接参数的设置 物模型的构建 属性上报 基本数据格式 时戳 我以前上课都是用巴法云服务器来演示MQTT的&#xff0c;前几天因为测试工业互联网关使用了华为的IoTDA&#xff0c;觉得也不算太复杂&#xff0c;今天尝试用MQTTX连接华为云&#xff0c…

NLP: 词袋模型和TFIDF模型

文章目录 词袋模型TF-IDF模型词汇表模型 词袋模型 文本特征提取有两个非常重要的模型&#xff1a; 词集模型&#xff1a;单词构成的集合&#xff0c;集合自然每个元素都只有一个&#xff0c;也即词集中的每个单词都只有一个。 词袋模型&#xff1a;在词集的基础上如果一个单词…

DDPM扩散模型(模型结构图与公式推导)

DDPM扩散模型 一、前置知识 1. 条件概率知识 P ( A ∣ B ) P ( A B ) P ( B ) P(A|B) \frac{P(AB)}{P(B)} P(A∣B)P(B)P(AB)​ P ( A B C ) P ( C ∣ B A ) P ( B A ) P ( C ∣ B A ) P ( B ∣ A ) P ( A ) P(A B C) P(C|B A)P(BA) P(C|B A)P(B|A)P(A) P(ABC)P(C∣BA)P…

Java | 自制AWT单词猜一猜小游戏(测试版)

目录 游戏标题 开发过程 开发想法 技术栈 代码呈现 导包 核心代码 游戏标题 探索知识的迷宫&#xff0c;体验自制AWT单词猜一猜小游戏 在数字时代&#xff0c;学习可以是多彩的&#xff0c;游戏可以是智慧的。我们自豪地推出“单词猜猜猜”是一款结合了教育与娱乐的自制…

NODEJS复习(ctfshow334-344)

NODEJS复习 web334 下载源码代码审计 发现账号密码 代码逻辑 var findUser function(name, password){ return users.find(function(item){ return name!CTFSHOW && item.username name.toUpperCase() && item.password password; }); }; 名字不等于ctf…

2015年全国大学生数学建模竞赛B题出租车资源配置(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分源代码问题1问题3 四、完整word版论文和源代码 一、部分题目 2015高教社杯全国大学生数学建模竞赛题目 B题 “互联网”时代的出租车资源配置 出租车是市民出行的重要交通工具之一&#xff0c;“打车难”是人们关注的一个社会热点问…

【CSS in Depth 2 精译_019】3.2 CSS 的盒模型

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…