OpenCV的TIF红外可见光融合算法

一、简介

首先TIF是Two-Scale Image Fusion的缩写,论文《Two-Scale Image Fusion of Infrared and Visible Images Using Saliency Detection (TIF)》,作者在论文中提到TIF算法主要通过以下三个步骤实现融合:

  1. 图像分解,图像分解使用的是均值滤波器获取图像的基础(base)和细节(detail)层;

  2. 图像融合,对待基础和细节层分别使用不同的融合算法;

  3. 图像重建,从融合后的基础和细节层重建图像。
    在这里插入图片描述

二、详细介绍

2.1 图像分解

考虑到原始的同样大小(宽高)两幅图像 ϕ 1 ( x , y ) \phi_{1}(x,y) ϕ1(x,y) , ϕ 2 ( x , y ) \phi_{2}(x,y) ϕ2(x,y),将这两幅图像分解为基础层(base)和细节(detail)层,作者在文中使用了均值滤波器来生成基础层和细节层(文中作者通过验证,使用的均值滤波窗口大小为35)。

ϕ 1 B ( x , y ) = ϕ 1 ( x , y ) ∗ μ ( x , y ) \phi_{1}^{B}(x, y)=\phi_{1}(x, y) * \mu(x, y) ϕ1B(x,y)=ϕ1(x,y)μ(x,y)

ϕ 2 B ( x , y ) = ϕ 2 ( x , y ) ∗ μ ( x , y ) \phi_{2}^{B}(x, y)=\phi_{2}(x, y) * \mu(x, y) ϕ2B(x,y)=ϕ2(x,y)μ(x,y)

在得到基础层之后,通过原始图像与基础层图像得到细节层图像。

ϕ 1 D ( x , y ) = ϕ 1 ( x , y ) − ϕ 1 B ( x , y ) \phi_{1}^{D}(x, y)=\phi_{1}(x, y) - \phi_{1}^{B}(x, y) ϕ1D(x,y)=ϕ1(x,y)ϕ1B(x,y)

ϕ 2 D ( x , y ) = ϕ 2 ( x , y ) ∗ ϕ 2 B ( x , y ) \phi_{2}^{D}(x, y)=\phi_{2}(x, y) * \phi_{2}^{B}(x, y) ϕ2D(x,y)=ϕ2(x,y)ϕ2B(x,y)

基于可视显著检测理论,作者在文中使用了一种很有效的可视显著检测方法,就是用均值滤波(作者通过验证,使用的中值窗口大小为3)得到的图像减去中值滤波得到的图像,并取绝对值。
在这里插入图片描述

ξ ( x , y ) = ∣ ϕ u ( x , y ) − ϕ η ( x , y ) ∣ \xi(x,y)=|\phi_u(x,y)-\phi_\eta(x,y)| ξ(x,y)=ϕu(x,y)ϕη(x,y)

如果是RGB图像的话,使用L2-norm或欧拉距离的方法:

ξ ( x , y ) = d e ( ϕ u , ϕ η ) = ( ϕ u R − ϕ η R ) 2 + ( ϕ u G − ϕ η G ) 2 + ( ϕ u B − ϕ η B ) 2 \xi(x,y)=de(\phi_u,\phi_\eta)=\sqrt{(\phi_u^R-\phi_\eta^R)^2+(\phi_u^G-\phi_\eta^G)^2+(\phi_u^B-\phi_\eta^B)^2} ξ(x,y)=de(ϕu,ϕη)=(ϕuRϕηR)2+(ϕuGϕηG)2+(ϕuBϕηB)2
对于原始的输入图像 ϕ 1 ( x , y ) \phi_{1}(x,y) ϕ1(x,y) , ϕ 2 ( x , y ) \phi_{2}(x,y) ϕ2(x,y),通过分别计算可以得到 ξ 1 ( x , y ) \xi_{1}(x,y) ξ1(x,y) , ξ 2 ( x , y ) \xi_{2}(x,y) ξ2(x,y)通过这两个矩阵,得到detail层的融合系数矩阵。

