# 图像增强研究综述
**Repository Path**: wgs-gill/Image-Enhancement-for-Computer-Vision
## Basic Information
- **Project Name**: 图像增强研究综述
- **Description**: 本项目聚焦于传统的底层计算机视觉技术——图像增强(Image Enhancement)。
- **Primary Language**: Python
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-08-02
- **Last Updated**: 2022-08-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 图像增强研究综述
本项目聚焦于计算机视觉上游任务——图像增强(Image Enhancement)。
GitHub 同步连接:https://github.com/Jianxin2021-CHN/Image-Enhancement-for-Computer-Vision
选题报告:https://gitee.com/jianxin2021/Image-Enhancement-for-Computer-Vision/blob/master/Proposal.md
**Gitee并不能很好的兼容Markdown和LaTeX,详细信息请看我们的项目报告:**
项目报告:https://gitee.com/jianxin2021/Image-Enhancement-for-Computer-Vision/blob/master/%E9%A1%B9%E7%9B%AE%E6%8A%A5%E5%91%8A.pdf
## 小组成员
- 吴建新:贡献度占比25%。
- 谢禄青:贡献度占比25%。
- 刘嘉宁:贡献度占比25%。
- 黄 山:贡献度占比25%。
## 项目描述
图像增强是指根据特定的需要突出图像中的重要信息,同时减弱或去除不需要的信息。从不同的途径获取的图像,通过进行适当的增强处理,可以将原本模糊不清甚至根本无法分辨的原始图像处理成清晰的富含大量有用信息的可使用图像,有效地去除图像中的噪声、增强图像中的边缘或其他感兴趣的区域,从而更加容易对图像中感兴趣的目标进行检测和测量。图像增强的目的是使图像的某些特性方面更加鲜明、突出,使处理后的图像更适合人眼视觉特性或机器分析,以便于实现对图像的更高级的处理和分析。
## 项目目标
1、改善图像的视觉效果,提高图像的清晰度。
2、针对给定图像的应用场合,突出某些感兴趣的特征,抑制不感兴趣的特征,以扩大图像中不同物体特征之间的差别,满足某些特殊分析的需要。
## 项目展示
视频链接:https://www.bilibili.com/video/BV1AZ4y1Q73q/
## 项目目录
- [x] 1、点操作
- [x] 2、掩码操作
- [x] 3、快速傅里叶变换
- [x] 4、全彩处理
- [x] 5、Retinex
- [x] 6、NeurIPS 2019 论文复现:Implicit Semantic Data Augmentation for Deep Networks
## 项目内容
### 1. 点操作
#### 1.1 图像反转
**Code:“1_PointOperations/ImageNegative.py”**
状态转换方程:$T:G(x,y)=L-F(x,y)$,其中$L$是最大强度值,对于灰度图像一般取值为255。
实验结果:

#### 1.2 对比度拉伸
**Code: "1_PointOperations/ContrastStretching.m"**
对比度拉伸通过增加图像处理中灰度的动态范围来增强图片中的对比度,其转换公式为:
$$
G(x,y) = g_1+(g_2-g_1)/(f_2-f_1)[F(x,y)-1]
$$
其中,$[f_1,f_2]$为图片在新范围$[g_1,g_2]$上的映射。
实验结果:

#### 1.3 动态范围压缩
**Code: "1_PointOperations/CompressionDynamic.m"**
受显示屏质量的影响,通常可以采用“动态范围压缩”技术对图像进行处理,只让图像最亮被部分在显示屏上可见。
转换公式:$s=c\cdot log(1+|r|)$,其中$c$为度量常数,$c$值越小说明压缩比率越大。
实验结果:

#### 1.4 图像平均
**Code: "1_PointOperations/ImageAveraging.m"**
图像平均常用做图像去噪,通过平均$K$张含有噪声的图片来屏蔽噪声。
转换公式:
$$
\hat g(x,y) = \frac{1}{K}\sum^K_{i=1}g_i(x,y)
$$
实验结果:

#### 1.5 直方图均衡化
**Code: "1_PointOperations/Histogram.py"**
直方图均衡化主要用于处理亮度较低的图像,将该图像的直方图向灰度的下端倾斜,所有的图像细节将被压缩到图像的暗端。然后将暗端的灰度“拉伸”,生成一个更均匀分布的直方图。
具体步骤如下:
1. 求出原图的直方图。
2. 计算原图直方图的累计概率分布。
3. 按照公式$f(D_A)=\frac{L}{A_0}\sum_{u=0}^{D_A}H_A(u)$进行映射。
其中,$A$为原图,$H$为直方图,$L$为灰度级,$A_0$为像素个数。
以上算法是对图像进行全局直方图均衡化。除此之外,有人提出进行自适应的直方图均衡化(AHE),即局部直方图均衡化,其核心思想是利用局部区域窗口内的直方图分布来构建映射函数。CLAHE是对AHE的进一步改进,通过设置阈值来限制直方图的分布,即对超过阈值的部分进行裁剪;除此之外,采用插值的方法来加速直方图均衡化。
实验结果:

### 2. 掩码操作
掩模算子通过在图像上滑动掩模,将掩模值与落在它们下面的像素值相乘并获得总和,来执行掩模与图像的卷积。可以表示为
$$
g(x,y)=\sum^a_{s=-a}\sum^b_{t=-b}w(s,t)f(x+s,y+t)
$$
总和用作图像上掩模中心位置的值:$w(s,t)$,即为掩码算子。
#### 2.1 图像平滑
**Code: "2_MaskOperations/Smoothing_operations.m"**
图像平滑 (image smoothing): 压制、弱化或消除图像中的细节、突变、边缘和噪声,就是图像平滑化。图像平滑是对图像作低通滤波,可在空间域或频率域实现。空间域图像平滑方法主要用低通卷积滤波、中值滤波等;频率域图像平滑常用的低通滤波器有低通梯形滤波器、低通高斯滤波器、低通指数滤波器、巴特沃思低通滤波器等。下图为一个用来平滑图像的掩模算子。

实验结果:

#### 2.2 中值滤波
**Code: "2_MaskOperations/Median_Filtering.m"**
**中值滤波**是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声。这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能。观察窗口中的数值进行排序,位于观察窗中间的中值作为输出。然后,丢弃最早的值,取得新的采样,重复上面的计算过程。
中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用。保存边缘的特性使它在不希望出现边缘模糊的场合也很有用。
实验结果:

#### 2.3 图像锐化
**Code: "2_MaskOperations/sharpening_operations.m"**
图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。实验用的sobel算子对图像进行锐化。
实验结果:

#### 2.4 偏导计算
**Code: "2_MaskOperations/Derivative_operations.m"**
常见的偏导算子有sobel算子和laplacian算子,sobel算子是一阶偏导算子,laplacian算子是二阶偏导算子。sobel算子有两个方向分别为$G_x$和$G_y$:
laplacian常见的算子有四邻域和八领域分别为$G_4$和$G_8$:
实验结果 :

### 3. 快速傅里叶变换
**Code: "3_TransformOperations/快速傅里叶转换变换(Transform operations).ipynb"**
#### 3.1 低通滤波(Low Pass Filtering)
**低通滤波器**为(Low Pass Filtering):设定一个频率点,当信号频率高于这个频率时不能通过,在数字信号中,这个频率点也就是截止频率,当频域高于这个截止频率时,则全部赋值为0。
**缺点**:理想滤波器产生大量波形噪声的原因是,理想滤波器的设计阻塞了距离原点一定半径以外的所有信息。因此,有些信息会在没有任何平滑的情况下急剧中断。
在理想低通滤波公式中,$D_0$是合理常量,$D(u,v)$是频域中一点$(u,v)$与频域矩形中心之间的距离。在理想滤波器背后的概念非常简单:给定一个半径值$D_0$作为阈值,低通滤波图在阈值$H(u,v)$之下等于1,在阈值$H(u,v)$阈值之上等于0。
实验结果:

