水下图像融合增强Enhancing Underwater Images and Videos by Fusion

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a6333230/article/details/86288906

这篇文章可以说结果好到令人拍案叫绝,处理后细节也好了,色偏也好了,更主要是那些评价指标仿佛都是为它设计的,一个比一个好,本文就详细地介绍一下水下图像融合算法。

1.首先先分别进行两次处理

①对原图进行白平衡处理——详细地可以看它的代码,代码是改良的灰度世界,个人觉得是一个灰度世界+一个直方图均衡。处理结果作为输入一。

②对白平衡后的图进行亮通道自适应直方图均衡化

(亮通道:CIElab颜色模型的l通道;自适应:不是针对整幅图像的处理,而是不图像分成各个块进行处理,这样不在一块的暗的地方不会对亮的地方造成影响,处理完成后再对块直接进行过度)该项作为输入二。
在这里插入图片描述
左图为输入一,右图为输入二

3.不同权重

本文的权重用了四种,而这四种的用途是为了说明图一和图二组合怎样好。

①全局对比度:拉普拉斯用于亮通道,提高全局的明暗对比。
在这里插入图片描述
②局部对比度:图像亮通道点减去以该点为核心做的低通二项核卷积,最后取平方。

h = 1/16* [1, 4, 6, 4, 1];
Wcont1 = imfilter(R1, transpose(h)*h, 'replicate', 'conv');
Wcont1 = (R1 - Wcont1).^2;

③采用加入曝光图保护中间色调的显著图

function sm = saliency_detection(img)
%
%---------------------------------------------------------
% Read image and blur it with a 3x3 or 5x5 Gaussian filter
%---------------------------------------------------------
%img = imread('input_image.jpg');%Provide input image path
gfrgb = imfilter(img, fspecial('gaussian', 3, 3), 'symmetric', 'conv');
%---------------------------------------------------------
% Perform sRGB to CIE Lab color space conversion (using D65)
%---------------------------------------------------------
%cform = makecform('srgb2lab', 'whitepoint', whitepoint('d65'));
cform = makecform('srgb2lab');
lab = applycform(gfrgb,cform);
%---------------------------------------------------------
% Compute Lab average values (note that in the paper this
% average is found from the unblurred original image, but
% the results are quite similar)
%---------------------------------------------------------
l = double(lab(:,:,1)); lm = mean(mean(l));
a = double(lab(:,:,2)); am = mean(mean(a));
b = double(lab(:,:,3)); bm = mean(mean(b));
%---------------------------------------------------------
% Finally compute the saliency map and display it.
%---------------------------------------------------------
sm = (l-lm).^2 + (a-am).^2 + (b-bm).^2;

④暴露权重
离中间值0.5越近,权重越大,越远,权重越小。(防止曝光不足/过曝)
在这里插入图片描述

4.组合

可以看出左图输入图一整体色调啥的比较好,而右图输入图二画面感很差,可是它的优点就在于它的边缘很好。现在的问题就是如何把输入一的画面感和输入二的细节结合起来,这样解决方法就来了——图一和图二不同权重的组合+不同尺度的组合。
不同权重——一个输出图的像素点是由图一乘以自己的权重+图二乘以自己的权重得到的。(后续还有一个拉普拉斯变换)
不同尺度——把图像分成几个尺度,对每个尺度都处理一次,然后再把多尺度合回原单一尺度。(这一步真的起到的作用多大?不好说。)
本文融合用到的金字塔:
拉普拉斯金字塔——金字塔上一层尺寸是下一层1/4。图像经过卷积和下采样操作会丢失部分高频细节信息(这个是图像金字塔的核心,不同尺度可以理解为不同距离看它,远距离看图比近距离当然模糊了,我们用模糊和清晰来代表远近看图的区别)。拉普拉斯金字塔是高斯金字塔上下两层同一尺寸的差值,这里的同一尺寸指上层图像进行上采样后,尺寸恢复到降采样之前,也就是下层的尺寸。

归一化权重(为了图一和图二合起来为1,不超过1)

% calculate the normalized weight
W1 = (Wlap1 + Wcont1 + Wsal1 + Wexp1) ./ (Wlap1 + Wcont1 + Wsal1 + Wexp1 + Wlap2 + Wcont2 + Wsal2 + Wexp2);
W2 = (Wlap2 + Wcont2 + Wsal2 + Wexp2) ./ (Wlap1 + Wcont1 + Wsal1 + Wexp1 + Wlap2 + Wcont2 + Wsal2 + Wexp2);

将图进行拉普拉斯金字塔拆分

% calculate the gaussian pyramid
level = 5;
Weight1 = gaussian_pyramid(W1, level);
Weight2 = gaussian_pyramid(W2, level);

然后在每个金字塔层进行组合

for i = 1 : level
    r_py{i} = Weight1{i} .* R1{i} + Weight2{i} .* R2{i};
    g_py{i} = Weight1{i} .* G1{i} + Weight2{i} .* G2{i};
	b_py{i} = Weight1{i} .* B1{i} + Weight2{i} .* B2{i};
end

将组合好的值恢复回原图

for i = level : -1 : 2
    [m, n] = size(g_py{i - 1});
    g_py{i - 1} = g_py{i - 1} + imresize(g_py{i}, [m, n]);
end
G = g_py{1};

这就是融合的全过程,通过正个流程下来,学习了一种新的方法,如何将两个优点不同的图进行组合生成更好的图???可以用这种方法

猜你喜欢

转载自blog.csdn.net/a6333230/article/details/86288906