ψ 1 ( x , y ) = ξ 1 ( x , y ) ξ 1 ( x , y ) + ξ 2 ( x , y ) \psi_1(x,y)=\frac{\xi_1(x,y)}{\xi_1(x,y)+\xi_2(x,y)} ψ1(x,y)=ξ1(x,y)+ξ2(x,y)ξ1(x,y)

ψ 2 ( x , y ) = ξ 2 ( x , y ) ξ 1 ( x , y ) + ξ 2 ( x , y ) \psi_2(x,y)=\frac{\xi_2(x,y)}{\xi_1(x,y)+\xi_2(x,y)} ψ2(x,y)=ξ1(x,y)+ξ2(x,y)ξ2(x,y)

2.2 图像融合

基础层的融合,使用平均的策略进行融合:
ϕ B ( x , y ) = 1 2 ( ϕ 1 B ( x , y ) + ϕ 2 B ( x , y ) ) \phi^B(x,y)=\frac{1}{2}(\phi_1^B(x,y)+\phi_2^B(x,y)) ϕB(x,y)=21(ϕ1B(x,y)+ϕ2B(x,y))
细节层的融合,使用加权平均的策略进行融合,二加权矩阵就是之前求得的 ψ 1 ( x , y ) \psi_1(x,y) ψ1(x,y), ψ 2 ( x , y ) \psi_2(x,y) ψ2(x,y)

ϕ D ( x , y ) = ψ 1 ( x , y ) ϕ 1 D ( x , y ) + ψ 2 ( x , y ) ϕ 2 D ( x , y ) \phi^D(x,y)=\psi_1(x,y)\phi_1^D(x,y)+\psi_2(x,y)\phi_2^D(x,y) ϕD(x,y)=ψ1(x,y)ϕ1D(x,y)+ψ2(x,y)ϕ2D(x,y)

2.3 图像重建

在得到基础层和细节层之后,通过简单的加法多基础层和细节层进行融合:

γ ( x , y ) = ϕ B ( x , y ) + ϕ D ( x , y ) \gamma(x,y)=\phi^B(x,y)+\phi^D(x,y) γ(x,y)=ϕB(x,y)+ϕD(x,y)

三、python实现

import numpy as np
import cv2
import argparsedef TIF_GRAY(img_r, img_v):img_r_blur = cv2.blur(img_r, (35,35))img_v_blur = cv2.blur(img_v, (35,35))img_r_median = cv2.medianBlur(img_r, 3)img_v_median = cv2.medianBlur(img_v, 3)img_r_detail = img_r*1. - img_r_blur*1.img_v_detail = img_v*1. - img_v_blur*1.img_r_the = cv2.pow(cv2.absdiff(img_r_median,img_r_blur), 2)img_v_the = cv2.pow(cv2.absdiff(img_v_median ,img_v_blur),2)img_r_weight = cv2.divide(img_r_the*1.,img_r_the*1.+img_v_the*1.+0.000001)img_v_weight = 1- img_r_weightimg_base_fused = (img_r_blur*1.  + img_v_blur*1.) / 2img_detail_fused = img_r_weight * img_r_detail + img_v_weight * img_v_detailimg_fused_tmp = (img_base_fused  + img_detail_fused).astype(np.int32)#first method to change <0 to 0 and > 255 to 255img_fused_tmp[img_fused_tmp<0] = 0img_fused_tmp[img_fused_tmp>255]=255#second method to change value to[0,255] using minmax method#cv2.normalize(img_fused_tmp,img_fused_tmp,0,255,cv2.NORM_MINMAX)img_fused = cv2.convertScaleAbs(img_fused_tmp)return img_fuseddef TIF_RGB(img_r, img_v):fused_img = np.ones_like(img_r)r_R = img_r[:,:,2]v_R = img_v[:,:,2]r_G = img_r[:,:,1]v_G = img_v[:,:,1]r_B = img_r[:,:,0]v_B = img_v[:,:,0]fused_R = TIF_GRAY(r_R, v_R)fused_G = TIF_GRAY(r_G, v_G)fused_B = TIF_GRAY(r_B, v_B)fused_img[:,:,2] = fused_Rfused_img[:,:,1] = fused_Gfused_img[:,:,0] = fused_Breturn fused_imgdef TIF(_rpath, _vpath):img_r = cv2.imread(_rpath)img_v = cv2.imread(_vpath)if not isinstance(img_r, np.ndarray) :print('img_r is null')returnif not isinstance(img_v, np.ndarray) :print('img_v is null')returnif img_r.shape[0] != img_v.shape[0]  or img_r.shape[1] != img_v.shape[1]:print('size is not equal')returnfused_img = Noneif len(img_r.shape)  < 3 or img_r.shape[2] ==1:if len(img_v.shape)  < 3 or img_v.shape[-1] ==1:fused_img = TIF_GRAY(img_r, img_v)else:img_v_gray = cv2.cvtColor(img_v, cv2.COLOR_BGR2GRAY)fused_img = TIF_GRAY(img_r, img_v)else:if len(img_v.shape)  < 3 or img_v.shape[-1] ==1:img_r_gray = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY)fused_img = TIF_GRAY(img_r_gray, img_v)else:fused_img = TIF_RGB(img_r, img_v)cv2.imshow('fused image', fused_img)cv2.imwrite("fused_image_tif.jpg", fused_img)cv2.waitKey(0)if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('-r', type=str, default='ir.png' ,help='input IR image path', required=False)parser.add_argument('-v', type=str, default= 'vr.png',help='input Visible image path', required=False)args = parser.parse_args()TIF(args.r, args.v)

