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

【OpenCV 图像变换实战:旋转、模板匹配与金字塔操作】

在计算机视觉领域图像变换是最基础也最核心的操作之一。无论是简单的图像旋转、精准的模板匹配还是用于图像分层处理的金字塔操作都是实现图像增强、目标检测、图像重建的关键技术。本文将结合实战代码系统讲解 OpenCV 中这三类核心图像变换技术的原理与实现。一、图像旋转两种高效实现方式图像旋转是调整图像角度的基础操作OpenCV 提供了两种常用实现方案基于 NumPy 的np.rot90和 OpenCV 原生的cv2.rotate二者各有优势可根据场景灵活选择。1.1 np.rot90 实现旋转np.rot90是 NumPy 库提供的旋转函数通过参数k控制旋转方向和角度• k1逆时针旋转 90 度• k-1顺时针旋转 90 度• k2旋转 180 度#方法1 img cv2.imread(rD:\software\Pycharm\计算机视觉\kele.png) #旋转90度k1 表示逆时针旋转90度 rotated_image1np.rot90(img,k-1) #选转90度k1表示逆时针旋转90度 rotated_image2np.rot90(img,k1) cv2.imshow(yuantu,img) cv2.imshow(rorated_image1,rotated_image1) cv2.imshow(rorated_image2,rotated_image2) cv2.waitKey(0) cv2.destroyAllWindows()此图是kele.png运行结果1.2 cv2.rotate 实现旋转OpenCV 原生的cv2.rotate函数语义更直观直接通过参数指定旋转方式#方法 rotated_imagecv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)#顺时针90度 rorated_image1cv2.rotate(img,cv2.ROTATE_90_COUNTERCLOCKWISE)#逆时针90度 rotated_image2cv2.rotate(img,cv2.ROTATE_180)#旋转180度 cv2.imshow(shun90,rotated_image) cv2.imshow(ni90,rotated_image1) cv2.imshow(180,rotated_image2) cv2.waitKey(0)如果仅需 90/180/270 度旋转cv2.rotate语义更清晰若需自定义旋转角度可结合cv2.getRotationMatrix2D和cv2.warpAffine实现。二、模板匹配多角度匹配与非极大值抑制模板匹配是在图像中寻找与模板相似区域的技术常用于目标检测。基础模板匹配仅能匹配固定角度的目标结合旋转和非极大值抑制可实现多角度、无重复的精准匹配。2.1 基础模板匹配基础模板匹配流程读取图像→灰度化→模板匹配→阈值筛选→绘制匹配框import cv2 import numpy as np # img_rgb cv2.imread(image.jpg) img_gray cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY) template cv2.imread(tem.jpg,0) h,wtemplate.shape[:2] #使用模板匹配方法cv2.matchTemplate 进行模版匹配 rescv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED) #设定匹配阈值 threshold 0.75 #获取匹配结果中所有符合阈值点的坐标 locnp.where(resthreshold)#符合条件的行符合条件的列 print(loc) #遍历所有匹配点 for pt in zip(*loc[::-1]): #在原图上绘制匹配区域的矩形框 cv2.rectangle(img_rgb,pt,(pt[0]w,pt[1]h),(0,0,255),1) cv2.imshow(,img_rgb) cv2.waitKey(0)运行结果2.2 进阶多角度匹配 非极大值抑制基础匹配无法处理目标旋转的场景通过对模板进行多角度旋转并使用非极大值抑制NMS去除重复匹配框可解决该问题import cv2 import numpy as np def non_max_suppression(boxes, overlapThresh): 非极大值抑制去除重叠率过高的匹配框 if len(boxes) 0: return [] # 提取框坐标、得分和面积 x1 boxes[:, 0] y1 boxes[:, 1] x2 boxes[:, 2] y2 boxes[:, 3] scores boxes[:, 4] areas (x2 - x1 1) * (y2 - y1 1) # 按得分降序排序 order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) # 计算当前框与其他框的交集 xx1 np.maximum(x1[i], x1[order[1:]]) yy1 np.maximum(y1[i], y1[order[1:]]) xx2 np.minimum(x2[i], x2[order[1:]]) yy2 np.minimum(y2[i], y2[order[1:]]) w np.maximum(0.0, xx2 - xx1 1) h np.maximum(0.0, yy2 - yy1 1) inter w * h # 计算重叠率 ovr inter / (areas[i] areas[order[1:]] - inter) # 保留重叠率低于阈值的框 inds np.where(ovr overlapThresh)[0] order order[inds 1] return keep # 1. 读取图像和模板 img_rgb cv2.imread(image.jpg) img_gray cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template cv2.imread(tem.jpg, 0) h, w template.shape[:2] all_boxes [] # 2. 对模板进行0°、90°、180°、270°旋转并匹配 for k in [0, 1, 2, 3]: rotated_template np.rot90(template, kk) rh, rw rotated_template.shape # 模板匹配 res cv2.matchTemplate(img_gray, rotated_template, cv2.TM_CCOEFF_NORMED) # 筛选匹配点 loc np.where(res 0.75) # 收集匹配框x1,y1,x2,y2,score for pt in zip(*loc[::-1]): score res[pt[1], pt[0]] all_boxes.append([pt[0], pt[1], pt[0]rw, pt[1]rh, score]) # 3. 非极大值抑制去重 all_boxes np.array(all_boxes) keep non_max_suppression(all_boxes, overlapThresh0.3) final_boxes all_boxes[keep] # 4. 绘制最终匹配框 for box in final_boxes: x1, y1, x2, y2, _ box cv2.rectangle(img_rgb, (int(x1), int(y1)), (int(x2), int(y2)), (0,0,255), 2) cv2.imshow(多角度模板匹配, img_rgb) cv2.waitKey(0) cv2.destroyAllWindows()模板旋转覆盖 0°、90°、180°、270° 四个角度适配旋转后的目标非极大值抑制通过计算框的重叠率去除重复匹配框避免同一目标被多次检测。三、图像金字塔下采样、上采样与拉普拉斯金字塔图像金字塔是一种多尺度表示方法通过对图像进行下采样缩小和上采样放大构建不同分辨率的图像层级常用于图像融合、特征提取、图像重建等场景。3.1 高斯金字塔下采样与上采样高斯金字塔的核心是cv2.pyrDown下采样和cv2.pyrUp上采样下采样先高斯模糊再隔行隔列采样图像尺寸减半上采样先将图像尺寸翻倍补 0再进行高斯滤波图像尺寸翻倍但会模糊。import cv2 import numpy as np 高阶金字塔操作中的向下采样 # 下采样 是一种减小图像尺寸的方法它通常涉及到降低图像的分辨率即减少图像中像素的数量从而使图像看起来更小。 # 上采样 是一种增大图像尺寸的方法它通过插值和滤波技术来恢复图像的分辨率和细节通常用于图像放大或者与下采样后的图像进行比较。 # ## resize函数 是一种通用的图像尺寸调整方法它可以按照指定的目标尺寸来缩放图像不涉及金字塔结构或者特定的滤波操作。 # dst cv2.pyrDown(src [,dst, dstsize [, borderType] ]) # dst:目标图像 # src:原始图像 # dstsize:目标图像的大小 face cv2.imread(zx_min.jpg,cv2.IMREAD_GRAYSCALE) cv2.imshow(face,face) # cv2.waitKey(0) face_down_1cv2.pyrDown(face) cv2.imshow(down_1,face_down_1) # cv2.waitKey(0) face_down_2cv2.pyrDown(face_down_1) cv2.imshow(down_2,face_down_2) # cv2.waitKey(0) #高斯金字塔操作中的向上采样 #dst cv2.pyrUp(src [,dst,dstsize [, borderType] ]) # dst:目标图像 # src:原始图像 # dstsize:目标图像的大小 face_up_1cv2.pyrUp(face) cv2.imshow(up_1,face_up_1) # cv2.waitKey(0) face_up_2cv2.pyrUp(face_up_1) cv2.imshow(up_2,face_up_2) # cv2.waitKey(0)3.2 拉普拉斯金字塔图像重建拉普拉斯金字塔基于高斯金字塔构建用于存储图像的细节信息公式为通过拉普拉斯金字塔可实现图像的精准重建。上采样后的图像尺寸可能与原图像不一致需先裁剪对齐避免维度不匹配报错。#对下采用后图像进行上采样,图像变模糊无法复原 face_down_1_up cv2.pyrUp(face_down_1)#下采样G1 face_down_2_up cv2.pyrUp(face_down_2)#下采样G2 cv2.imshow(down_1_up,face_down_1_up) cv2.imshow(down_2_up,face_down_2_up) # cv2.waitKey(0) # 5. 关键修复调整尺寸匹配裁剪/缩放避免维度不匹配报错 # 修复L0原图像face 和 face_down_1_up 尺寸对齐 target_h,target_w face.shape[:2] # 以原图像尺寸为基准 # 裁剪上采样后的图像到原图像尺寸去掉多余的行/列 face_down_1_up face_down_1_up[:target_h, :target_w] # 修复L1face_down_1 和 face_down_2_up 尺寸对齐 target_h1, target_w1 face_down_1.shape[:2] face_down_2_up face_down_2_up[:target_h1, :target_w1] #拉普拉斯金字塔 L0face-face_down_1_up L1face_down_1-face_down_2_up fuyuan face_down_1_upL0 cv2.imshow(L0,L0) cv2.imshow(L1,L1) # cv2.waitKey(0) cv2.imshow(fuyuan,fuyuan) cv2.waitKey(0)下采样后再上采样的图像会丢失细节模糊而拉普拉斯金字塔存储的细节信息可弥补这一损失实现图像的精准重建。

