彩色图像融合

彩色图像融合

图像融合系列博客还有:

  1. 图像融合论文及代码整理最全大合集参见:图像融合论文及代码整理最全大合集
  2. 图像融合综述论文整理参见:图像融合综述论文整理
  3. 图像融合评估指标参见:红外和可见光图像融合评估指标
  4. 图像融合常用数据集整理参见:图像融合常用数据集整理
  5. 通用图像融合框架论文及代码整理参见:通用图像融合框架论文及代码整理
  6. 基于深度学习的红外和可见光图像融合论文及代码整理参见:基于深度学习的红外和可见光图像融合论文及代码整理
  7. 更加详细的红外和可见光图像融合代码参见:红外和可见光图像融合论文及代码整理
  8. 基于深度学习的多曝光图像融合论文及代码整理参见:基于深度学习的多曝光图像融合论文及代码整理
  9. 基于深度学习的多聚焦图像融合论文及代码整理参见:基于深度学习的多聚焦图像融合(Multi-focus Image Fusion)论文及代码整理
  10. 基于深度学习的全色图像锐化论文及代码整理参见:基于深度学习的全色图像锐化(Pansharpening)论文及代码整理
  11. 基于深度学习的医学图像融合论文及代码整理参见:基于深度学习的医学图像融合(Medical image fusion)论文及代码整理
  12. SeAFusion:首个结合高级视觉任务的图像融合框架参见:SeAFusion:首个结合高级视觉任务的图像融合框架

本博客主要介绍如何处理图像融合问题中的色彩信息。大部分算法都可以将彩色图像从RGB空间转换至YCbCr空间,由于图像的结构细节以及强度信息主要集中在Y通道中,因此通常将Y通道作为融合算法的输入并生成融合的Y通道。对于只有一幅图像包含色彩信息的融合场景像红外和可见光图像融合,医学图像融合,以及近红外和可见光图像融合,只需要将融合的Y通道与彩色图像的Cb和Cr通道转换会RGB空间即可。对于两幅图像都具有色彩信息则根据下式进行融合:

C f = C 1 ( ∣ C 1 − τ ∣ ) + C 2 ( ∣ C 2 − τ ∣ ) ∣ C 1 − τ ∣ + ∣ C 2 − τ ∣ , C_f = \frac{C_1(\left| C_1 - \tau \right|) + C_2(\left|C_2 - \tau\right|)}{\left| C_1 - \tau \right| + \left|C_2 - \tau\right|}, Cf=C1τ+C2τC1(C1τ)+C2(C2τ),
其中C1和C2分别为源图像I1和I2的Cb或Cr通道。Cf是对应通道的融合结果。 τ \tau τ 一般设置为128.
具体程序如下:
首先给出RGB2YCbCr 以及YCbCr2RGB的函数:

function [Y,Cb,Cr]=RGB2YCbCr(img_rgb)
	R=img_rgb(:,:,1);
	G=img_rgb(:,:,2);
	B=img_rgb(:,:,3);
	% rgbתihs
	Y   = 0.257*R+0.564*G+0.098*B+16;
	Cb = -0.148*R-0.291*G+0.439*B+128;
	Cr  = 0.439*R-0.368*G-0.071*B+128;
end
function [image_RGB]=YCbCr2RGB(img_YCbCr)
	Y=img_YCbCr(:,:,1);
	Cb=img_YCbCr(:,:,2);
	Cr=img_YCbCr(:,:,3);
	% rgbתihs
	R = 1.164*(Y-16)+1.596*(Cr-128);
	G = 1.164*(Y-16)-0.392*(Cb-128)-0.813*(Cr-128);
	B = 1.164*(Y-16)+2.017*(Cb-128);
	image_RGB=cat(3,R,G,B);
end

然后是批量处理输入图像的程序RGB2YCbCr_main.m:

%% 两幅源图像都是彩色图像
clc;
clear all;
A_dir = '..\Data\MFF\Lytro\A'; % 包含所有源图像A的文件夹路径
B_dir = '..\Data\MFF\Lytro\B'; % 包含所有源图像B的文件夹路径
save_dir_A = '..\Data\MFF\Lytro\A_Y\'; % 保存源图像A的Y通道的文件夹路径
save_dir_B = '..\Data\MFF\Lytro\B_Y\'; % 保存源图像B的Y通道的文件夹路径
fileFolder=fullfile(A_dir); 
dirOutput=dir(fullfile(fileFolder,'*.png')); % 图像后缀
fileNames = {dirOutput.name};
[m, num] = size(fileNames);
 if exist(save_dir_A,'dir')==0
	mkdir(save_dir_A);
 end
 if exist(save_dir_B,'dir')==0
	mkdir(save_dir_B);
 end
for i = 1:num
	name_A = fullfile(A_dir, fileNames{i});
    name_B = fullfile(B_dir, fileNames{i});
    save_name_A = strcat(save_dir_A, fileNames{i});
    save_name_B = strcat(save_dir_B, fileNames{i});
    image_A = double(imread(name_A));
    image_B = double(imread(name_B));
    [Y_A,Cb_A,Cr_A]=RGB2YCbCr(image_A); 
    [Y_B,Cb_B,Cr_B]=RGB2YCbCr(image_B); 
    imwrite(uint8(Y_A), save_name_A);
    imwrite(uint8(Y_B), save_name_B);    
    disp(save_name_A)