在这里插入图片描述

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

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

相关文章

scrapy爬取图片

scrapy 爬取图片 环境准备 python3.10scrapy pillowpycharm 简要介绍scrapy Scrapy 是一个开源的 Python 爬虫框架&#xff0c;专为爬取网页数据和进行 Web 抓取而设计。它的主要特点包括&#xff1a; 高效的抓取性能&#xff1a;Scrapy 采用了异步机制&#xff0c;能够高效…

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中&#xff0c;如果需要对器件进行翻转、平移等操作&#xff0c;可以通过transform指…

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…

LSA更新、撤销

LSA的新旧判断&#xff1a; 1.seq&#xff0c;值越大越优先 2.chksum&#xff0c;值越大越优先 3.age&#xff0c;本地的LSA age和收到的LSA age作比较 如果差值<900s&#xff0c;认为age一致&#xff0c;保留本地的&#xff1a;我本地有一条LSA是100 你给的是400 差值小于…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存&#xff0c;此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高&#xff0c;在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

nexus搭建maven私服

说到maven私服每个公司都有&#xff0c;比如我上一篇文章介绍的自定义日志starter&#xff0c;就可以上传到maven私服供大家使用&#xff0c;每次更新只需deploy一下就行&#xff0c;以下就是本人搭建私服的步骤 使用docker安装nexus #拉取镜像 docker pull sonatype/nexus3:…

【声音场景分类--论文阅读】

1.基于小波时频图特征在声音场景分类 基于小波时频图特征在声音场景分类任务中的表现 2.增强增强高效音频分类网络 https://arxiv.org/pdf/2204.11479v5 https://github.com/Alibaba-MIIL/AudioClassfication 音频分类网络如图4所示。在此阶段&#xff0c;主要重点是建立一…

基于springboot果蔬供应链信息管理平台

基于Spring Boot的果蔬供应链信息管理平台是一种集成了先进信息技术和果蔬供应链管理理念的综合性系统。 一、背景与意义 随着人们生活水平的提高和对健康饮食的重视&#xff0c;果蔬市场需求不断增长。然而&#xff0c;果蔬供应链涉及多个环节&#xff0c;包括种植、采摘、加…

RNN之:LSTM 长短期记忆模型-结构-理论详解-及实战(Matlab向)

