【OpenCV实现平滑图像金字塔,轮廓:入门】
文章目录
- 概要
- 图像金字塔
- 轮廓:入门
概要
文章内容的概要:
平滑图像金字塔:
图像金字塔是什么?
图像金字塔是指将原始图像按照不同的分辨率进行多次缩小(下采样)得到的一系列图像。这种处理方式常用于图像处理中的多尺度分析。高斯金字塔:
使用高斯滤波器进行图像的平滑操作,然后下采样得到不同分辨率的图像,构成高斯金字塔。拉普拉斯金字塔:
拉普拉斯金字塔是由高斯金字塔图像和其高分辨率版本重建的图像差得到的,用于图像重建和图像增强。
轮廓:
轮廓检测基础:
介绍了轮廓检测的基本概念和OpenCV中相关函数的使用,包括cv2.findContours()函数。轮廓特征:
讲解了如何提取轮廓的特征,例如轮廓面积、周长、重心等,并举例说明了如何在实际应用中使用这些特征。轮廓近似:
探讨了轮廓近似的方法,包括使用Douglas-Peucker算法进行曲线近似,以及多边形逼近轮廓。轮廓匹配:
讲解了如何使用轮廓匹配来识别和匹配目标对象,包括轮廓匹配的应用示例。
图像金字塔
使用图像金字塔去创造一个新的水果,“橘果(Orapple)”
函数:cv.pyrUp(), cv.pyrDown()
通常,我们处理图像时使用的是固定分辨率。然而,在某些情况下,我们需要在不同的分辨率下处理同一张图像。例如,在搜索图像中的某些内容(如面部)时,我们无法确定对象在图像中的实际大小。因此,我们需要创建一组具有不同分辨率的相同图像,并在这些图像中搜索对象。这种具有不同分辨率的图像集被称为图像金字塔。这个术语的来源是因为当这些图像以堆叠的形式存在时,最高分辨率的图像位于底部,而最低分辨率的图像位于顶部,形象地呈现出金字塔的形状。
图像金字塔主要有两种类型:高斯金字塔和拉普拉斯金字塔。
在高斯金字塔中,低分辨率图像(较高层级)通过去除高分辨率图像(较低层级)中的连续行和列而生成。接着,用低层级中的5个像素通过加权平均形成高层级中的1个像素,权重是符合高斯分布的。通过这种操作,原始图像的大小会缩小到原来的四分之一。然后,这个过程可以继续向上层级执行,分辨率就会逐渐减小,同时图像的面积也会相应减小。相反地,如果我们从低层级向高层级执行相反的操作,图像的分辨率会逐渐增加,同时图像的面积也会增大。在OpenCV中,我们可以使用cv.pyrDown()和cv.pyrUp()函数来构建高斯金字塔。
import cv2 as cvimg = cv.imread('messi5.jpg')
higher_reso = img # 最高分辨率图像# 创建高斯金字塔(降采样)
lower_reso = cv.pyrDown(higher_reso)
以上代码中,cv.pyrDown()函数用于将higher_reso图像降低一级分辨率,结果存储在lower_reso中。

现在你可以使用函数 cv.pyrUp() 沿着图像金字塔向下移动。
higher_reso2 = cv.pyrUp(lower_reso)
需要记住的是,higher_reso2 不等于 higher_reso ,因为一旦减少了分辨率,你也丢失了信息。

图像金字塔的其中一个应用是图像混合。举例来说,在图像拼接中,你需要将两个图像堆叠在一起,但是由于图像之间的不连续性,它的结果可能并太能令人满意。在这种情况下,使用金字塔进行图像合成可以实现无缝混合,而不会在图像中留下太多数据。这方面的一个经典例子是两种水果的混合,橙子和苹果。

