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