#### 3.2 高通滤波(High Pass Filtering)
**高通滤波器**为(High Pass Filtering):设定一个频率点,当信号频率低于这个频率时不能通过,在数字信号中,这个频率点也就是截止频率,当频域低于这个截止频率时,则全部赋值为0。
**缺点**:在滤波器中,高通滤波器结果的差异类似于低通滤波器结果。(理想滤波器产生大量波形噪声的原因是,理想滤波器的设计阻塞了距离原点一定半径以外的所有信息。因此,有些信息会在没有任何平滑的情况下急剧中断。)
在理想低通滤波公式中,$D_0$是合理常量,$D(u,v)$是频域中一点$(u,v)$与频域矩形中心之间的距离。在理想滤波器背后的概念非常简单:给定一个半径值$D_0$作为阈值,低通滤波图在阈值$H(u,v)$之上等于1,在阈值$H(u,v)$阈值之下等于0。
实验结果:

#### 3.3 带通滤波(Band Pass Filtering)
带通滤波器是指能通过某一频率范围内的频率分量(设定两个频率点,当信号频率低于低频的截止频率或高于高频的截止频率时不允许通过)。
带通滤波有两个截止频率$D_0$, $D_1$,其中$D_0$是较低的频率,$D_1$是较高的频率,图像频谱在$[D_0,D_1]$之间的通过,在区间之外的抑制。
实验结果:

#### 3.4 同态滤波(Homomorphic Filtering)
同态滤波利用去除乘性噪声,可以同时增加对比度以及标准化亮度,借此达到图像增强的目的。一副图像可以表示为其照度分量和反射分量的乘积,虽然在时域上这两者是不可分离的,但是经由傅立叶转换两者在频域中可以线性分离。由于照度可视为环境中的照明,相对变化很小,可以看作是图像的低频成分;而反射率相对变化较大,则可视为高频成分。通过分别处理照度和反射率对像元灰度值的影响,通常是借由高通滤波器,让图像的照明更加均匀,达到增强阴影区细节特征的目的。其基本流程为:
$$
S(x,y)\to log \to FFT \to filter \to IFFT \to Exp \to T(x,y)
$$
### 4. 颜色操作
**Code: "4_ColoringOperations/颜色操作(Coloring Operations).ipynb"**
#### 4.1 伪彩色(False Coloring)
伪彩色处理的基本原理是将黑白图像或者单色图像的各个灰度级匹配到彩色空间中的一点,从而使单色图像映射成彩色图像。对黑白图像中不同的灰度级赋予不同的彩色。给定不同的映射函数就能将灰度图像转化为不同的伪彩色图像。需要注意的是,伪彩色虽然能将黑白灰度转化为彩色,但这种彩色并不是真正表现图像的原始颜色,而仅仅是种便于识别的伪彩色。由于人眼对彩色的分辨能力远远高于对灰度的分辨能力,所以将灰度图像转化成彩色表示,就可以提高对图像细节的辨别力。因此,伪彩色处理的主要目的是提高人眼对图像的细节分辨能力,以达到图像增强的目的。
实验结果:

#### 4.2 全彩处理(Full Color Processing)
全彩色图像处理(Full Color Processing)技术总的可以分为两大类:
(1)对3个平面分量单独处理,然后将分别处理过的三个分量合成彩色图像,对每个分量的处理技术可以应用到对灰度图像处理的技术上
(2)直接对彩色像素进行处理。因为全彩色图像至少有3个分量,彩色像素实际上是一个向量,直接处理就是同时对所有分量进行无差别的处理。令$c$代表RGB彩色空间中的任意向量:
对于大小为$M \times N$的图片:
原图:

实验结果:


### 5. Retinex
**Code:“5_Retinex/Retinex.py”**
视网膜-大脑皮层(Retinex)理论认为世界是无色的,人眼看到的世界是光与物质相互作用的结果,也就是说,映射到人眼中的图像和光的长波(R)、中波(G)、短波(B)以及物体的反射性质有关。基于这个理论,可以抽象下图中的公式
$$
I(x,y)= R(x,y)\cdot L(x,y)
$$
其中$I(x,y)$代表观察到的图像,$R(x,y)$代表物体的反射属性, $L(x,y)$代表物体表面的光照。