加载图像: 从文件中加载橙子和苹果的图像。
生成高斯金字塔: 分别为橙子和苹果的图像生成高斯金字塔,包括6个层级。生成拉普拉斯金字塔: 基于高斯金字塔,生成两幅图像的拉普拉斯金字塔。合并图像的左右部分: 将苹果的左半部分和橙子的右半部分在每个金字塔级别连接起来,得到新的金字塔。重新合成图像: 从合并后的金字塔开始,逐级向上构建图像,最终得到混合后的图像。
import cv2 as cv
import numpy as np# 从文件加载橙子和苹果的图像
A = cv.imread('apple.jpg')
B = cv.imread('orange.jpg')# 生成橙子的高斯金字塔
G = A.copy()
gpA = [G]
for i in range(6):G = cv.pyrDown(G)gpA.append(G)# 生成苹果的高斯金字塔
G = B.copy()
gpB = [G]
for i in range(6):G = cv.pyrDown(G)gpB.append(G)# 生成橙子的拉普拉斯金字塔
lpA = [gpA[5]]
for i in range(5, 0, -1):GE = cv.pyrUp(gpA[i])L = cv.subtract(gpA[i - 1], GE)lpA.append(L)# 生成苹果的拉普拉斯金字塔
lpB = [gpB[5]]
for i in range(5, 0, -1):GE = cv.pyrUp(gpB[i])L = cv.subtract(gpB[i - 1], GE)lpB.append(L)# 在每个级别上合并橙子和苹果的左右部分
LS = []
for la, lb in zip(lpA, lpB):rows, cols, dpt = la.shapels = np.hstack((la[:, 0:cols // 2], lb[:, cols // 2:]))LS.append(ls)# 从拉普拉斯金字塔重建混合后的图像
ls_ = LS[0]
for i in range(1, 6):ls_ = cv.pyrUp(ls_)ls_ = cv.add(ls_, LS[i])# 直接连接每一半的图像
real = np.hstack((A[:, :cols // 2], B[:, cols // 2:]))# 保存混合图像和直接连接图像
cv.imwrite('Pyramid_blending.jpg', ls_)
cv.imwrite('Direct_blending.jpg', real)
轮廓:入门
当处理图像时,常常需要找到图像中的特定物体或形状。这时就用到了轮廓(Contours)的概念。轮廓是一种用于表示物体形状的曲线,这些曲线由连续的点组成。
在OpenCV中,可以使用cv.findContours()函数来寻找图像中的轮廓。这个函数需要一个二值图像作为输入,所以在使用之前通常会先进行阈值处理或者边缘检测。
一旦找到了轮廓,可以使用cv.drawContours()函数将轮廓画在图像上。这个函数的参数包括源图像、轮廓列表、轮廓的索引(如果想画特定的轮廓)、颜色和线条宽度等。
在寻找轮廓时,有一个需要注意的参数是轮廓逼近方法。这个方法决定了轮廓的存储方式。如果使用cv.CHAIN_APPROX_NONE,所有的边界点都会被存储。但是在大多数情况下,并不需要所有的点,只需要表示形状的关键点。这时就可以使用cv.CHAIN_APPROX_SIMPLE,它会删除冗余的点,用更少的点来表示同样的形状,从而节省内存。
通过使用cv.findContours()和cv.drawContours(),可以在图像中找到并标识出感兴趣的物体或形状。这是图像处理中非常常用的技术,尤其在物体检测和图像识别领域。
为了更好的准确性,使用二值图像。所以在寻找轮廓之前,应用阈值法或者Canny边缘检测。
•从OpenCV3.2开始,函数findContours() 不会再去修改源图像。
•在OpenCV中,寻找轮廓就像从黑色的背景中寻找白色的物体(前景)。所以需要记住的是,需要被找到的物体得是白色的,背景需要是黑色的。
import numpy as np
import cv2 as cvim = cv.imread('img.png')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
想要绘制轮廓,使用函数 cv.drawContours 。只要有边界点,它也可用于绘制任何多边形。它的第一个参数是源图像,第二个参数是以 Python 列表传递的轮廓(译者注:上文得到的contours即可),第三个参数是轮廓索引(在绘制单个轮廓时很有用。要绘制所有轮廓,请传递 -1),其余参数是颜色、厚度等等。
•画出所有轮廓
cv.drawContours(img, contours, -1, (0, 255, 0), 3)
•只画出一个轮廓,比如第四个轮廓
cv.drawContours(img, contours, 3, (0, 255, 0), 3)
•但在大部分情况里面,下面这个写法会更好
cnt = contours[4]
cv.drawContours(img, [cnt], 0, (0, 255, 0), 3)
在图像处理中,轮廓是指相邻的具有相同颜色或者灰度强度的点所形成的边界。这些边界上的点的坐标通常以 (x, y) 形式存储。然而,在实际应用中,并不总是需要轮廓上的每一个点的信息。
举个例子,假设找到了一条直线的轮廓。在描述这条直线时,只需要知道它的两个端点的坐标,而不需要存储直线上的每一个点。这时,cv.CHAIN_APPROX_SIMPLE登场了。当传递cv.CHAIN_APPROX_SIMPLE给cv.findContours()函数时,它会智能地删除冗余的点,仅保留形状的关键点,比如端点,从而用更少的点来近似表示轮廓。这种处理方式不仅节省了内存空间,还使得后续的图像处理更加高效。
相关文章:
【OpenCV实现平滑图像金字塔,轮廓:入门】
文章目录 概要图像金字塔轮廓:入门 概要 文章内容的概要: 平滑图像金字塔: 图像金字塔是什么? 图像金字塔是指将原始图像按照不同的分辨率进行多次缩小(下采样)得到的一系列图像。这种处理方式常用于图像…...
Java JVM垃圾回收确定垃圾的两种方式,GC Root
文章目录 前言一、如何确定是垃圾?引用计数法根可达路径法 二、GC Root1、以下可作为GC Root对象2、判断可回收:GC Root不可达3、真正宣告对象死亡需经过两次标记过程(重要) 前言 对于Java两种确定对象为可回收的两种方式&#x…...
java集合之List接口实现类常用方法详解
目录 一、List集合概述 二、ArrayList类 三、ArrayList常用方法实例 四、LinkedList类 五、Linkedist常用方法实例 一、List集合概述 java.util.List接口继承自Collection接口,是单列集合的一个分支,通常将实现了List接口的对象称为List集合&#x…...
三分钟带你了解JS、原型、原型链
1.什么是JS? JavaScript是一种基于对象的脚本语言,它不仅可以创建对象,也能使用现有的对象; 它是基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式; 白话一点说就是…...
C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现
目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库): 2、活体人脸比对: 3、照片人脸核身(权威库): 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…...
LeetCode每日一题——275. H-Index II
文章目录 一、题目二、题解 一、题目 Given an array of integers citations where citations[i] is the number of citations a researcher received for their ith paper and citations is sorted in ascending order, return the researcher’s h-index. According to the…...
项目添加EZOpenSDK之后就开始报错:could not build module foundation等
最近修改一个老项目,出现了一个报错问题。困扰了很久。现在终于找到解决方法了。分享一下。 正常的项目,使用pod引入EZOpenSDK之后就开始报错了,下面就是错误信息: could not build module foundation错误 could not build modul…...
“智能科技·链接未来”2024中国国际人工智能产品展览会·智博会
2024年中国国际人工智能产品展览会(简称世亚智博会)将于3月份在上海举办,6月份在北京举办。本届展会以“智能科技链接未来”为主题,将集中展示全球前沿的人工智能技术和应用,以及人工智能在各个领域的新成果。 本届展会…...
华为NAT配置实例(含dhcp、ospf配置)
一、网络拓朴如下: 二、要求:PC1 能访问到Server1 三、思路: R2配置DHCP,R2和R1配OSPF,R1出NAT 四、主要配置: R2的DHCP和OSPF: ip pool 1gateway-list 10.1.1.1 network 10.1.1.0 mask 25…...
怎样才能把视频号的视频保存到相册,怎么下载视频号视频两个方法轻松解决
在微信客户端想要下载视频号视频却不知道怎么保存到本地相册?让不少网友犯了难,不用在纠结怎么样才可以将视频号视频下载下来,今天就分享两个小程序将视频号视频提取出来,另外在告诉大家一个下载技巧,一定要看到到结尾…...
软考系统架构师知识点集锦七:计算机系统基础知识
一、考情分析 二、考点精讲 2.1计算机系统概述 2.1.1计算机系统组成 2.1.2 存储系统 时间局部性:指程序中的某条指令一旦执行,不久以后该指令可能再次执行,典型原因是由于程序中存在着大量的循环操作。 空间局部性:指一旦程序访问了某个存储单元,不久…...
k8s节点已有镜像,但Pod一直在拉取镜像时卡着
Pod状态为ContainerCreating,查看日志提示pull镜像,但该镜像在Node节点已经存在,且拉取策略为IfNotPresent 解决:重启kubelet...
用图说话——流程图进阶
目录 一、基本流程图 二、时序流程图 一、基本流程图 经常阅读歪果仁绘制的流程图,感觉比较规范,自己在工作中也尝试用他们思维来绘图,这是一个小栗子: 二、时序流程图 在进行Detail设计过程中,一般的绘图软件显得…...
深入了解 Elasticsearch 8.1 中的 Script 使用
一、什么是 Elasticsearch Script? Elasticsearch 中的 Script 是一种灵活的方式,允许用户在查询、聚合和更新文档时执行自定义的脚本。这些脚本可以用来动态计算字段值、修改查询行为、执行复杂的条件逻辑等等。 二、支持的脚本语言有哪些 支持多种脚本…...
激光雷达点云基础-点云滤波算法与NDT匹配算法
激光雷达点云处理在五年前就做了较多的工作,最近有一些新的接触发现激光雷达代码原理五年前未见重大更新,或许C与激光雷达结合本身就是比较高的技术门槛。深度学习调包侠在硬核激光雷达技术面前可以说是完全的自愧不如啊。 1、点云滤波 在获取点云数据…...
回收废品抢派单小程序开源版开发
回收废品派单抢派单小程序开源版开发 在这个废品回收抢单派单小程序开源版开发中,我们将构建一个专业且富有趣味性的平台,以深度的模式来重塑废品回收体验。 我们将提供一个会员注册功能,用户可以通过小程序授权注册和手机号注册两种方式快…...
粤嵌实训医疗项目--day04(Vue + SpringBoot)
往期回顾 粤嵌实训医疗项目--day03(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目day02(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目--day01(VueSpringBoot)-CSDN博客 目录 一、用户详细信息查询 (查询信息与…...
redis加入window服务及删除
1、命令redis-server.exe --service-install redis.windows.conf,在服务中可配置自动启动 删除redis服务,先停止redis服务运行,管理员cmd模式,sc delete "redis" ,...
leetcode-哈希表
1. 理论 从哈希表的概念、哈希碰撞、哈希表的三种实现方式进行学习 哈希表:用来快速判断一个元素是否出现集合里。也就是查值就能快速判断,O(1)复杂度; 哈希碰撞:拉链法,线性探测法等。只是一种…...
NOIP2023模拟6联测27 旅行
题目大意 有一个有 n n n个点 n n n条边的无向连通图,一开始每条边都有一个颜色 c c c。 有 m m m次操作,每次操作将一条两个端点为 x , y x,y x,y的边的颜色修改为 c c c。求每次修改之后,图中有多少个颜色相同的连通块。 一个颜色相同的…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
