如下图所示,首先作者把图像从RGB通道转到HSV通道(H:色相 S:饱和度 V:亮度),接着对V通道进行不同的(函数)操作得到三个输入图像,然后通过拉普拉斯金字塔和高斯金字塔进行多尺度融合,最后再将融合后的图像转回RGB通道。
通过log函数对V通道图像进行处理,在增加暗像素的亮度同时压缩动态图像,从而达到增强细节的目的。 α是表示图像亮度的系数,默认值为0.5; 加上一个“1”以确保I是正的。
与V通道图像对比效果:
采用单调递增的gamma函数来降低大值。 γ是自适应因子,它取决于低像素的数量
与V通道图像对比效果:
采用GUM方法,之前没听过,查了一下中文解释是:反锐化掩蔽 ,好高深的样子…… 理解一下,锐化的反面就是平滑,那“反锐化”应该就是平滑的意思。“掩蔽”我觉得可以理解为减去或者除去。加起来就是对V通道图像进行减去平滑处理后得到的图像,所以就是为了增强边缘和细节。
与V通道图像对比效果: GUM函数
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通过对0.5的差值来作为每个像素点的权重,生成权重矩阵。
降低过度曝光、曝光不足的像素值,而正常曝光的像素则拥有较大的像素值。 由于有三张输入图片,所以进行归一化处理:
前边得到了输入图像和权值,如果直接将他们加权融合,很容易产生光晕
在融合过程中,对输入图像进行拉普拉斯金字塔,对权值进行高斯金字塔处理: 因此,V(x,y)的结果是通过分别混合拉普拉斯输入和高斯权重映射得到的 具体代码如下所示:
拉普拉斯金字塔函数
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 = 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 = 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};在下图中,根据与其他几种方法的对比,可以看到: b是带颜色恢复的多尺度Retinex方法:尤其是最后一张女孩,可以看到颜色失真很严重; c存在背景过度曝光的问题; d的增强效果不明显。
在表一中,NIQE使用图像中观察到的统计规律的可测量偏差,值越低表示质量越高 表二是时间的比较