end
%% 只有一幅源图像为彩色图像
clc;
clear all;
A_dir = '..\Data\VIF\MSRS\vi'; % 包含所有源图像A的文件夹路径
save_dir_A = '..\Data\VIF\MSRS\vi_Y\'; % 保存源图像A的Y通道的文件夹路径
 if exist(save_dir_A,'dir')==0
	mkdir(save_dir_A);
 end
 fileFolder=fullfile(A_dir); 
dirOutput=dir(fullfile(fileFolder,'*.png')); % 图像后缀
fileNames = {dirOutput.name};
[m, num] = size(fileNames);
for i = 1:num
	name_A = fullfile(A_dir, fileNames{i});
    save_name_A = strcat(save_dir_A, fileNames{i});
    image_A = double(imread(name_A));
    [Y_A,Cb_A,Cr_A]=RGB2YCbCr(image_A); 
    imwrite(uint8(Y_A), save_name_A);
    disp(save_name_A)
end

批量将融合的Y通道与CbCr通道转换回RGB色彩空间的程序YCbCr2RGB_main.m:

%% 两幅源图像都是彩色图像
clc;
clear all;
A_dir = fullfile('..\Data\MFF\Lytro\A'); % 包含所有源图像A的文件夹路径
B_dir = fullfile('..\Data\MFF\Lytro\B'); % 包含所有源图像B的文件夹路径
Fused_dir = fullfile('..\Comparison\MFF\SwinFusion_Lytro_Y'); % 融合图像的Y通道的文件夹路径
save_dir = fullfile('..\Comparison\MFF\SwinFusion_Lytro'); % 彩色融合图像的文件夹路径
fileFolder=fullfile(A_dir);
dirOutput=dir(fullfile(fileFolder,'*.png'));
fileNames = {dirOutput.name};
[m, num] = size(fileNames);
if exist(save_dir,'dir')==0
	mkdir(save_dir);
end
for i = 1:num
    name_A = fullfile(A_dir, fileNames{i});
    name_B = fullfile(B_dir, fileNames{i});
    name_fused = fullfile(Fused_dir, fileNames{i});
    save_name = fullfile(save_dir, fileNames{i});
    image_A = double(imread(name_A));
    image_B = double(imread(name_B));
    I_result = double(imread(name_fused));
    [Y1,Cb1,Cr1]=RGB2YCbCr(image_A);
    [Y2,Cb2,Cr2]=RGB2YCbCr(image_B);
    [H,W]=size(Cb1);
    Cb=ones([H,W]);
    Cr=ones([H,W]);
    for k=1:H
        for n=1:W
            if (abs(Cb1(k,n)-128)==0&&abs(Cb2(k,n)-128)==0)  
                Cb(k,n)=128;
            else
                middle_1= Cb1(k,n)*abs(Cb1(k,n)-128)+Cb2(k,n)*abs(Cb2(k,n)-128);
                middle_2=abs(Cb1(k,n)-128)+abs(Cb2(k,n)-128);
                Cb(k,n)=middle_1/middle_2;
            end
            if (abs(Cr1(k,n)-128)==0&&abs(Cr2(k,n)-128)==0)
                Cr(k,n)=128;  
            else
                middle_3=Cr1(k,n)*abs(Cr1(k,n)-128)+Cr2(k,n)*abs(Cr2(k,n)-128);
                middle_4=abs(Cr1(k,n)-128)+abs(Cr2(k,n)-128); 
                Cr(k,n)=middle_3/middle_4;
            end
        end
    end
    I_final_YCbCr=cat(3,I_result,Cb,Cr);
    I_final_RGB=YCbCr2RGB(I_final_YCbCr);
    imwrite(uint8(I_final_RGB), save_name);
    disp(save_name);
end
%% 只有一幅源图像为彩色图像
clc;
clear all;
A_dir = fullfile('..\Data\VIF\MSRS\vi'); % 包含所有源图像A的文件夹路径
Fused_dir = fullfile('..\Comparison\VIF\SwinFusion_MSRS_Y'); % 融合图像的Y通道的文件夹路径
save_dir = fullfile('..\Comparison\VIF\SwinFusion_MSRS'); % 彩色融合图像的文件夹路径
fileFolder=fullfile(A_dir);
dirOutput=dir(fullfile(fileFolder,'*.png'));
fileNames = {dirOutput.name};
[m, num] = size(fileNames);
if exist(save_dir,'dir')==0
	mkdir(save_dir);
end
for i = 1:num
    name_A = fullfile(A_dir, fileNames{i});
    name_fused = fullfile(Fused_dir, fileNames{i});
    save_name = fullfile(save_dir, fileNames{i});    
    image_A = double(imread(name_A));
    I_result = double(imread(name_fused));
    [Y1,Cb1,Cr1]=RGB2YCbCr(image_A);
    I_final_YCbCr=cat(3,I_result,Cb1,Cr1);
    I_final_RGB=YCbCr2RGB(I_final_YCbCr);
    imwrite(uint8(I_final_RGB), save_name);
    disp(save_name);
end

所有程序以打包至:https://download.csdn.net/download/fovever_/85309610
如有疑问请联系作者。

你可能感兴趣的