【基于 PyQt6 的红外与可见光图像配准工具开发实战】

前言

图像配准是计算机视觉中的重要技术,特别是在多模态图像融合领域。本文将介绍如何使用 Python 和 PyQt6 开发一个功能完善的红外与可见光图像配准工具,支持手动调整、批量处理和游戏化键盘控制。

项目背景

在实际应用中,我们经常需要将红外图像与可见光图像进行配准,以便进行图像融合、目标检测等后续处理。传统的配准工具往往操作复杂、学习成本高,因此我们开发了一个直观易用的配准工具。

技术栈

  • Python 3.11: 主要开发语言
  • PyQt6: GUI 框架
  • OpenCV: 图像处理
  • NumPy: 数值计算
  • PyInstaller: 打包工具

核心功能

1. 双模式配准

全局模式(Global Mode)
  • 使用统一的配准参数
  • 适用于批量处理
  • 快速预览效果
手动模式(Manual Mode)
  • 为每张图像单独调整参数
  • 精确控制配准效果
  • 参数自动保存

2. 游戏化键盘控制

这是本工具的一大亮点,采用类似游戏的键盘控制方式:

defkeyPressEvent(self,event):key=event.key()ifkeynotinself.pressed_keys:self.pressed_keys.add(key)iflen(self.pressed_keys)==1:self.key_repeat_timer.start(self.key_repeat_interval)

特性

  • 方向键移动图像
  • W/E 控制水平缩放
  • A/D 控制垂直缩放
  • 支持长按连续移动
  • 支持多键同时按下(斜向移动)
  • 50ms 重复间隔,流畅如游戏

3. 可视化控制面板

除了键盘控制,还提供了可视化的方向键面板:

keyboard_group=QGroupBox("移动控制")keyboard_layout=QGridLayout()self.key_up_btn=QPushButton("↑")self.key_up_btn.pressed.connect(lambda:self.simulate_key_press(Qt.Key.Key_Up))self.key_up_btn.released.connect(lambda:self.simulate_key_release(Qt.Key.Key_Up))

布局如下:

↑ ← ↓ →

4. 自动参数管理

自动保存
  • 切换图像时自动保存当前参数
  • 静默保存,不弹窗干扰
  • 参数保存到results目录
参数加载
  • 加载图像时自动读取已保存的参数
  • 自动恢复到上次配准状态
  • 支持 JSON 格式存储

5. 批量导出功能

defexport_images(self):# 统计已配准图像params_count=0forir_fileinself.ir_files:json_file=self.result_dir/f"{ir_file.stem}.json"ifjson_file.exists():params_count+=1# 只导出已配准的图像fori,ir_fileinenumerate(self.ir_files):json_file=self.result_dir/f"{ir_file.stem}.json"ifnotjson_file.exists():skip_count+=1continue# 读取参数并应用withopen(json_file,'r',encoding='utf-8')asf:params=json.load(f)dx=params.get('dx',0)dy=params.get('dy',0)angle=params.get('angle',0.0)scale_x=params.get('scale_x',1.0)scale_y=params.get('scale_y',1.0)

特性

  • 使用results目录下的参数
  • 只导出已配准的图像
  • 显示详细的导出统计

6. 长按快速切换

"下一张"按钮支持长按功能:

defnext_btn_pressed(self):self.next_btn_is_long_press=Falseself.next_btn_timer=QTimer()self.next_btn_timer.setSingleShot(True)self.next_btn_timer.timeout.connect(self.on_next_btn_long_press)self.next_btn_timer.start(500)# 500ms 长按阈值defon_next_btn_long_press(self):self.next_btn_is_long_press=Trueself.next_image()self.start_auto_switch()# 每 300ms 自动切换

核心实现

1. 图像显示与变换

