【图像配准】Canny边缘检测+模板配准红外可见光双路数据
研究目的
最近在做无人机遥感红外和可见光双路数据配准,由于红外相机视野范围较小,因此配准的目的主要是在可见光的视野范围内,裁剪出红外图像对应的部分,同时,保持可见光的高分辨率不变。
本文思路
本文尝试使用Canny边缘检测提取红外和可见光的边缘特征,然后使用模板匹配的方式去进行配准。由于红外图像和可见光图像的分辨率并不相同,因此需要对可见光不断进行下采样,以接近红外图像的分辨率。
总体看来,使用传统方法做跨模态配准效果有限,主要是由于红外图像特征较少,不过在光照充足和建筑特征明显的情况下,有一定效果,后续会采用基于深度学习的配准方法,相关图片由于项目原因不对外公布,这里对代码进行归档。
实验代码
import numpy as np
import argparse
import cv2
import osif __name__ == '__main__':ap = argparse.ArgumentParser()ap.add_argument("-i", "--image", required=False, default=r"lr/Infrared.jpg", help="红外图像路径")ap.add_argument("-v", "--visualize", required=False, default=r"rgb/Zoom.jpg", help="可见光图像路径")ap.add_argument("-o", "--output", required=False, default=r"output", help="输出文件夹路径")args = vars(ap.parse_args())# 读取红外图像/灰度化/边缘检测template = cv2.imread(args["image"])template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)template = cv2.Canny(template, 50, 200)(tH, tW) = template.shape[:2]# 读取可见光图像image = cv2.imread(args["visualize"])# image = cv2.resize(image, (tW, tH))gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)found = Nonefor scale in np.linspace(0.2, 1.0, 20)[::-1]:# 多尺度缩小可见光图像resized = cv2.resize(gray, (int(gray.shape[1] * scale), int(gray.shape[0] * scale)))r = gray.shape[1] / float(resized.shape[1])# 若缩小的尺度小于红外图像尺寸,跳出循环if resized.shape[0] < tH or resized.shape[1] < tW:break# 对缩小之后的图像进行边缘检测edged = cv2.Canny(resized, 50, 200)'''cv2.matchTemplate 模板匹配:param 检测图像 模板 模板匹配方法:returns 相似度结果矩阵:(宽: image.shape[1]-template.shape[1]+1; 高:image.shape[0]-template.shape[0]+1)'''result = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF)# print("edged_shape:{}".format(edged.shape)) # (3888, 5184)# print("template_shape:{}".format(template.shape)) # (512, 640)# print("result_shape:{}".format(result.shape)) # (3377, 4545)# 查找模板中最大相似度值和位置_, maxVal, _, maxLoc = cv2.minMaxLoc(result)# 可选:查看匹配图范围# clone = np.dstack([edged, edged, edged])# clone = edged# cv2.rectangle(clone, (maxLoc[0], maxLoc[1]), (maxLoc[0] + tW, maxLoc[1] + tH), (0, 0, 255), 2)# cv2.imwrite(os.path.join(args["output"], "Visualize", "visualize.jpg"), clone)# 若在裁剪区域找到相似度更高的匹配点,更新foundif found is None or maxVal > found[0]:found = (maxVal, maxLoc, r)# 得到匹配度最高的矩阵框坐标_, maxLoc, r = found(startX, startY) = (int(maxLoc[0] * r), int(maxLoc[1] * r))(endX, endY) = (int((maxLoc[0] + tW) * r), int((maxLoc[1] + tH) * r))# cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)crop_img = image[startY:endY, startX:endX]# cv2.imshow("Image", image)# cv2.imshow("Crop Image", crop_img)# cv2.waitKey(0)thermal_image = cv2.imread(args["image"], cv2.IMREAD_COLOR)# cropping out the matched part of the thermal imagecrop_img = cv2.resize(crop_img, (thermal_image.shape[1], thermal_image.shape[0]))# 创建输出文件夹存储裁剪后的可见光影像if not os.path.exists(os.path.join(args["output"], "process")):os.mkdir(os.path.join(args["output"], "process"))# 保存图片cv2.imwrite(os.path.join(args["output"], "process", os.path.basename(args["visualize"])), crop_img)# 创建对比图像final = np.concatenate((crop_img, thermal_image), axis=1)if not os.path.exists(os.path.join(args["output"], "results")):os.mkdir(os.path.join(args["output"], "results"))cv2.imwrite(os.path.join(args["output"], "results", os.path.basename(args["visualize"])), final)
相关文章:
【图像配准】Canny边缘检测+模板配准红外可见光双路数据
研究目的 最近在做无人机遥感红外和可见光双路数据配准,由于红外相机视野范围较小,因此配准的目的主要是在可见光的视野范围内,裁剪出红外图像对应的部分,同时,保持可见光的高分辨率不变。 本文思路 本文尝试使用Ca…...
关于单机流程编排技术——docker compose安装使用的问题
最近在学习docker相关的东西,当我在docker上部署了一个nest应用,其中该应用中依赖了一个基于mysql镜像的容器,一个基于redis镜像的容器。那我,当我进行部署上线时,在启动nest容器时,必须保证redis容器和mys…...
Google Chrome的新“IP保护”功能将隐藏用户的IP地址
导语:在保护用户隐私方面,Google Chrome正在测试一项名为“IP保护”的新功能。通过使用代理服务器掩盖用户的IP地址,这项功能能够增强用户的隐私保护。在意识到IP地址可能被用于秘密追踪后,Google希望在确保用户隐私的同时&#x…...
做机器视觉工程师,苏州德创能不能去工作?
每一家公司都有自身特点,同时也每一家都有自身的bug。 苏州德创作为美国康耐视Cognex产品在华东最大的代理商,也是康耐视外包团队。那么苏州德创有哪些业务构成,业务的构成也是其招聘的主要人员的方向。 设备视觉供应商,如卓越&…...
交换机基础(二):VLAN 基础知识
一、VLAN 基础知识 虚拟局域网 (Virtual Local Area Network,VLAN) 是一种将局域网设 备从逻辑上划分成一个个网段,从而实现虚拟工作组的数据交换技术。 这一技术主要应用于3层交换机和路由器中,但主流应用还是在3层交换机中。 VLAN 是基于物理网络上构建…...
一个基于Vue3搭建的低代码数据可视化开发平台
JNPF是一个Vue3搭建的低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可完成业务需求。 在JNPF中,至少包含表单建模、流程设计、报表可视化、代码生成器、系统管理、前端UI等组件,这种情况下我们避免了重…...
经验风险最小化与结构风险最小化:优化机器学习模型的两种方法
随着大数据时代的到来,机器学习在各个领域中的应用越来越广泛。然而,在构建机器学习模型时,我们面临着两个主要的挑战:经验风险最小化和结构风险最小化。本文将深入探讨这两种方法,并分析它们在优化机器学习模型中的作…...
Java泛型中的问号是什么意思
通配符概念 因为 List 是泛型类,为了 表示各种泛型 List 的父类,可以使用类型通配符,类型通配符使用问号(?)表示,将一个问号当做类型元素传递个 List,可以表示为 List<?>,意思是 元素类型未知的 List…...
粤嵌实训医疗项目day02(Vue + SpringBoot)
目录 一、创建vue项目并运行 二、vue-cli中的路由使用 三、element-ui框架、实现页面布局以及vue-路由 四、前端登录页面 五、user登录后端接口完善【后端】 六、user登录前端-请求工具-请求发起【前端】 七、请求的跨域-访问策略 八、完善项目的页面布局、导航菜单以及…...
又是一年1024程序员日
程序员节是每年的10月24日,这是一个特殊的节日,旨在庆祝和表彰程序员们对科技和社会的贡献。作为技术领域的从业者,程序员们在现代社会中扮演着重要的角色,他们致力于编写、测试和维护软件代码,为我们的生活带来了无数…...
acme.sh签发和部署ZeroSSL泛域名证书
大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 介绍 acme.sh 是个开源的shell证书生成脚本,他可以自动生成Let’s Encrypt 的证书…...
Calibre拾遗:FDI (Foreign Database Interface)系统简介
Calibre是强大的GDS处理工具,包括查看,验证,分析等操作,操作由浅入深,除过手动编辑GDS的不是很灵活外,其他各种命令和操作策略,都是远(遥)远(遥)走…...
记一次渗透测试事件
一、漏洞发现 拿到登录的接口,丢到sqlmap里面跑一把,发现延时注入 进一步查询,发现是sa权限,直接os-shell whomai查询发现是管理员权限 os-shell执行命令太慢了,直接进行nc 反弹 执行base64 加密后的powershell命令&…...
AIGC笔记--基于DDPM实现图片生成
目录 1--扩散模型 2--训练过程 3--损失函数 4--生成过程 5--参考 1--扩散模型 完整代码:ljf69/DDPM 扩散模型包含两个过程,前向扩散过程和反向生成过程。 前向扩散过程对一张图像逐渐添加高斯噪声,直至图像变为随机噪声。 反向生成过程…...
三十七、【进阶】SQL的explain
1、explain 2、基础使用 在使用explain关键字时,只需要在所执行语句前加上explain即可 mysql> explain select * from stu where id3; ---------------------------------------------------------------------------------------------------------- | id | s…...
【Python】取火柴小游戏(巴什博弈)
火柴游戏:Python编程示例 当我们想要玩一个简单而有趣的游戏,同时又想锻炼自己的编程技能时,一个经典的选择就是火柴游戏。这个游戏的规则很简单:有一堆火柴,每次可以拿走1到6根,两名玩家轮流取火柴&#…...
030-第三代软件开发-密码输入框
第三代软件开发-密码输入框 文章目录 第三代软件开发-密码输入框项目介绍密码输入框总结一下 关键字: Qt、 Qml、 echoMode、 TextInput、 Image 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language…...
mysql读取文件
环境地址:phpMyAdmin LOAD DATA INFILE 任意文件读取漏洞 | VULNSPY 参考文章: mysql任意文件读取漏洞学习_BerL1n的博客-CSDN博客 从一道ctf题学习mysql任意文件读取漏洞 - 安全客,安全资讯平台 MYSQL 任意文件读取 小组CTF出题感想 - …...
CentOS(5)——rpm包和源码包区别
目录 一、简介 二、区别 ①包名称 ②概念 ③优缺点 ④安装位置的区别 ⑤安装位置不同带来的影响 ⑥卸载方式的不同 一、简介 最近在公司内网离线升级Git时,遇见两个概念,分别是使用rpm包安装git,另一个这是编译源码包安装git&#x…...
Golang 实现对配置文件加密
引言 在实际的应用中,配置文件通常包含了一些敏感的信息,如数据库密码、API密钥等。为了保护这些敏感信息不被恶意获取,我们可以对配置文件进行加密。本文将介绍如何使用Go语言实现对配置文件的加密。 场景 在这个场景中,我们将…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