#### 5.1 单尺度Retinex算法(Single-Scale Retinex)
在Retinex理论中,一个假定是光照I(x,y)是缓慢变化的,也就是低频的,要从I(x,y)中还原出R(x,y),所以可以通过低通滤波器得到光照分量。
具体做法:
· 对源公式两边同时取对数,得到$log(R)=log(I)−log(L)$
· 通过高斯模糊低通滤波器对原图进行滤波,公式为$L=F \times I$
· 得到$L$后,利用第一步的公式得到$log(R)$,然后通过$exp$函数得到$R$。
#### 5.2 多尺度加权平均Retinex算法(Multi-Scale Retinex)
上面是单个尺度下的Retinex算法,当然也存在多尺度的Retinex算法,最为经典的就是3尺度的,大、中、小,既能实现图像动态范围的压缩,又能保持色感的一致性较好。
具体做法: 对每个尺度分别进行单尺度的Retinex算法,将每个尺度的结果相加取平均得到最终结果(这里是简单地取权重相同,当然还可以设立权重不等)
#### 5.3 彩色恢复的多尺度Retinex算法(Multi-Scale Retinex with Color Restoration)
在前面的增强过程中,图像可能会因为增加了噪声,而使得图像的局部细节色彩失真,不能显现出物体的真正颜色,整体视觉效果变差。带色彩恢复因子C的多尺度算法是在多个固定尺度的基础上考虑色彩不失真恢复的结果,在多尺度Retinex算法过程中,通过引入一个色彩因子C来弥补由于图像局部区域对比度增强而导致的图像颜色失真的缺陷,通常情况下所引入的色彩恢复因子C的表达式为:
$$
R_{MSERCR_i}(x,y) =C_i(x,y)R_{MSR_i}(x,y)
$$
$$
C_i(x,y)=f[\frac{I_i(x,y)}{\sum^N_{j=1}I_j(x,y)}]
$$
其中,$C_i$表示为第$i$个颜色通道地色彩恢复系数,它的作用是调节3个通道颜色的比例,$f(\cdot)$表示颜色空间的映射函数,通常可以采用下面的形式:
其中,$\alpha$是增益常数,$\alpha$是受控制的非线性强度,带色彩恢复的多尺度Retinex算法通过色彩恢复因子$C$这个系数来调整原始图像中3个颜色通道之间的比例关系,从而把相对有点暗的区域的信息凸显出来,以达到消除图像色彩失真缺陷的目的。处理后的图像局域对比度得以提高,而且其亮度与真实的场景很相似,图像在人们的视觉感知下显得更为逼真。因此,MSRCR算法会具有比较好的颜色再现性、亮度恒常性与动态范围压缩等特性。
#### 5.4 Retinex实验结果

