图像增强序列——A Variational Framework for Retinex

1. 参考文献

2. 模型实现(这个实现效果不好,仅仅作为参考,欢迎大家能够批评指正, 因为效果不好,就不呈现模型效果了,可能理解不是特别到位,如果以后有新的理解,将会进行代码更新,如果您有相关的代码也请不吝分享)

% 论文: A_Variational_Framework_for_Retinex
% 作者:
% 链接:
% Author:
% Date; 2018-05-01
%

clc;
close all;
clear;

img = imread('timg1.png');
 
% 调整到2的指数倍
img = imresize(img, [2^(ceil(log2(size(img, 1)))), 2^(ceil(log2(size(img, 2))))]);

[m, n, dims] = size(img);

% Gauss的的级数
p       = 4;
maxIter = 500;
alpha   = 1;
beta    = 1;
gama    = 3;
W       = 255; 
% 创建Gauss金字塔图像
K_pry = [1/16, 1/8, 1/16, 1/8, 1/4, 1/8, 1/16, 1/8, 1/16];
K_pry = reshape(K_pry, [3, 3]);

% Laplace算子
K_lap = [0, 1, 0, 1, -4, 1, 0, 1, 0];
K_lap = reshape(K_lap, [3,3]);

result = img;

if dims == 1
    s = log(double(img) + ones([m, n]));
    % 多尺度 s_Pyr
    s_Pyr = Compute_Gaussian_Pyramid(s, p, K_pry);
    for iter = p : -1 : 1
        s_iter = s_Pyr{iter};
        if iter == p
            l = ones(size(s_iter)) * max(max(s_iter));
            l = compute_opt(s_iter, l,  K_lap, maxIter, alpha, beta);
        else
            l = imresize(l, size(s_iter));
            l = compute_opt(s_iter, l,  K_lap, maxIter, alpha, beta);
        end
    end
    result = exp(s - l);
elseif dims == 3
    lab = rgb2hsv(img);
    s = log(lab(:, :, 3) + ones([m, n])); 
    figure; 
    imshow(s, []); 
    title('s'); 
    % 多尺度 s_Pyr
    s_Pyr = Compute_Gaussian_Pyramid(s, p, K_pry);
    for iter = p : -1 : 1
        s_iter = s_Pyr{iter};
        if iter == p
            l = ones(size(s_iter)) * max(max(s_iter));
            figure;
            imshow(l, []);
            title(['iter(A): ', num2str(iter)]);
            l = compute_opt(s_iter, l, K_lap, maxIter, alpha, beta);
            figure;
            imshow(l, []);
            title(['iter(B): ', num2str(iter)]);
        else
            l = imresize(l, size(s_iter));
            figure;
            imshow(l, []);
            title(['iter(A): ', num2str(iter)]);
            l = compute_opt(s_iter, l, K_lap, maxIter, alpha, beta);
            figure;
            imshow(l, []);
            title(['iter(B): ', num2str(iter)]);
        end
    end
    L = exp(l);
	S = lab(:,:,3); 
    lab(:,:,3) =  S ./ power(L ./ W, 1 - 1.0 / gama);  
    result = hsv2rgb(lab);
end

figure;
imshow(img, []);
title('原图像');

figure;
imshow(result, []);
title('增强结果');

function s_pyr = Compute_Gaussian_Pyramid(s, layers, K_pyr)
% Inputs:
%        s: 建立Gaussian金字塔的原图像
%        layers: layers = 1表示原图像
%        K_pry: image smoothing kernel
% Outputs:
%        s_pyr:
%
%  Author: HSW
%  Date: 2018-05-01
%

s_pyr = cell(layers, 1);
s0 = conv2(s, K_pyr, 'same');
% figure; 
% imshow(s0, []);
% title('s0'); 
for iter = 1:layers
    s_pyr{iter} = imresize(s0, [size(s0,1)/(2^(iter - 1)), size(s0, 2) / (2^(iter - 1))]);
%     figure; 
%     imshow(s_pyr{iter}, []); 
%     title(['s_pyr{', num2str(iter), '}']); 
end

end

function l = compute_opt(s, l0, K_lap, maxIter, alpha, beta)
% Inputs: 
%       s:  输入图像
%       l0: 初始的l
%       K_lap: Laplace Kernel 
%       maxIter: 最大迭代次数
%       alpha: 模型权重系数
%       beta: 模型权重系数
% Outputs: 
%       l: 迭代结果
% 
% Author: HSW
% Date: 2018-05-01 
% 

G_b = conv2(s, K_lap, 'same'); 
% figure; 
% imshow(G_b, []); 
% title('G_{b}'); 

% 初始化
l   = l0; 

for iter = 1 : maxIter
    % 计算梯度
    G_a = conv2(l, K_lap, 'same'); 
%     figure; 
%     imshow(G_a, []); 
%     title('G_{a}'); 
    G = G_a + alpha * (l - s) - beta * (G_a - G_b); 
%     figure; 
%     imshow(G,[]); 
%     title('G'); 
    % 计算 Mu_nsd 
    Mu_a = sum(sum(G .* G)); 
    G_lap = conv2(G, K_lap, 'same'); 
    Mu_b = - sum(sum(G .* G_lap)); 
    tmp = (alpha * Mu_a + (1 + beta) * Mu_b); 
    mu_nsd = Mu_a / (tmp + (tmp == 0) * 0.0001); 
    % 计算NSD 迭代
    l = l - mu_nsd .* G; 
    % 投影限制
    l = max(s, l); 
    
end 

end 

猜你喜欢

转载自blog.csdn.net/hit1524468/article/details/80158743
今日推荐