水下图像色彩还原(基于可见光衰减及图像去雾算法)

参考源

参考论文:UnderwaterHazeLines_BMVC2017
Github项目地址:https://github.com/danaberman/underwater-hl.git

对论文的一些重述

水下图像存在颜色失真和低对比度的问题,因为光在水中传播时会衰减。衰减随波长而变化,并且取决于拍摄图像的水体的属性和场景的3D结构,使得难以恢复颜色。现有的单一水下图像增强技术要么忽略衰减的波长依赖性,要么采用特定的光谱轮廓。
我们提出了一种新的方法,该方法考虑了不同水类型的多个光谱剖面,并从单个图像恢复水下场景。我们表明,通过仅估计两个附加的全局参数——蓝-红和蓝-绿颜色通道的衰减比——水下图像恢复的问题可以被简化为单个图像去雾,其中所有颜色通道具有相同的衰减系数。因为我们事先不知道水的类型,所以我们从现有的水类型库中尝试不同的参数集。每个集合导致不同的恢复图像,并且选择最满足灰色世界假设的一个。
所提出的单一水下图像恢复方法是全自动的,并且基于比以前使用的更全面的物理图像形成模型。我们收集了在不同地点拍摄的不同水质的真实图像数据集,并在场景中放置了彩色图表。此外,为了获得地面真实,基于立体成像计算场景的三维结构。该数据集能够对自然图像上的恢复算法进行定量评估,并且显示了所提出的方法的优势。

算法实现流程

  1. 使用结构化边缘检测工具生成场景的边缘图,通过阈值边缘映射,寻找最大的连接分量。
  2. 对每种杰洛夫水类型的蓝-红和蓝-绿两个衰减比率进行迭代,返回最符合像素灰度世界假设的图像。
  3. 每一次迭代过程可对传输值进行确定(传输取决于物体距离和每个通道的光衰减系数),我们将其代入色彩衰减补偿方程,即可对图像进行色彩还原。
  4. 最后基于灰度世界假设(世界表面的平均反射率是无色的)自动选择最佳结果。

复现代码过程

选项A:使用git

# 下载项目到本地
git clone https://github.com/danaberman/underwater-hl.git
# 进入underwater-hl文件夹
cd underwater-hl
# 下载工具箱
git submodule init
git submodule update

在这里插入图片描述
在这里插入图片描述运行完之后,原本空的edges和toolbox文件夹便有有了一些文件!

选项B:不使用git

  1. 将项目下载为zip文件
  2. https://github.com/pdollar/toolbox下载toolbox工具箱,删除原有空的toolbox文件夹,将toolboxes-master解压,并命名为toolbox。
  3. 同理可得,从https://github.com/pdollar/edges下载工具箱,解压并命名为edges。

关于代码的一些修改

下载完两个工具箱之后,运行main_underwater_restoration.m即可,在运行之前你可能需要修改一些路径:toolbox工具箱的路径、edges工具箱的路径、图片的文件夹路径以及图片的名字特征。下面代码给出了几处需要修改的地方以及注释。

%% Set paths, clear variables
clear variables; dbstop if error;

% External libraries used: the toolbox by Piotr Dollar and the Structures Edge 
% Detector 

% https://github.com/pdollar/toolbox
%这是toolbox工具箱的路径,fullfile可以自动将两个参数连接为'utils/toolbox'
toolbox_path = fullfile('utils', 'toolbox');
% https://github.com/pdollar/edges
%这是edges工具箱的路径,fullfile可以自动将两个参数连接为'utils/edges'
edges_path = fullfile('utils', 'edges');

addpath('utils')
addpath(edges_path)
addpath(genpath(toolbox_path))

% Suppress Warning regarding image size
warning('off', 'Images:initSize:adjustingMag');
feature('DefaultCharacterSet', 'UTF8');

%% Folders etc.
% A few example input images are saves in this sub-directory. 
% The code can run on either sRGB or raw images
%这是需要处理的图片的文件夹,根据需要修改为对应路径
images_dir = 'images';
%通过后缀的一些信息确定待处理图片的一些信息,比如我的图片后缀有_input的标识。
listing = cat(1, dir(fullfile(images_dir, '*_input.jpg')), ...
    dir(fullfile(images_dir, '*.CR2')));

% The final output will be saved in this directory:
result_dir = fullfile(images_dir, 'results');

% Preparations for saving results.
if ~exist(result_dir, 'dir'), mkdir(result_dir); end
jetmap = jet(256);  % Colormap for transmission.
verbose = false;    % Whether to print and save verbose details.
max_width = 2010;   % Maximum image width - larger images will be resized.

%% Actual running
for i_img = 1:length(listing)
    [img_out, trans_out, A, estimated_water_type] = uw_restoration(...
        listing(i_img).name, listing(i_img).folder, edges_path, max_width, ...
        result_dir, verbose);

    [~, img_name, ~] = fileparts(listing(i_img).name);
    % Some images have '_input' suffix, which is confusing in output
    % filename, and therefore removed.
    img_name = strrep(img_name, '_input', '');
    % Save the enhanced image and the transmission map.
    imwrite(im2uint8(img_out), fullfile(result_dir, [img_name, '_output_img.jpg']));
    imwrite(im2uint8(trans_out), jetmap, fullfile(result_dir, [img_name, '_output_trans.jpg']));
end  % loop on different images

运行代码之后,images文件夹里面会生成results文件夹,里面会保存已经处理好的图片!

复现效果展示

复现结果对比这是我们在进行水下图像色彩还原时的一些结果对比,从图中可以看出GladNet等一些算法并没有很好地对颜色进行还原,只是在亮度等方面对图像进行操作;基于可见光衰减与图像去雾的水下图像还原算法考虑了不同水类型的多个光谱剖面,并从单个图像恢复水下场景。根据不同的杰洛夫水类型,采用不同的衰减系数来进行多次还原,并基于灰色世界假设自动选择最佳结果!

  • 13
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值