0.前言 递归&#xff01;循环神经网络Recurrent Neural Network 循环神经网络&#xff08;又称递归神经网络&#xff0c;Recurrent Neural Network&#xff0c;RNN&#xff09;。是一种用于处理序列数据的神经网络结构&#xff0c;具有记忆功能&#xff0c;能够捕捉序列中的时…

kafka原理和实践

Kafka是当前分布式系统中最流行的消息中间件之一&#xff0c;凭借着其高吞吐量的设计&#xff0c;在日志收集系统和消息系统的应用场景中深得开发者喜爱。本篇就聊聊Kafka相关的一些知识点。主要包括以下内容&#xff1a; Kafka简介 Kafka特点Kafka基本概念Kafka架构Kafka的几…

excel 整理表格,分割一列变成多列数据

数据准备 对于很多系统页面的数据是没有办法下载的。 这里用表格数据来举例。随便做数据的准备。想要看excel部分的可以把这里跳过&#xff0c;从数据准备完成开始看。 需要一点前端基础知识&#xff0c;但不多&#xff08;不会也行&#xff09;。 把鼠标放在你想要拿到本地的…

详情页 路由传值

路由传值获取参数 渲染数据 主页面 <template><div class"km"><div v-for"item in items" :key"item.id"><div class"title-km" ><img :src"item.imageUrl" alt"Image" class"…

从源码角度分析SpringMVC执行流程

文章目录 一、SpringMVC基本概述二、SpringMVC的执行流程三、SpringMVC源码的执行流程四、前端控制器根据请求获取处理器原理五、如何根据处理器获取处理器适配器六、SpringMVC拦截器执行源码解读七、处理器适配器执行方法原理 一、SpringMVC基本概述 SpringMVC是基于Servlet进…

Java中网络编程的学习

目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址&#xff08;Internet Protocol Address&#xff09; 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤&#xff1a; 服务器程序…

Winforms开发基础之非主线程操作UI控件的误区

前言 想象一下&#xff0c;你正在开发一个桌面应用程序&#xff0c;用户点击按钮后需要执行一个耗时操作。为了避免界面卡顿&#xff0c;你决定使用后台线程来处理任务。然而&#xff0c;当你在后台线程中尝试更新UI控件时&#xff0c;程序突然崩溃了。这是为什么呢&#xff1…

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置&#xff0c;在爬虫爬取网站文章时候&#xff0c;会输入给爬虫一个配置文件&#xff0c;里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…

个人主页搭建全流程(Nginx部署+SSL配置+DCDN加速)

前言 最近开始准备秋招&#xff0c;打算做一个个人主页&#xff0c;以便在秋招市场上更有竞争力。 目前&#xff0c;现有的一些搭建主页的博文教程存在以下一些问题&#xff1a; 使用Github Page进行部署&#xff0c;这在国内访问容易受阻使用宝塔面板等框架&#xff0c;功能…

day07_Spark SQL

文章目录 day07_Spark SQL课程笔记一、今日课程内容二、Spark SQL函数定义&#xff08;掌握&#xff09;1、窗口函数2、自定义函数背景2.1 回顾函数分类标准:SQL最开始是_内置函数&自定义函数_两种 2.2 自定义函数背景 3、Spark原生自定义UDF函数3.1 自定义函数流程&#x…

【I/O编程】UNIX文件基础

IO编程的本质是通过 API 操作 文件。 什么是 IO I - Input 输入O - Output 输出 这里的输入和输出都是站在应用&#xff08;运行中的程序&#xff09;的角度。外部特指文件。 这里的文件是泛指&#xff0c;并不是只表示存在存盘中的常规文件。还有设备、套接字、管道、链接…

软件测试 —— Selenium常用函数

软件测试 —— Selenium常用函数 操作测试对象点击/提交对象 click()模拟按键输入 send_keys("")清除文本内容 clear() 模拟用户键盘行为 Keys包示例用法 获取文本信息 textget_attribute("属性名称") 获取当前页面标题 title获取当前页面的 url current_u…