图像融合方法可以分为空间域算法和变换域算法
变换域图像融合算法对多个输入图像的特征进行加权融合,可以融合两个图像各自的特点。变换域图像融合算法通常可以用于融合更多类型的图像
在通用框架IFCNN模型中,其网络结构如下图所示,主要是由两层卷积层提取图像特征后融合,融合方法分为三种,最大值tensor_max,和tensor_sum,均值tensor_mean,最后再通过两层卷积得到新图像。
本文主要是利用Github上的代码和预训练的模型完成自己的图像融合。对于原理和训练过程不过多赘述。
下载代码后,创建一个自己的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的运用分别为可见光图像、红外图像、融合图像
可见光图像
红外图像
融合图像
总体来说,融合效果不错。