通用图像融合框架IFCNN融合自己的可见光和红外图像

图像融合方法可以分为空间域算法和变换域算法

变换域图像融合算法对多个输入图像的特征进行加权融合,可以融合两个图像各自的特点。变换域图像融合算法通常可以用于融合更多类型的图像

在通用框架IFCNN模型中,其网络结构如下图所示,主要是由两层卷积层提取图像特征后融合,融合方法分为三种,最大值tensor_max,和tensor_sum,均值tensor_mean,最后再通过两层卷积得到新图像。

本文主要是利用Github上的代码和预训练的模型完成自己的图像融合。对于原理和训练过程不过多赘述。

代码地址为:uzeful/IFCNN: code for "IFCNN: A General Image Fusion Framework Based on Convolutional Neural Network" (github.com) 

下载代码后,创建一个自己的pyhton文件


import os
import cv2
import time
import torch
from model import myIFCNN

os.environ['CUDA_DEVICE_ORDER']='PCI_BUS_ID'
os.environ['CUDA_VISIBLE_DEVICES']='0'

from torchvision import transforms
from torch.autograd import Variable

from PIL import Image
import numpy as np

from utils.myTransforms import denorm, norms, detransformcv2
from utils.myDatasets import ImagePair

fuse_scheme = 0
if fuse_scheme == 0:
    model_name = 'IFCNN-MAX'
elif fuse_scheme == 1:
    model_name = 'IFCNN-SUM'
elif fuse_scheme == 2:
    model_name = 'IFCNN-MEAN'
else:
    model_name = 'IFCNN-MAX'


#取指定文件夹数据
def get_image_by_index(folder_path, index):
    image_paths = [os.path.join(folder_path, filename) for filename in os.listdir(folder_path)
                   if filename.endswith(".png") or filename.endswith(".jpg")]

    if 0 <= index <= len(image_paths)+1:
        return image_paths[index]
    else:
        return None


# load pretrained model
model = myIFCNN(fuse_scheme=fuse_scheme)
model.load_state_dict(torch.load('snapshots/'+ model_name + '.pth'))
model.eval()
model = model.cuda()

is_save = True                 # if you do not want to save images, then change its value to False

datasets_num = 1073
begin_time = time.time()

root_IV = 'F:/perseonData/demo_PersonIR/images/test'
root_VIS = 'F:/perseonData/demo_PersonVis/images/test'
saveImage_path = 'F:/perseonData/demoCNN_PersonRO/images/test/'
file_IV = os.listdir(root_IV)
for ind in range(datasets_num):
    is_gray = False  # Color (False) or Gray (True)
    mean = [0, 0, 0]  # normalization parameters
    std = [1, 1, 1]
    # mean = [0.485, 0.456, 0.406]  # normalization parameters
    # std = [0.229, 0.224, 0.225]
    iv = get_image_by_index(root_IV, ind)
    vis = get_image_by_index(root_VIS, ind)
    # load source images
    pair_loader = ImagePair(impath1=iv, impath2=vis,
                            transform=transforms.Compose([
                                transforms.ToTensor(),
                                transforms.Normalize(mean=mean, std=std)
                            ]))
    img1, img2 = pair_loader.get_pair()
    img1.unsqueeze_(0)
    img2.unsqueeze_(0)

    # perform image fusion
    with torch.no_grad():
        res = model(img1.cuda(), img2.cuda())
        res = denorm(mean, std, res[0]).clamp(0, 1) * 255
        res_img = res.cpu().data.numpy().astype('uint8')
        img = res_img.transpose([1, 2, 0])

    # save fused images
    if is_save:
        fliename = file_IV[ind]
        save_path = saveImage_path + fliename  # 保存路径

        if is_gray:
            img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)  # 转换为灰度图像
            img_pil = Image.fromarray(img)  # 转换为PIL图像对象
            img_pil.save(save_path, format='JPEG', quality=95)  # 保存为JPG格式,quality参数指定图片质量(0-100)
        else:
            img_pil = Image.fromarray(img)  # 转换为PIL图像对象
            img_pil.save(save_path, format='JPEG', quality=95)  # 保存为JPG格式,quality参数指定图片质量(0-100)

    # when evluating time costs, remember to stop writing images by setting is_save = False
    proc_time = time.time() - begin_time
    print('Total processing time of {} dataset: {:.3}s'.format(ind, proc_time))


在上述代码中更改你的红外图像存放地址,可见光图像存放地址和融合图像存放地址即可完成利用Github上预训练模型对可见光和红外图像的融合。

下面是我利用LLVIP数据集对IFCNN的运用分别为可见光图像、红外图像、融合图像

可见光图像

红外图像

融合图像


总体来说,融合效果不错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值