classImageCanvas(QWidget):defupdate_transformed_image(self):h,w=self.ir_image.shape[:2]center=(w//2,h//2)# 创建变换矩阵M=cv2.getRotationMatrix2D(center,self.angle,1.0)M[0,0]*=self.scale_x M[1,1]*=self.scale_y M[0,2]+=self.dx M[1,2]+=self.dy# 应用变换self.transformed_image=cv2.warpAffine(self.ir_image,M,(w,h))# 混合显示self.blended_image=cv2.addWeighted(self.vis_image,1-self.alpha,self.transformed_image,self.alpha,0)self.update()

2. 信号与槽机制

classImageCanvas(QWidget):parameters_changed=pyqtSignal(int,int,float,float,float)defmouseMoveEvent(self,event):ifself.dragging:dx=int(event.position().x()-self.last_pos.x())dy=int(event.position().y()-self.last_pos.y())self.dx+=dx self.dy+=dy self.last_pos=event.position()self.update_transformed_image()self.parameters_changed.emit(self.dx,self.dy,self.scale_x,self.scale_y,self.angle)classImageRegistrationWindow(QMainWindow):def__init__(self):self.image_canvas=ImageCanvas(self)self.image_canvas.parameters_changed.connect(self.update_parameter_labels)

3. 参数同步

defupdate_parameter_labels(self,dx=None,dy=None,scale_x=None,scale_y=None,angle=None):ifdxisNoneordyisNoneorscale_xisNoneorscale_yisNoneorangleisNone:dx,dy,scale_x,scale_y,angle,alpha=\ self.image_canvas.get_parameters()self.dx_spin.setValue(dx)self.dy_spin.setValue(dy)self.scale_x_slider.setValue(int(scale_x*100))self.scale_y_slider.setValue(int(scale_y*100))self.angle_slider.setValue(int(angle))self.scale_x_label.setText(f"ScaleX:{scale_x:.2f}")self.scale_y_label.setText(f"ScaleY:{scale_y:.2f}")self.angle_label.setText(f"Angle:{angle:.1f}°")

打包发布

使用 PyInstaller 将程序打包为独立的 exe 文件:

spec 文件配置

a=Analysis(['image_registration_tool.py'],pathex=[],binaries=[],datas=[],hiddenimports=['cv2','numpy','PyQt6','PyQt6.QtCore','PyQt6.QtGui','PyQt6.QtWidgets',],hookspath=[],hooksconfig={},runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False,)exe=EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='ImageRegistrationTool',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=False,# 无控制台窗口icon=None,)

打包命令

pyinstaller image_registration_tool.spec

打包后生成dist/ImageRegistrationTool.exe,文件大小约 84 MB,包含所有依赖库,可在任何 Windows 机器上直接运行。

使用指南

1. 准备数据

创建以下目录结构:

JZ_data/ ├── images/ # 可见光图像 ├── imagesIR/ # 红外图像 └── results/ # 配准参数(自动创建)

2. 运行程序

python image_registration_tool.py

或直接运行打包后的 exe:

ImageRegistrationTool.exe

3. 加载图像

  1. 点击"加载红外目录",选择红外图像文件夹
  2. 点击"加载可见光目录",选择可见光图像文件夹
  3. 程序会自动匹配同名图像

4. 配准图像

方法一:键盘控制
  • 方向键:移动图像
  • W/E:水平缩放
  • A/D:垂直缩放
  • +/-:调整混合比例
方法二:鼠标控制
  • 直接拖拽图像进行移动
  • 使用右侧滑块调整参数
方法三:可视化按钮
  • 点击方向按钮移动图像

5. 保存参数

  • 按 S 键保存
  • 或点击"保存参数"按钮
  • 切换图像时自动保存

6. 批量导出

  1. 完成所有图像的配准
  2. 点击"批量导出"
  3. 选择输出目录
  4. 等待导出完成

项目亮点

  1. 游戏化操作体验:键盘控制流畅自然,学习成本低
  2. 自动参数管理:切换图像时自动保存,无需手动操作
  3. 批量处理能力:支持一键导出所有已配准图像
  4. 可视化控制:提供多种控制方式,满足不同用户习惯
  5. 独立可执行:打包为 exe,无需 Python 环境

完整代码

完整代码已上传至 GitHub:

https://github.com/xy200303/image_registration_tool.git

包含以下文件:

  • image_registration_tool.py- 主程序
  • requirements.txt- 依赖列表
  • image_registration_tool.spec- 打包配置
  • build.bat- 自动打包脚本
  • README.md- 项目说明

总结

本文介绍了一个基于 PyQt6 的红外与可见光图像配准工具的开发过程。通过游戏化的键盘控制、自动参数管理和批量处理功能,大大提升了配准效率。该工具已成功打包为独立 exe 文件,可在任何 Windows 机器上直接运行。

参考资料

  • PyQt6 官方文档
  • OpenCV 官方文档
  • PyInstaller 文档

作者: xy200303
GitHub: https://github.com/xy200303/image_registration_tool.git
日期: 2026-01-23

如果觉得这篇文章对你有帮助,欢迎点赞、收藏和转发!有任何问题欢迎在评论区讨论。

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

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

相关文章

【React + TypeScript 实现高性能多列多选组件】

引言 在现代Web应用中,多选组件是常见的UI元素,尤其是在需要用户从多个选项中进行选择的场景。本文将介绍如何使用React和TypeScript实现一个功能完整、性能优化的多列多选组件,支持"Select All"功能和垂直填充的多列布局。组件功能…

常见的java线程并发安全问题八股

线程中的并发安全 1、synchronized关键字的底层原理? synchronized采用互斥的方式让同一时刻只有一个线程持有这个对象锁,它的底层是由jvm提供的monitor实现的,线程获得锁后会关联monitor,然后monitor内有三个属性owner、entryL…

HTML网页仿写实验

实验代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>质量管理与…

Java毕设项目推荐-基于SpringBoot+Vue 学生宿舍管理系统平台Web的学生宿舍管理系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Node.js 用 process.cpuUsage 监控CPU使用率

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Node.js CPU监控的深度实践&#xff1a;超越process.cpuUsage的陷阱与创新目录Node.js CPU监控的深度实践&#xff1a;超越proce…

GBDT 回归任务生成过程(逐步计算演示)

GBDT 是 Gradient Boosting Decision Tree 的缩写&#xff0c;中文名为梯度提升决策树&#xff0c;是一种经典的集成学习算法&#xff0c;核心逻辑是 串行生成多棵 CART 回归树&#xff0c;每一棵新树都用来拟合前一轮模型的预测残差&#xff0c;最终将所有树的预测结果累加&am…

XGBoost 生成过程详解

XGBoost 全称是 Extreme Gradient Boosting&#xff0c;翻译过来是极端梯度提升树。它是 GBDT&#xff08;梯度提升树&#xff09;的升级版&#xff0c;在工业界和竞赛中被称为 “大杀器”—— 因为它效果好、速度快、泛化能力强&#xff0c;上手门槛也不算高。 还是用学生成绩…

鸿蒙Flutter三方库适配指南:08.联合插件编写

鸿蒙Flutter三方库适配指南:08.联合插件编写2026-01-23 21:48 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

基于Android的智能健身助手APP(源码+lw+部署文档+讲解等)

课题介绍本课题旨在设计实现基于Android的智能健身助手APP&#xff0c;针对当下用户健身计划缺乏科学性、动作标准难把控、运动数据记录零散、健身目标难以坚持等痛点&#xff0c;打造集个性化计划制定、动作指导、数据监测、进度追踪于一体的移动健身服务工具&#xff0c;实现…

基于Android的智能旅游管家的设计与实现(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计实现基于Android的智能旅游管家APP&#xff0c;针对传统旅游中行程规划繁琐、景点信息零散、线下服务对接滞后、应急处理不便等痛点&#xff0c;打造集行程规划、智能导览、服务预约、应急保障于一体的移动旅游服务工具&#xff0c;实现旅游全流程数字化…

基于Java+SSM的电子商务平台的设计与实现(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计并实现基于 JavaSSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架的电子商务平台&#xff0c;针对传统线下商贸交易效率低、渠道有限及简易电商系统功能单一、扩展性差等问题&#xff0c;打造集商品展示、在线交易、订单管理、用户运营于一体的综…

基于Java+SSM的短剧推荐系统设计与实现(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计并实现基于 JavaSSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架的短剧推荐系统&#xff0c;针对当下短剧资源分散、推荐精准度低、用户筛选耗时、平台管理效率差等痛点&#xff0c;打造集短剧展示、智能推荐、内容管理、用户互动于一体的专业化…

Abaqus计算加速全解析——从算力瓶颈到高效解决方案的核心逻辑

Abaqus作为全球领先的通用有限元分析&#xff08;FEA&#xff09;软件&#xff0c;覆盖结构力学、热分析、流体-结构耦合等多学科场景&#xff0c;是科研院所、工程企业开展复杂仿真的“标配工具”。但对多数用户而言&#xff0c;Abaqus的“好用”往往与“难用”并存&#xff1…

Python中的Statsmodels:统计建模与假设检验

一、什么是 Statsmodels&#xff1f; statsmodels&#xff08;全称&#xff1a;Statistical Models&#xff09;是一个基于 NumPy、SciPy 和 pandas 构建的 Python 库&#xff0c;主要用于&#xff1a; 拟合统计模型&#xff08;如线性回归、逻辑回归、广义线性模型&#xff…

《AI元人文:悟空而行》的作者说明

《AI元人文&#xff1a;悟空而行》的作者说明 作者说明 尊敬的评审专家、主编&#xff1a; 在审阅《知行合一的价值革命&#xff1a;评〈AI元人文&#xff1a;悟空而行〉的思想、方法与伦理突破》及它所评论的原作《AI元人文&#xff1a;悟空而行》之前&#xff0c;恳请您允许作…

【更新至2024年】2013-2024年上市公司迪博内部控制指数及分项指数数据

【更新至2024年】2013-2024年上市公司迪博内部控制指数及分项指数数据 1、时间&#xff1a;2013-2024年 2、来源&#xff1a;迪博内控指数 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合…

Java毕设选题推荐:基于JavaWeb寝室管理系统基于Web的学生宿舍管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机Java毕设实战-基于Web的学生宿舍管理系统基于Java+Jsp+SpringMVC+Mysql实现的Java Web学生宿舍管理系统设【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

扫描枪测试 工业读码器

总之一句话,有问题找厂商支持,"不行就换硬件"或者 "先试用2个月" 。一般都不容易坏。扫描枪耐用,1-2个月试不出来。首先是满足基本功能,耐用测试可多买2个牌子。使用者需要有点常识。下面记录…

Java计算机毕设之基于Web的学生宿舍管理系统JavaWeb寝室管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…