图像增强序列——基于Lab色彩空间和色调映射的彩色图像增强算法

1. 参考文献


2. 模型实现

% 论文: 基于Lab色彩空间和色调映射的彩色图像增强算法
% 作者:
% 链接: http://www.jsjkx.com/jsjkxen/ch/reader/create_pdf.aspx?file_no=20180251&year_id=2018&quarter_id=2&falg=1
% Author: HSW
% Date: 2018-04-26

clc;
close all;
clear all;

img = imread('timg.jpg');

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

if size(img, 3) == 3
    img_in = img;
    img_lab = rgb2lab(img_in);  % 颜色转换: RGB => Lab
    L  = img_lab(:, :, 1);       % 亮度分量
    La = img_lab(:, :, 2);
    Lb = img_lab(:, :, 3);
    [m, n] = size(L);
    % 进行双边滤波
    ksize = 5;
    hsize = floor(ksize/2);
    sigma1 = 3;  % 空间
    sigma2 = 5;  % 亮度
    mean1 = 0;
    mean2 = 0;
    bilKernel = bilateralKernel(sigma1, mean1, sigma2, mean2, ksize);
    sumKernel = sum(sum(bilKernel));
    T = 10;
    mu = 35.3;
    L_img = L;              % 光照分量
    R_img = ones(size(L));  % 反射分量
    for i = hsize + 1: m - hsize
        for j = hsize + 1: n - hsize
            d = zeros(ksize, ksize);
            L_patch = L(i + [-hsize:hsize], j + [-hsize:hsize]);
            La_patch = La(i + [-hsize:hsize], j + [-hsize:hsize]);
            La_center = ones(ksize, ksize) .* La(i, j);
            Lb_patch = Lb(i + [-hsize:hsize], j + [-hsize:hsize]);
            Lb_center = ones(ksize, ksize) .* Lb(i, j);
            d = sqrt((La_patch - La_center).^2 + (Lb_patch - Lb_center).^2) < T;
            L_img(i, j) = sum(sum(d .* bilKernel .* L_patch)) / sumKernel;
        end
    end
    R_img = L ./ L_img;
    % 计算抛物线偏离值: lambda
    L_hist = zeros(101, 1);        % 取值范围为[0. 100]
    U_hist = zeros(101, 1);
    for i = 1: 101
        U_hist = i * 1.0 / 101;
    end
    
    % 输入图像的L分量的累积概率分布函数: 采用直方图均衡化
    for i = 1:m
        for j = 1:n
            L_hist(uint8(L_img(i, j)) + 1) = L_hist(uint8(L_img(i, j)) + 1) + 1;
        end
    end
    
    for i = 1:101
        if i == 1
            L_hist(i) = L_hist(i);
        else
            L_hist(i) = L_hist(i) + L_hist(i - 1);
        end
    end
    
    L_hist = L_hist ./ (m * n * 1.0);
    
    % 进行直方图均衡化
    Cumu_img = 100 .* L_hist;
    L_img_eq = L_img;
    for i = 1:m
        for j = 1:n
            L_img_eq(i,j) = Cumu_img(uint8(L_img(i,j)) + 1);
        end
    end
    
    img_lab_eq = img_lab;
    img_lab_eq(:, :, 1) = L_img_eq .* R_img;
    img_rgb = lab2rgb(img_lab_eq);
    
    lambda = sum(L_hist - U_hist);
    
    if abs(lambda) > mu
        lambda = sign(lambda) * mu;
    end
    
    figure(2);
    imshow(img_rgb, []);
    title('直方图均衡化:增强结果');
%     % 抛物线映射没有理解
%     % 进行抛物线拟合: (0, 0) (100, 100) (50 - sqrt(2) * lambda), 50 + sqrt(2) *
%     % lambda)
%     
%     x = [0, 100, (50 - sqrt(2) * abs(lambda)];
%     y = [0, 100, (50 + sqrt(2) * abs(lambda)];
%     p = polyfit(x,y,2);
%     
%     L_img_new = L_img;
%     for i = 1:m
%         for j = 1:n
%             L_img_new(i, j, 1) = polyval(p, L_img_new(i, j, 1));
%         end
%     end
%     
%     img_lab_new = img_lab;
%     img_lab_new(:, :, 1) = L_img_new(:, :, 1) .* R_img;
%     img_rgb_new = lab2rgb(img_lab_new);
%     figure(3);
%     imshow(img_rgb_new, []);
%     title('抛物线均衡化: 增强结果');
    
else
    disp('必须输出彩色图像')
end

3. 模型效果


猜你喜欢

转载自blog.csdn.net/hit1524468/article/details/80101427