相关文章:

【OpenCV 图像变换实战:旋转、模板匹配与金字塔操作】

在计算机视觉领域,图像变换是最基础也最核心的操作之一。无论是简单的图像旋转、精准的模板匹配,还是用于图像分层处理的金字塔操作,都是实现图像增强、目标检测、图像重建的关键技术。本文将结合实战代码,系统讲解 OpenCV 中这三…...

C语言介绍:起源、特性、应用领域及如何为学其他语言打基础

C语言(C Language) 发音(Pronunciation):C yǔyn 大致意思(General Meaning):C语言是一种普遍使用的高级程序设计语言,在软件研发以及系统编程方面有着广泛运用。 详细阐…...

C语言:通用高级编程语言,现代编程语言母语及应用领域介绍

C语言,是一种被称作通用的、高级的编程语言,它是在1972年,由美国贝尔实验室的Dennis Ritchie进行开发的。C语言具备简洁、高效以及可移植的特性,在系统软件、嵌入式系统和应用程序开发当中被广泛应用。 现代编程语言的母语 有这样…...

cmu15445 25fall lec3个人笔记

lec3 database storage从应用层面转到构建层面query-planning->operator execution->access method->buffer pool manager->disk manageragendafile storage,page layout,tuple layout 行(row)为主存储顺序io(sequencial)耗时少于随机io(random access) 所以在DBMS…...

