【图像配准】Canny边缘检测+模板配准红外可见光双路数据

本文主要是介绍【图像配准】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边缘检测+模板配准红外可见光双路数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278670

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内