图像融合系列博客还有:
本博客主要介绍如何处理图像融合问题中的色彩信息。大部分算法都可以将彩色图像从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
如有疑问请联系作者。