### 6.(NeurIPS 2019)Implicit Semantic Data Augmentation for Deep Networks
[[NeurIPS 2019 Paper]](https://proceedings.neurips.cc/paper/2019/file/15f99f2165aa8c86c9dface16fefd281-Paper.pdf)
[[T-PAMI会议扩期刊]](https://arxiv.org/abs/2007.10538)
[[GitHub]](https://github.com/blackfeather-wang/ISDA-for-Deep-Networks)
**Code: "6_ISDA"**
#### 6.1 概述
图片的背景、图片中物体的颜色、视角等与图像内容有关的信息统称为图像的**语义**信息(Semantic Information)。传统的数据增强方法如:**点操作**、**掩码操作**、**快速傅里叶变换**、**颜色操作**、**Retinex**等均不涉及图像的语义转换。在深度学习中,通常通过构建深度神经网络模型提取含有大量语义信息的特征向量,用于图像分类、目标检测、图像分割等下游任务。在获取特征向量空间的过程中,通常采用线性分类器来约束网络的输出,以至于输入空间中不同样本之间复杂的语义关系表现为其对应深度特征之间的简单线性关系。在这篇NeurIPS 2019论文Implicit Semantic Data Augmentation for Deep Networks(以下简称ISDA)中,作者利用深度神经网络可有效学习线性化特征这一特性,即通过特征空间中不同方向与语义特征转换之间的关系到达图像增广的目的。

如上图所示,在特征空间中,绿色方向代表”改变图像背景“,粉色方向代表”改变物体颜色“,蓝色方向代表”改变物体观察角度“,即不同方向代表不同的语义转换。假设我们想改变汽车的颜色,让外观为蓝色的汽车转换为外观为红色的汽车。我们只需要将一组蓝色汽车输入深度神经网络获得一组特征向量,同样将一组红色汽车输入深度神经网络获得一组特征向量,对这两组特征向量分别取均值,将蓝色汽车样本的均值转换为红色汽车样本的均值,从而实现颜色转换,达到数据增广的目的。
不同的类通常有不同的语义信息,在用ISDA进行数据增强时,需要针对不同的类选择不同的语义信息。如:对Car类可以选择改变颜色、改变背景、改变观察视角等语义信息,对Person类可以选择是否佩戴眼镜、头发长短等语义信息。
#### 6.2 方法
ISDA算法的核心思想是基于类分布来选择语义方向和优化损失函数上界以进行语义信息图像增广。
##### 6.2.1 语义方向选择
**利用类内特征分布刻画某类图像可能在哪些方向上的语义变化。**
根据已有数据进行分析,通常而言每一类样本都具有其独特的类内特征分布,这些类内特征分布在一定程度上隐含了语义方向。例如:在数据集中,包含“红色”和“蓝色”的汽车,但不存在“年老”和“年轻”的汽车这一个特征区分,即对于Car类,在“颜色”这一方向上存在较大方差,而在”年龄“方向上这一方差为0。而在”Person“类中,”年龄“有关的特征方差会很大。

所以,ISDA算法通过统计每一类别的类内协方差矩阵,为每一类别构建一个高斯分布,进而从中采样出有意义的语义变换方向,从而进行数据增广。假设第$i$个样本对应的特征向量为$a_i$,$a_i$对应的标签为$y_i$,其类内协方差为$\sum_{y_i}$,$\sum_{y_i}$由该类的样本估计得到,只保留对该类有意义的语义方向,对该类没有意义的方向上接近于0。类内协方差估计跟随每个batch实时更新,第$j$类的均值$\mu_j^{(t)}$协方差$\sum_{y_i}$在第$t$个batch上的更新为:
$$
\mu _j ^{(t)}=\frac{n_j^{(t-1)}\mu_j^{(t-1)}+m_j^{(t)}\mu_j^{'(t)}}{n_j^{(t-1)}+m_j^{(t)}}\\
\sum^{(t)}_j=\frac{n_j^{(t-1)}\sum_j^{(t-1)}+m^{(t)}_j\sum'^{(t)}_j}{n_j^{(t-1)}+m_j^{(t)}}+\frac{n_j^{(t-1)}m_j^{(t)}(\mu_j^{(t-1)}-\mu_j^{'(t)})(\mu_j^{(t-1)}-\mu_j^{'(t)})^T}{(n_j^{(t-1)}+m_j^{(t)})^2}\\
n_j^{(t)}=n_j^{(t-1)}+m_j^{(t)}
$$
其中$n_j^{(t)}$表示在$t$个batch中属于$j$类的训练样本的总数,$m_j^{(t)}$表示在第$t$个batch中属于$j$类的训练样本的数量。使用ISDA算法进行数据增广后,获得$\hat{a_i}$,如以下公式所示:
$$
\hat{a_i} \sim N(a_i,\lambda\sum_{y_i})\\
\lambda = (t/T)\times \lambda_0
$$
$\hat a_i$服从以$a_i$为均值的正态分布,$\lambda$控制语义增强的强度,$t$为当前迭代数,$T$为迭代总数。
##### 6.2.2 优化损失函数上界
ISDA算法通过类内协方差矩阵分别为每个类构建高斯分布$\hat a_i$后,从中进行采样。在采样过程中,考虑采样$M$次,当$M$较大、样本数目较多、特征空间维度较高时,采样$M$次并计算损失的计算复杂度非常大,在论文中,作者考虑令$M\to \infty$,转化为计算扩增分布上的期望损失问题,公式如下:
其中,$N$为样本数目,$y_i$为$a_i$对应的标签,$w$, $b$为深度神经网络最后一线性分类层的参数,$C$为类别数目,$\Theta$为网络参数。ISDA算法利用**Jensen不等式**对上式进行简化,得到一个易于计算的上界:
通过优化该损失函数的上界,即可达到数据增广的目的。下面给出ISDA算法的伪代码:

#### 6.3 实验
##### 6.3.1 数据集
本实验在CIFAR-10上进行,探究图像增强后的图像分类准确率。
CIFAR-10:由图灵奖得主Hinton的学生整理的一个适用于识别朴实物体的小型数据集。一共包含10个类别的RGB彩色图像:飞机、汽车、鸟类、猫、鹿、狗、蛙类、马、船和卡车。每个图片的尺寸为$32 \times32$,每个类别含有6000个图像,数据集中一共有50000张训练图像和10000张测试图像。
##### 6.3.2 实验环境
```python
python 3.7.12
torch 1.10.0+cu113
NVIDIA-SMI 470.57.02
Driver Version: 470.57.02
CUDA Version: 11.4
```
##### 6.3.3 实验结果
共进行240epoch,训练过程见 accuracy_epoch.txt 和 training_process.txt。
部分截图如下所示:
.PNG)
.PNG)

训练结果如下:

##### 6.3.4 引用
```pascal
@inproceedings{NIPS2019_9426,
title = {Implicit Semantic Data Augmentation for Deep Networks},
author = {Wang, Yulin and Pan, Xuran and Song, Shiji and Zhang, Hong and Huang, Gao and Wu, Cheng},
booktitle = {Advances in Neural Information Processing Systems (NeurIPS)},
pages = {12635--12644},
year = {2019},
}
@article{wang2021regularizing,
title = {Regularizing deep networks with semantic data augmentation},
author = {Wang, Yulin and Huang, Gao and Song, Shiji and Pan, Xuran and Xia, Yitong and Wu, Cheng},
journal = {IEEE Transactions on Pattern Analysis and Machine Intelligence},
year = {2021},
doi = {10.1109/TPAMI.2021.3052951}
}
```
## 项目总结
计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和计算机代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图像处理,用计算机处理成为更适合人眼观察或传送给仪器检测的图像。本项目以学习为主,通过此次学习图像增强,让我们对于计算机图像处理有了更进一步的认识,例如可以通过同态滤波的方法,对原图像进行处理,从而获得一张增强阴影区细节特征的图片。由于人眼对彩色的分辨能力远远高于对灰度的分辨能力,所以将灰度图像转化成彩色表示,就可以提高对图像细节的辨别力,通过伪彩色处理的方法使一张灰色图像映射为为一张彩色图像。在信息化时代的今天,图像处理在方方面面影响着我们的生活,我相信还有更多的未知在等待着我们去发现。除此之外,我们尝试了多种方法去除图像中的噪声,并通过图像锐化,补偿图像的轮廓,增强图像的边缘及灰度跳变的地方,从而使图像更加清晰。Retinex理论的基本思想就是在原始图像中,通过某种方法去除或者降低入射图像的影响,从而尽量的保留物体本质的反射属性图像,Retinex理论的基础理论是物体的颜色是由物体对长波(红色)、中波(绿色)、短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的。“点操作”聚焦于每个像素点,通过图像反转、对比度拉伸、图像平均、直方图均衡等方法达到图像增强的目的。同时,我们尝试了利用深度学习的方法进行图像语义增强,进而实现图像分类任务。
## 参考资料:
[1]百度百科:https://baike.baidu.com/
[2]维基百科:https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5
[3]图像增强综述:https://www.cnblogs.com/fydeblog/p/10734733.html
[4]靳阳阳,韩现伟,周书宁,张世超.图像增强算法综述[J].计算机系统应用,2021,30(06):18-27.DOI:10.15888/j.cnki.csa.007956.