1、引言

        近年来,水下图像在海洋军事、海洋环境保护和海洋工程等科研和工业领域扮演着越来越重要的角色,在海洋研究和水下机器人领域都具有重要的应用,因为观察海洋生物、进行水下作业等相关海洋活动都需要清晰的图像。然而由于水的折射和水中悬浮颗粒的散射都会对光造成大幅度的衰减,同时水体的多样性也可能会造成多方面的偏差,使最后呈现出来的水下图像的质量不尽如人意,很多视觉任务都会在质量较低的水下图像上失效,所以水下图像的增强和复原作为水下观察和作业的关键技术之一,依然有其必要性。

2、问题分析

        本次实验的具体任务就是实现水下图像的增强和复原。水下成像环境复杂,不同拍摄环境下得到的图像问题也五花八门,其中最主要的问题是出现蓝绿色偏、细节模糊和光照不匀等现象。例如,如图1(a) 的主要问题为总体颜色偏蓝绿,周围特别是较远处的礁石和比色卡不清晰;图2(b) 存在光照不匀的问题,在右侧有一块大亮斑,其他区域特别是左下角颜色过暗,无法展现足够的细节。

        要解决这些问题,就要设计一种图像处理方案,有效地调整图片的色彩,增强图像的细节。我们可以从直方图均衡化、灰度变换、目标增强、色彩校正、暗通道先验等算法入手,这些都是上述图片问题的常见算法。在本次实验中,我们将尝试使用直方图均衡化、对数变换、自动色阶、去雾和锐化算法对图像进行处理。

弱监督水下图像增强 水下图像增强的意义_直方图均衡化

 

弱监督水下图像增强 水下图像增强的意义_直方图均衡化_02

                            (a)                                                                   (b)

图1 水下图像

3、解决方案

3.1系统整体框架

    本系统对两幅在水下拍摄的照片underwater1.jpg和underwater2.jpg进行处理。对于underwater1.jpg,使用自动色阶处理、暗通道先验处理、直方图均衡化处理和锐化处理;对于underwater2.jpg,使用光照校正处理、暗通道先验处理和锐化处理。处理后的图像保存在本地。本系统处理图像的流程如图2所示。

弱监督水下图像增强 水下图像增强的意义_直方图均衡化_03

图2 本系统流程图

3.2图像处理

3.2.1自动色阶处理

自动色阶的主要步骤如下:

  1. 对图像的蓝、绿、红三个通道分别统计直方图;
  2. 分别计算各通道按照给定的参数所确定的上下限值;
  3. 按照计算所得的MinBlue/MaxBlue构建一个隐射表;
  4. 对各通道图像数据进行隐射[1]。

        自动色阶能够很好地为水中和雾中的图像还原色彩[2]。对图1(a) 使用自动色阶处理后的效果如图3所示。

弱监督水下图像增强 水下图像增强的意义_二维_04

图3 自动色阶处理后的效果

3.2.2光照校正处理

        为解决图1(b) 的光照不匀问题,可以使用基于二维伽马函数的光照不均匀图像自适应校正算法[3]。该算法使用Retinex的多尺度高斯滤波来求取光照分量,随后使用二维Gamma函数针对原图HSV空间的V分量进行亮度调整[4]。调整后的图像缺乏光照区域的亮度提高,暗部细节更加丰富,且光照充足区域没有出现过曝,光照不匀问题得到了有效解决。光照校正的具体流程如图4所示。对图1(b) 使用光照校正处理后的效果如图5所示。

弱监督水下图像增强 水下图像增强的意义_图像处理_05

图4 光照校正处理流程

弱监督水下图像增强 水下图像增强的意义_二维_06

图5 光照校正处理后的效果

3.2.3暗通道先验处理

        水下图像处理的重点是去雾。在本图像处理系统中,使用了暗通道先验对图像进行去雾操作,具体流程如图6所示。

弱监督水下图像增强 水下图像增强的意义_弱监督水下图像增强_07

图6 暗通道先验处理流程

3.2.3.1求取暗通道图

        获得图像中每个像素点三个通道中的最小值并将其赋值给暗通道图像中对应的像素点,重新组成灰度图后再对图像进行最小值滤波。其中根据实验找到最佳窗口半径为7,由此获得最佳的暗通道图。

3.2.3.2求取海底光照强度

        通过实验获得将最小全球大气光值的最大经验值设为350,随后找到暗通道图中的最大值和最小值,最后比较最小全球大气光值与暗通道图像最大值,取其中较小的值作为海底光照强度。

3.2.3.3求取透射率

在假设ω=0.95的前提下,根据透射率公式

弱监督水下图像增强 水下图像增强的意义_直方图均衡化_08

计算获得透射率。

3.2.3.4导向滤波

        通过引导图对输入图像进行滤波处理,使得最后的输出图像大体上与初始图像P相似,但是纹理部分与引导图相似。

暗通道先验处理后的效果如图7所示。

