一种基于融合的单背光低照度图像增强策略(matlab)

一种基于融合的单背光图像增强策略(matlab)

  1. 简单介绍
    这是一篇2016年ICIP发表的一篇论文《A FUSION-BASED METHOD FOR SINGLE BACKLIT IMAGE ENHANCEMENT》主要关于低照度单背光图像增强利用了融合的的策略,在学习的过程中,也是觉得其融合思想较好,所以想记录分享一下。
  2. 论文思想
    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY5MDkzNQ==,size_16,color_FFFFFF,t_70
    整个算法思路可以从上面的图中可以看出来,下面介绍一下其中间多尺度融合的思路,主要是为了提升图像的亮度和细节部分。
    论文在在HSV空间中进行的,提取V亮度通道对图像进行不同的处理得到三幅融合初始图像。

20200215214746719.png

第一图像的输入是log变换,通过拉伸暗部值和压缩亮部值来增强细节。
20200215214925110.png
第二个图像的输入是gamma变换, γ 的值取决于暗像素的多少。

20200215215211711.png
第三个图像的输入是为了增强对比度,提出了一种通用的非锐化掩蔽算法(GUM),网上应该有类似的介绍。
重点是下面的融合策略是学习图像融合的一种常见思路。亮度的提高和对比度的增强是对图像的预处理。为了使结果图像更符合人类的视觉感知,我们使用比权映射来测量和提取输入图像的更多细节。由于问题的本质是背光,这更与曝光有关。
20200215215707510.png
K是分别输入的初始三幅图像, σ =0 .3,为了得到一致的结果,我们对得到的三幅不同权重值进行归一化处理,也就是每一个权重占总权重的比例,最后合起来为1。
最后的图像融合部分是利用拉普拉斯金字塔和高斯金字塔进行多分辨率重构,解决图像中存在的光晕问题。
20200215220258138.png
L是金字塔的层数。其他变量和上面相同。最后转回到RGB空间即可实现。
3、实验结果
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY5MDkzNQ==,size_16,color_FFFFFF,t_70watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY5MDkzNQ==,size_16,color_FFFFFF,t_70
原图
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY5MDkzNQ==,size_16,color_FFFFFF,t_70watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDY5MDkzNQ==,size_16,color_FFFFFF,t_70
最后得到的结果图像
4、附上实验代码

%%
clc
clear
I=im2double(imread('./backlit/3.jpg'));
% imshow(I);figure;
HSV=rgb2hsv(I);
H=HSV(:,:,1);S=HSV(:,:,2);V=HSV(:,:,3); 
[m,n]=size(H);
% imshow(V)
%im1 log
% im1=log(0.5*(V+1)+1);
im1=V.^0.35;
% imshow(im1);figure;
%im2 gamma
a=50/255;
index=V<a;
index=double(index);
M=sum(index(:));
N=n*m;
gamma=(N-M)/N;
im2=1-(1-V).^gamma;
% imshow(im2);figure;
%im3 GUM
im3=gum(V);
% imshow(im3);figure;

%weight
sigma = 0.25;
aver = 0.3;
WE1= exp(-(im1 - aver).^2 / (2*sigma^2));
WE2=exp(-(im2 - aver).^2 / (2*sigma^2));
WE3=exp(-(im3 - aver).^2 / (2*sigma^2));
sumW=WE1+WE2+WE3;
W1=WE1./sumW;
W2=WE2./sumW;
W3=WE3./sumW;

% Multi-scale fusion
level=4;
G1=gaussian_pyramid(W1,level);
G2=gaussian_pyramid(W2,level);
G3=gaussian_pyramid(W3,level);
L1=laplacian_pyramid(im1,level);
L2=laplacian_pyramid(im2,level);
L3=laplacian_pyramid(im3,level);
for i=1:level
    F{i}=G1{i}.*L1{i}+G2{i}.*L2{i}+G3{i}.*L3{i};
end
Vfinal=pyramid_reconstruct(F);
% imshow(Vfinal);figure;
hsv=cat(3,H,S,Vfinal);
rgb=hsv2rgb(hsv);
imshow([I rgb]);
imwrite(rgb,'1.png');
function [ v2 ] = gum( x1 )
x1=im2double(x1);
[ m, n, k ] = size( x1 );
x = x1;
mask = ( 1 / 25 ) * ones( 5, 5 );
y1 = conv2( x, double( mask ), 'same' );
d = x - y1;
g = 3 .* d;
v1 = y1 + g;
y2 = medfilt2( x, [ 3, 3 ] );
X = ( 1 - x ) ./ max( x, 0.01 );
Y = ( 1 - y2 ) ./ max( y2, 0.01 );
I = ones( m, n );
d1 = I ./ ( 1 + ( X ./ Y ) );
h = adapthisteq( y2, 'clipLimit', 0.005 );
c = ( 2 .* d1 ) - 1;
Gmax = 5;Gmin = 1;eta = 0.5;
beta = ( Gmax - Gmin ) / ( 1 - exp(  - 1 ) );
alpha = ( Gmax - beta );
gama = alpha + ( beta * exp(  - 1 .* abs( c ) .^ eta ) );
D = ( 1 - d1 ) ./ max( d1, 0.01 );
g = I ./ ( 1 + D .^ gama );
G = ( 1 - g ) ./ max( g, 0.01 );
H = ( 1 - h ) ./ max( h, 0.01 );
v2 = I ./ max( 0.1, ( 1 + ( H .* G ) ) );
t = v2 > 1;
v2( t ) = x( t );
end  

function out = gaussian_pyramid(img, level)
h = 1/16* [1, 4, 6, 4, 1];
filt = h'*h;
out{1} = imfilter(img, filt, 'replicate', 'conv');
temp_img = img;
for i = 2 : level
    temp_img = temp_img(1 : 2 : end, 1 : 2 : end);
    out{i} = imfilter(temp_img, filt, 'replicate', 'conv');
end
function out = laplacian_pyramid(img, level)
h = 1/16* [1, 4, 6, 4, 1];
%filt = h'*h;
out{1} = img;
temp_img = img;
for i = 2 : level
    temp_img = temp_img(1 : 2 : end, 1 : 2 : end);
    %out{i} = imfilter(temp_img, filt, 'replicate', 'conv');
    out{i} = temp_img;
end
% calculate the DoG
for i = 1 : level - 1
    [m, n] = size(out{i});
    out{i} = out{i} - imresize(out{i+1}, [m, n]);
end
function out = pyramid_reconstruct(pyramid)
level = length(pyramid);
for i = level : -1 : 2
    %temp_pyramid = pyramid{i};
    [m, n] = size(pyramid{i - 1});
    %out = pyramid{i - 1} + imresize(temp_pyramid, [m, n]);
    pyramid{i - 1} = pyramid{i - 1} + imresize(pyramid{i}, [m, n]);
end
out = pyramid{1};
end

代码是别人的,可以跟着写,我只是互联网的搬运工。

 

  • 13
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月蹉跎的一杯酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值