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

2023-05-16

参考源

参考论文: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等一些算法并没有很好地对颜色进行还原,只是在亮度等方面对图像进行操作;基于可见光衰减与图像去雾的水下图像还原算法考虑了不同水类型的多个光谱剖面,并从单个图像恢复水下场景。根据不同的杰洛夫水类型,采用不同的衰减系数来进行多次还原,并基于灰色世界假设自动选择最佳结果!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 《画解数据结构》九张动图,画解顺序表

    本文已收录于专栏 画解数据结构 零 前言 目前本专栏正在进行优惠活动 在博主主页添加博主好友 好友位没有满的话 可以获取 付费专栏优惠券 这篇文章 作者将用 七张动图 来阐述一种最基础的顺序结构 顺序表 相信看我文章的大多数都是 大学生 能
  • 《画解数据结构》十张动图,画解双端队列

    本文已收录于专栏 画解数据结构 零 前言 目前本专栏正在进行优惠活动 在博主主页添加博主好友 好友位没有满的话 可以获取 付费专栏优惠券 数据结构 和 算法 是密不可分的 两者往往是 相辅相成 的存在 所以 在学习 数据结构 的过程中 不免
  • 《画解数据结构》二十五彩图,画解平衡二叉树

    本文已收录于专栏 画解数据结构 前言 目前本专栏正在进行优惠活动 在博主主页添加博主好友 好友位没有满的话 可以获取 付费专栏优惠券 上一篇文章 二叉搜索树 中 对于 增 删 改 查 的时间复杂度为 O l o g
  • 安装ofsoftswitch13的问题解决

    安装ofsoftswitch13的问题解决 cmake时出现错误 xff0c 是因为前面的库有的没有安装好 xff0c 安装好以后 xff0c 错误消失 根据CPqD ofsoftswitch13 OpenFlow 1 3 switch 给
  • 《画解数据结构》之画解二叉树

    本文已收录于专栏 画解数据结构 前言 目前本专栏正在进行优惠活动 在博主主页添加博主好友 好友位没有满的话 可以获取 付费专栏优惠券 数据结构 和 算法 是密不可分的 两者往往是 相辅相成 的存在 所以 在学习 数据结构 的过程中 不免会遇
  • 《画解数据结构》三十张彩图,画解二叉搜索树

    本文已收录于专栏 画解数据结构 前言 目前本专栏正在进行优惠活动 在博主主页添加博主好友 好友位没有满的话 可以获取 付费专栏优惠券 我们知道 顺序表 可以 快速索引 数据 而 链表 则可以快速的进行数据的 插入 和 删除 那么 有没有一种
  • 《画解数据结构》九张图画解二叉堆

    本文已收录于专栏 x1f333 画解数据结构 x1f333 前言 目前本专栏正在进行优惠活动 xff0c 在博主主页添加博主好友 xff08 好友位没有满的话 xff09 xff0c 可以获取 付费专栏优惠券 在之前的文章 二叉搜索树 中
  • 《算法零基础100讲》(第1讲) 幂和对数

    文章目录 零 写在前面 一 概念定义 1 幂 2 对数 3 换底公式 二 题目描述 三 算法详解 四 源码剖析 五 推荐专栏 六 习题练习 零 写在前面 目前本专栏正在进行优惠活动 在博主主页添加博主好友 好友位没有满的话 可以获取 付费专
  • 《算法零基础100讲》(第2讲) 数列

    文章目录 零 写在前面 一 概念定义 1 等差数列 2 等比数列 3 斐波那契数列 二 题目描述 三 算法详解 四 源码剖析 五 推荐专栏 六 习题练习 零 写在前面 这是 算法零基础100讲 专栏打卡学习的第 2 天了 如果觉得本专栏太贵
  • 《LeetCode零基础指南》(第九讲) 简单递归

    文章目录 零 了解网站 1 输入输出 2 刷题步骤 3 尝试编码 4 调试提交 一 概念定义 1 递归的含义 2 递归调用阶乘 1 实现一个函数 2 递归出口 3 递推关系 3 为什么叫递归 二 题目分析 1 阶乘尾后零 2 将数字变成 0
  • 《LeetCode零基础指南》(第八讲) 二级指针

    文章目录 零 了解网站 1 输入输出 2 刷题步骤 3 尝试编码 4 调试提交 一 概念定义 1 二级指针 2 解引用 3 力扣中的二级指针 4 内存申请模板 二 题目分析 1 翻转图像 2 转置矩阵 3 重塑矩阵 4 将一维数组转变成二维
  • 《LeetCode零基础指南》(第七讲) 二维数组

    文章目录 零 了解网站 1 输入输出 2 刷题步骤 3 尝试编码 4 调试提交 一 概念定义 1 矩阵的定义 2 矩阵的水平翻转 3 矩阵的垂直翻转 4 矩阵的顺时针旋转 5 矩阵的逆时针旋转 6 矩阵的转置 7 二维数组 8 二维数组的索
  • 《LeetCode零基础指南》(第五讲) 排序API

    文章目录 零 了解网站 1 输入输出 2 刷题步骤 3 尝试编码 4 调试提交 一 概念定义 1 排序简介 2 qsort 简介 3 qsort 调用 4 比较函数 1 函数原型 2 函数定义 3 简化写法 5 更多比较函数 二 题目分析
  • 《LeetCode零基础指南》(第三讲) 一维数组

    文章目录 零 了解网站1 输入输出2 刷题步骤3 尝试编码4 调试提交 一 概念定义1 顺序存储2 存储方式3 长度和容量4 数组的索引5 数组的函数传参 二 题目分析1 数组的查找2 数组的最小值3 斐波那契数列4 绝对值为 k 的数对5
  • js拼字符串,显示在页面上,出现undefined字样处理办法

    首先 xff0c 你需要明白为什么会出现undefined xff0c 这个东西是什么 xff1f undefined是说明你所使用的对象未定义 xff0c 为什么会未定义 xff1f 例如 xff1a var str str 61 str
  • 《LeetCode零基础指南》导读

    文章目录 一 出该专栏的目的 二 本专栏适宜人群 三 本专栏涉及的知识点 四 本专栏收费模式 五 付费玩家专属福利 六 专栏阅读须知 七 配套赠送福利 一 出该专栏的目的 由于之前的 算法零基础100讲 为很多真正零基础的同学造成了困扰 他
  • 《LeetCode零基础指南》(第一讲) 函数

    文章目录 零 了解网站1 输入输出2 刷题步骤3 尝试编码4 调试提交 一 概念定义1 函数简介2 函数的基本概念3 函数的基本结构4 返回类型5 函数名6 参数列表7 函数体8 返回值 二 题目分析1 整数乘法2 整数除法3 次幂函数4
  • 《算法零基础100讲》导读

    文章目录 一 为什么要学算法 二 本专栏适宜人群 三 本专栏涉及的算法 四 本专栏收费模式 五 收费玩家专属福利 六 专栏阅读须知 七 配套赠送福利 一 为什么要学算法 如果你只是想学会写代码 或许 算法与数据结构 并不是那么重要 但是 想
  • 《LeetCode零基础指南》(第二讲) 循环

    文章目录 零 了解网站1 输入输出2 刷题步骤3 尝试编码4 调试提交 一 概念定义1 语法规则2 简单应用3 初始化表达式1 xff09 初始化表达式外置2 xff09 初始化表达式内置 4 条件表达式5 执行表达式 二 题目分析1 2
  • 《LeetCode零基础指南》(第四讲) 指针

    文章目录 零 了解网站 1 输入输出 2 刷题步骤 3 尝试编码 4 调试提交 一 概念定义 1 指针即地址 2 指针的定义 3 定义指针变量 4 取地址 5 数组的地址 6 解引用 7 内存申请 8 返回数组 9 范式 10 概念总结 二

随机推荐