弱监督水下图像增强 水下图像增强的意义_二维_09

(a)

弱监督水下图像增强 水下图像增强的意义_二维_10

(b)

图7 暗通道先验处理后的效果

 3.2.4直方图均衡化处理

可以使用直方图均衡化来增强图像的对比度。步骤如下:

  1. 计算出图像的灰度直方图;
  2. 计算灰度直方图的累积分布函数;
  3. 根据累积分布函数和直方图均衡化原理得到输入与输出之间的映射关系;
  4. 根据映射关系得到结果进行图像变换。

        直方图均衡化是将任意分布规律直方图的原始图像变换为具有均匀分布直方图的图像,因此达到增强图像对比度的效果。

        对于本系统处理的2个图像,图1(a) 需要进一步增强对比度以突出水中特别是远处的物体细节,处理结果如图8(a) 所示。图1(b) 不需要做直方图均衡化处理,因为对比度已经足够高,如果仍要处理则会使画面泛白,如图8(b) 所示。

弱监督水下图像增强 水下图像增强的意义_图像处理_11

(a)

弱监督水下图像增强 水下图像增强的意义_二维_12

(b)

图8 直方图均衡化处理后的效果

3.2.5锐化处理

        使用拉普拉斯算子对图像进行边缘提取[5],并将提取的边缘与原图像相加,得到边缘增强后的图像。由于本系统处理的2个图像质量不高,锐化处理需要精准控制。本函数带有一个float型参数,用于调整锐化的强度,避免因人为原因给图像增加过于明显的噪声。图9展示了2个图像分别使用锐化处理后的效果。

弱监督水下图像增强 水下图像增强的意义_图像处理_13

(a)

弱监督水下图像增强 水下图像增强的意义_图像处理_14

 (b)

图9 锐化处理后的效果

4、实验结果与讨论

        本图像处理系统能够对水下图像进行一系列处理,还原景物色彩,增强物体边缘,有效增加图中物体的辨识度。最终处理结果如图10所示。

弱监督水下图像增强 水下图像增强的意义_弱监督水下图像增强_15

(a)

弱监督水下图像增强 水下图像增强的意义_弱监督水下图像增强_16

(b)

图10 最终处理结果

        本图像处理系统对水下图像的处理比较保守。我们尝试过白平衡算法试图进一步改善图像偏色的问题,但这会导致处理后的图像发红或发紫,反而破坏了图像的观感,且会对后续图像处理操作造成阻碍,因此该算法被弃用。为增强对比度,我们尝试了对数变换,但效果不佳(如图11所示),后来选择了直方图均衡化。选择直方图均衡化也并不意味着对BGR三个通道分别简单处理一下就能实现理想的增强效果,这会导致图中出现大量红色斑块,必须针对彩色图像对算法进行调整。在经历了各种不顺后,我们最终只保留了少数破坏性较小的算法,以尽可能地保留图像的原始细节。

弱监督水下图像增强 水下图像增强的意义_图像处理_17

图11 对数变换(左)与直方图均衡化(右)的效果对比

5、结果

        本图像处理系统能够为在水下拍摄的照片还原色彩、提高清晰度。借助自动色阶算法,能够在避免图像失真的情况下尽可能地还原水下元素的原始颜色;借助基于二维伽马函数的算法,能够提高图像暗部的亮度,突出图像的暗部细节;借助暗通道先验算法,能够解决水下图像因大量悬浮颗粒而显得模糊的问题;借助基于拉普拉斯算子的锐化算法,能够增强图像的边缘,进一步改善图像中物体边界不清晰的现象。

        由于水下光线复杂,本图像处理系统在对图像进行增强的过程中,还存在一些不足之处。为改善水下图像普遍存在的光照不匀现象,我们尝试了直方图均衡化算法,但由于图像动态范围有限,该算法会使图片的亮色部分出现过曝,对图像的亮部细节有一定影响。这是需要改进的地方。

参考文献

[1]图像处理之自动色阶opencv&c++_朱骥伦的博客

[2]水下图像去雾算法C++实现 - 百度文库[EB/OL]. https://wenku.baidu.com/view/143683f575a20029bd64783e0912a21614797f8f.html?_wkts_=1672410549986&bdQuery=OpenCV+C%2B%2B+%E6%B0%B4%E4%B8%8B%E5%9B%BE%E5%83%8F+%E7%99%BD%E5%B9%B3%E8%A1%A1.

[3]刘志成,王殿伟,刘颖,等. 基于二维伽马函数的光照不均匀图像自适应校正算法[J]. 北京理工大学学报, 2016, 36(2): 191-196, 214.

[4]OpenCV图像处理专栏十二 _《基于二维伽马函数的光照不均匀图像自适应校正算法》_just_sort的博客

[5]OpenCV 彩色图像的直方图均衡化、平滑和锐化 C++_Dwyane05的博客-

PS:代码在另一篇里,用的是C++!