API 安全: 保护 AI 应用的交互接口

API 安全: 保护 AI 应用的交互接口你好,我是陈涉川,欢迎你来到我的专栏。在前面的章节中,我们刚刚结束了模型微调的炼狱,成功让大模型记住了企业的安全基线,并掌握了复杂的代理(Agent&#xff0…...

企业用智能体要投入多少成本?2026避坑指南与主流产品横评

2026年3月,AI Agent 正处于从“生成式问答”向“自主执行”跨越的爆发期。 企业在考虑企业用智能体要投入多少成本时,绝不能只看一张软件报价单。 真正的成本是由算力消耗、Token思维税、隐性维保、人力溢价构成的综合体系。 作为深耕自动化领域7年的评测…...

【AI智能体】——OpenClaw(龙虾)深度研究分享(五)clawhub: command not found 全网最稳解决方案

🦞 OpenClaw 终极排坑:clawhub: command not found 全网最稳解决方案 (Windows / Mac / Linux 全平台通用・保姆级)🔥 前言 最近 OpenClaw(小龙虾)真的火炸了! 但 80% 的人刚装上就卡…...

当LSTM遇上注意力:手把手教你玩转时序预测

Attention-LSTM时序预测,单输入单输出 基于注意力机制attention结合长短期记忆网络LSTM时间序列预测, 单输入单输出模型 MATLAB版本为2020b及其以上 中文注释清晰,非常适合科研小白 评价指标包括:R2、MAE、MSE、RMSE等时序预测总让人头疼&…...

拒绝加班!这套一键生成建筑模型的方法,让甲方当场傻眼

一、概述 在智慧城市建设、城市规划设计、游戏场景搭建以及数字孪生应用等领域,三维建筑模型的构建始终是基础且关键的一环。传统建模方式依赖人工描图、手动拉伸,不仅耗时耗力,而且难以保证数据的现势性与准确性。尤其是面对大范围城市级别…...

【实时Linux工业PLC解决方案系列】第三十六篇 - 实时Linux PLC定时器高精度控制

一、简介:为什么高精度定时器是工业PLC的"心脏"?在工业自动化领域,PLC(可编程逻辑控制器)的定时精度直接决定了控制系统的响应速度和稳定性。传统PLC依赖专用硬件实现毫秒级定时,而现代实时Linux…...

【嵌入式】RCC-复位与时钟控制模块及实例

基于 HAL 库工程,RCC 就是: Reset and Clock Control 中文一般叫: 复位与时钟控制模块 你可以先把它朴素理解成: RCC 是专门管“时钟”和“复位”的那个硬件模块。 一、它到底是干什么的 RCC 主要负责两大类事情&#xff1a…...

二维数组的应用:矩阵运算与图像处理

在编程世界里,二维数组是一种基础却又强大的数据结构,它就像是一张二维的网格,能精准存储和处理具有行列关系的数据。其中,矩阵运算与图像处理是它发挥价值的两大典型场景,今天我们就来深入拆解这两个应用方向。&#…...

OpenClaw 能不能赚钱?

最近一段时间,OpenClaw 在技术圈和副业圈同时火了。 有人说: 可以自动运营账号可以自动写文章可以自动接单可以当 AI 打工人 甚至已经出现: 帮人部署 OpenClaw 收费 我自己折腾了一周,做了一些简单测试,结论比想象中冷…...

GEO完整链路操作指引

一、先理解GEO的底层逻辑是什么相对浅层的认知里:让品牌出现在AI的回答中,让AI"看见"你、提到你、推荐你,这件事就做完了真正的决策过程,往往是从一个模糊问题开始,经过多轮追问、反复比较、风险确认、条件筛选&#xf…...

在线进行 Base64 文本编解码及图片转换 —— 开发调试实践指南

在日常开发中,Base64 编码是一种非常常见的数据处理方式。很多接口传输、图片嵌入、配置文件或日志数据中,都可能看到类似 SGVsbG8gd29ybGQ 这样的字符串,这其实就是 Base64 编码后的内容。 很多开发者在调试接口、处理图片数据或分析日志时…...

openclaw飞书机器人权限管理

为了确保 OpenClaw 既能顺畅运行,又不至于因权限过大导致安全隐患,建议在飞书开发者后台 - 权限管理中,按照以下清单进行勾选。 这份清单分为基础必备和进阶功能两部分: 基础必备权限(无论个人还是团队,必须…...

RTLAB实验图,半实物仿真平台,截图波形转示波器波形,仿真模型转实验图,电力电子实验波形

RTLAB实验图,半实物仿真平台,截图波形转示波器波形,仿真模型转实验图,电力电子实验波形 仿真波形转实验波形咱们今天聊聊电力电子实验中那个让人又爱又恨的环节——把仿真波形变成实验室示波器上的真实波形。搞过半实物仿真&#…...

单片机振荡周期,机器周期,指令周期

振荡周期:振荡器产生的时钟信号...

2026权威评测:毕业论文AIGC降重盘点,附免费试用

CSDN摘要: 2026年高校全面启用AIGC检测,传统同义词替换的降重方式已彻底失效!毕业论文“AIGC痕迹”究竟怎么破?本文基于真实学术场景,深度盘点5款主流AI学术工具,从原创性、降痕能力、服务保障等维度的实测…...

C++ 06:构造函数——对象初始化的核心指南

一、构造函数基础规则命名与返回值:函数名与类名完全一致,无返回值类型(不能写void)。自动调用:创建对象时系统自动触发,无需手动调用。默认构造:未显式定义时,编译器自动生成空默认…...

S4-Info-Yi系统的数学接口缺失、补全及在薛定谔猫佯谬中的应用

昨天希望将离子阱量子计算做一下,先前在海南曾把我的一段成果告诉华为,希望他们能与我合作,结果石沉大海。而我又有点儿不死心,在北京查了一下,发现费用高得吓人,要上千万,不仅如此,…...

计算机网络核心笔记

一、ISO 七层模型OSI(Open System Interconnection)是国际标准化组织提出的网络通信分层模型。层级名称作用示例7应用层为应用程序提供网络服务HTTP、FTP6表示层数据加密、压缩、格式转换SSL5会话层建立和管理会话RPC4传输层端到端通信TCP、UDP3网络层路…...

基于SpringBoot的同城上门喂遛宠物预约系统

Java基于SpringBoot的同城上门喂遛宠物预约系统是一个集高效性、便捷性与安全性于一体的宠物服务管理平台,其通过整合SpringBoot框架的快速开发能力与Java语言的稳定性,结合MySQL数据库的可靠存储,为宠物主人和服务提供者搭建了一个透明、可信…...

CUPT2024 15湿卷轴Comsol仿真(共两套)”

CUPT2024 15湿卷轴 comsol仿真 共两套 参数可以自行调整,需要与自己的实验结合 mph文件形式最近在折腾CUPT2024第15题"湿卷轴"的COMSOL仿真,发现这玩意儿比煮泡面有意思多了。先甩个建模思路:搞两套参数方案,一套给理论…...

三层架构+MVP 项目的标准化分层设计

三层架构MVP 项目的标准化分层设计(附可视化落地规范)结合 MVP 模式的三层架构,核心是**“整体三层架构不变,UI 层内部再按 MVP 拆分”,既保留三层架构的“业务-数据-界面”分离优势,又通过 MVP 解决 UI 层…...

解锁社区资源:如何发现和安装高质量的OpenClaw技能包

引言:站在巨人的肩膀上 OpenClaw的核心能力已经相当强大,但真正让它成为"超级工具"的是其技能包(Skills)生态系统。技能包就像是OpenClaw的"超能力扩展包",让AI能够胜任特定领域的工作。 想象一…...

Burpsuite | API 越权测试、快速收集目标网站的所有 API

工具介绍 ApiScanPlus为Burpsuite打造的路由抓取与渗透工具插件,借鉴结合了(JsRouteScanChkApiLinkfinder)等优秀项目,主要突出API抓的全、过滤更严谨方便、测试自由度更高等特点。感谢项目: JsRouteScan(https://github.com/F6JO/JsRouteSca…...

20260316-Windows 环境下安装 bibtex-tidy 到指定目录

Windows 环境下安装 bibtex-tidy 到指定目录。bibtex-tidy 是一个 Node.js 工具,需要通过 npm 安装。 有几种方法可以使用 bibtex-tidy: 在浏览器中 CLI 命令行界面作为预提交钩子Javascript/Typescript APIDocker 安装步骤 1. 确保已安装 Node.js …...

精准掌控!SOLIDWORKS Simulation助力密封圈挤压变形分析与密封力精确计算!

工程师们,还在为密封圈挤压变形的设计、仿真难题头疼吗?❌ 密封圈挤压变形量难以精确测量,密封性能评估全凭经验,达不到预期密封效果?❌ 摸不准密封力需求,压缩不足导致泄漏,压缩过度加速密封圈…...

机器学习线性代数--(1)核心思想

线性代数是数学中非常优美且实用的一门学科,它研究的是线性关系——一种最简单、最基础的关系。你可能已经在生活中不知不觉地用到它的思想了。比如,在平面上移动一个点、解方程组、或者处理图像旋转,背后都是线性代数。 1.1 什么是“线性”…...