水下图像增强算法研究

基于深度学习的图像增强

今天问了一个做图像增强方向的研究生学长,他说水下图像增强比较特殊,是少数非深度学习方法效果好于深度学习方法的方向。主要是因为数据集的缺少,没有合理的ground truth作为监督。
同时,也了解到去年学长参与过一个水下图像增强的比赛,深度学习的效果并不好。因此,不用局限于深度学习的方法,可以去找一下论文和github。
So,开始了今天的查阅资料。

水下图像增强综述

水下图像增强技术的目的是实现水下图像的清晰化,那么水下图像会遇到什么问题呢?下面选取了两张水下的图像进行说明。

  1. 色偏问题

在这里插入图片描述
明显可以观察到,该水下图像呈绿色色偏,这是由于水对光纤产生吸收与散射造成的。除了绿色色偏之外,也会产生蓝色色偏。

  • 对比度低
    在这里插入图片描述
    该图像为未产生色偏时的水下拍摄图像,存在对比度较低的问题。

研究水下图像增强技术有三种路径:

  • 传统图像增强技术,如直方图均衡化(效果不佳)
  • 基于颜色恒常理论的方法(Retinex)
  • 基于按通道优先(DCP)算法及其改进算法

Retinex算法

Retinex算法适用于照度不均匀以及亮度较暗的水下图形处理。

理论:该算法认为物体的颜色由物体本身对不同的波长光线反射的结果,颜色不会受光照不均匀的影响。
方法:通过将图像分为辐射照度和反射照度,重新调整图像的辐射照度实现亮度矫正处理。
缺点:图像严重失真,且放大了图中的噪声。

DCP算法

DCP算法最初用于户外场景的去雾处理。

理论:该算法认为一个物体在自然环境中的亮度至少在一个颜色成分中很小。
方法:将图像各通道的最小值组成的图像称为暗通道图像。若图像中存在雾,则其在各个通道的值都比较高,通过暗通道图像中的灰白程度估计雾的浓度,以此进行去雾处理。

处理效果如下所示:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
可见直接将DCP算法应用于水下图像增强效果并不好。

基于图像分析的偏色校正方法(2008年)

该算法应该来源于2008年的一篇同名论文,12年后却是我目前图像增强效果比较好的算法之一。
先上效果:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
该算法是针对图片偏色问题的解决算法,因此相比上述几个适用于低光照等因素的算法效果较好,不过除此之外,该算法仍不失为颜色校正的普适算法。
该算法可分为偏色检测和颜色校正两部分。
该算法定义了一个基于等效圆的偏色检测方法,采用图像平均色度和色度中心距的比值作为偏色因子来衡量图像的偏色程度。
颜色校正方法则综合了灰度世界颜色校正和完美反射颜色校正,利用图像本身的特征进行分析,具有普适性。

接下来的实验

由于对于色偏的处理已经取得不错的结果,接下来拟学习一些算法,提高图像的清晰度和对比度,进一步提升视觉效果。
博主还处于对水下图像增强的初步学习阶段,欢迎各位大佬给出更多建议!

参考博客

该博客参考了以下资料,仅用于学习交流,如有侵权行为,请联系我!

paper survey之——水下图像复原与增强&水下光通信
基于图像分析的偏色检测及颜色校正方法

### 关于基于深度学习的水下图像增强算法研究 尽管存在一些挑战,仍然有许多研究人员致力于开发基于深度学习的水下图像增强技术。这些努力主要集中在解决由于缺乏高质量的数据集而导致的传统监督学习方法难以应用的问题。 #### 数据集构建与预处理 为了克服训练数据不足的问题,部分工作尝试通过合成方式生成更多的标注样本。例如,在一项研究中提出了一个名为UIEBD (Underwater Image Enhancement Benchmark Dataset)[^2] 的新基准测试数据集,该数据集不仅提供了大量的真实场景图片,还包含了人工创建的理想化目标图用于评估模型性能。 #### 深度网络架构设计 针对特定环境下的退化特性,某些学者探索了专门定制化的神经网络结构来改善恢复质量。比如有团队利用多尺度特征融合机制增强了对不同层次细节捕捉的能力;还有些方案引入对抗损失函数促使生成更自然逼真的视觉效果[^3]。 #### 实验验证与对比分析 多个实验表明当拥有足够规模且多样性的训练素材时,经过良好调参后的DL框架确实能在一定程度上超越传统手段达到更好的重建精度。不过值得注意的是实际应用场景复杂多变,所以目前阶段仍需持续优化并积累更多实践经验才能进一步缩小差距甚至反超非DL途径的表现水平。 ```python import tensorflow as tf from keras.models import Model, load_model from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate def create_unet(input_size=(None, None, 3)): inputs = Input(input_size) conv1 = Conv2D(64, 3, activation='relu', padding='same')(inputs) pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) # 中间层... up8 = concatenate([UpSampling2D(size=(2, 2))(conv9), conv1], axis=3) conv10 = Conv2D(3, 1, activation='sigmoid')(up8) model = Model(inputs=[inputs], outputs=[conv10]) return model ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值