利用图像增强方法改进目标检测
一、前言
训练神经网络的一个重要部分是对输入进行预处理。通过仔细检查、清理和转换输入数据,可以获得许多性能增益。在这篇文章中,我们将考虑输入图像的对比度拉伸为主要的图像增强方法对Mask R-CNN网络识别物体的性能的影响。对比拉伸增强了物体的轮廓,强调了物体与背景的区别,理论上可以提高模型的学习能力。这有助于卷积层从图像中提取信息和特征。
二、图像增强——对比度拉伸
2.1 百分位对比度拉伸(也称直方图归一化)
对比度拉伸可以通过简单地使用一个公式来实现,该公式可以放大像素值的差异。以彩色图像为例,必须按比例放大三个图像“通道”:红色通道(R),绿色通道(G)和蓝色通道(B)。一个常见的惯例是用一个范围为[0,255]的整数表示每个通道的每个像素,其中RGB值(0,0,0)等于黑色,(255,255,255)表示白色。
2.1.1 数学公式
比如,当我们处理400×400像素的图像片时,会产生三个400×400像素的通道。因此,总的来说,一个图像切片可以用一个400x400x3的矩阵表示,其值在0到255之间。在我们深入研究这些公式之前,最后需要说明一点。我们要把这个400x400x3矩阵分成3个400×400矩阵。然后我们将在每个颜色通道(R, G和B)上应用对比度拉伸,然后我们将把三个拉伸矩阵再次组合成一个400x400x3矩阵。
然后通过转换像素x,用如下公式进行拉伸:
其中a表示我们想要缩放到的下界b表示上界。
我们没有使用对比度拉伸中的最小值和最大值作为下限和上限,而是分别使用2和98百分位值。采用这些百分位值的一个优点是,它对异常值更稳健;如果图像通道中只有一个像素为0,只有一个像素为255,则不会发生对比度拉伸。当我们使用2和98百分位值时,我们产生了更多的拉伸。但是我们应该注意的是,在这样拉伸之后,我们应该将2%以下的所有值四舍五入为0,将98%以上的所有值四舍五入为255。这直接说明了与最小值和最大值不同的拉伸的缺点;我们丢失了一些信息。
为了量化对比度拉伸的效果,我们引入了一个度量来表示图像n中一个通道k内的颜色扩散:σk,n。
这个标准差可以通过计算一个400×400矩阵的方差得到。如果我们在这个带有xi,j的400×400矩阵的第i行和第j列处指定一个像素x,我们得到:
其中x̄矩阵中的平均像素值,用
其中 I,J=400. 然后 σk,n = √σ2k,n.
在图1的上面两个图像切片中,可以看到2-98百分位对比度拉伸的定性效果。
图1:左上:原始图像切片(来源:谷歌Earth, Maxar Technologies)。右上:2-98百分位对比拉伸后的同一图像切片。在下面的两幅图像中,每个图像波段的每个图像切片的标准差(GBR)的分布和三个通道的标准差的平均值(橙色)
在下面的两个图中,我们绘制了我们的度规的直方图。对于每一个图像切片,我们都计算了三个图像通道的标准差。然后我们分别在三个通道上进行对比拉伸,得到了右边的图。由于我们想要监测在每个通道上分别应用对比度拉伸的效果,我们还通过取三个标准差的平均值(R,G和B,因此K=3)绘制了整个图像的直方图。
可以看出,每个图像的平均标准差的偏移代表了每个通道的偏移。此外,可以观察到标准偏差的显著增加。我们可以计算出所有图像切片的平均标准差。
注意,图像中像素值的标准差增加了很多。一个图像切片(400 - 400像素)内所有像素值的平均标准差在对比度拉伸前为μσ = 26,拉伸后为μσ = 64。标准差的值也更趋于正态分布。每个通道都被拉伸成2和98百分位值(每个图像切片),但是可以看到每个通道的拉伸效果是相同的。
百分位对比度拉伸也被称为(直方图)归一化,因为我们将像素强度的范围归一化。
2.2 直方图均衡
下面我们将研究另一种对比拉伸方法,称为直方图均衡。除了比较模型性能之外,我们还将比较不同方法预处理速度差别。
2.2.1 数学公式
使用直方图均衡化,可以均匀地将所有像素强度分布在范围[0,255]上。我们没有像百分位对比度拉伸那样简单地将这些值分散开来,而是为每个像素强度选择新的值,使直方图变得均匀分布。为了做到这一点,我们正在寻找变换y=f(k),其中y是基于旧像素强度k的新像素强度。
我们将从概率的角度用像素强度来接近直方图。然后我们可以将强度为xi的所有像素N总结为随机x的绘图。我们可以将k的一个值的出现表示为概率:
其中I{xi=k}是一个指标函数:
而离散累积分布函数(discrete cumulative distribution function,CDF)为
为了使y在范围[0,255]上均匀分布,我们将使用变换
我们证明了这种变换会得到如下的均匀分布。当我们引入pX(k)时,这个变换Y=f(X)会得到一个新的分布pY(k),这个分布可以用逆向CDF法推导出来
两边对y求导得到
f-1(y)=k根据定义,我们得到
代入y=f(k)得到
它等于定义域[0,255]上均匀分布的概率密度函数。
2.3 对比度受限的自适应直方图均衡
但是,如果我们直接用直方图均衡方法,是能够看到它存在一些问题:
- 直方图均衡是全局的, 对图像局部区域存在过亮或者过暗时, 效果不是很好;
- 直方图均衡会增强背景噪声,(如下图示例);
为了解决上述2个问题, 就有2方面的解决方法: 一是解决全局性问题, 二是解决背景噪声增强问题.
- 针对全局性问题: 有人提出了对图像分块的方法, 每块区域单独进行直方图均衡, 这样就可以利用局部信息来增强图像, 这样就可以解决全局性问题;
- 针对背景噪声增强问题: 主要背景增强太过了, 因而有人提出了对对比度进行限制的方法, 这样就可以解决背景噪声增强问题;
将上述二者相结合就是 CLAHE 方法, 其全称为: Contrast Limited Adaptive Histogram Equalization.
2.3.1 CLAHE 算法流程
CLAHE 算法流程主要有以下几个步骤:
- 预处理, 如图像分块填充等;
- 对每个分块处理, 计算映射关系, 计算映射关系时使用了对比度限制;
- 使用插值方法得到最后的增强图像;
其处理流程可以用如下示意图表示:
2.3.2 算法实现
2.3.2.1 python实现
import cv2 as cv img = cv.imread("C:\\Image_1.png", 0) img = cv.resize(img, None, fx=0.5, fy=0.5) # 创建CLAHE对象 clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) # 限制对比度的自适应阈值均衡化 dst = clahe.apply(img) #限制对比度自适应直方图均衡化(CLAHE) # 使用全局直方图均衡化 equa = cv.equalizeHist(img) #全局直方图均衡化(HE) # 分别显示原图,CLAHE,HE cv.imshow("img", img) cv.imshow("clahe", clahe) cv.imshow("he", he)
2.3.2.2 C++实现
OpenCV中 CLAHE C++代码地址如下:
https://github.com/opencv/opencv/blob/4.x/modules/imgproc/src/clahe.cpp
#python code #python中需要将不同的通道分离后做自适应白平衡,然后合并图片img=cv2.imread('xxx.jpg') B, G, R = cv2.split(img) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(5,5)) clahe_B = clahe.apply(B) clahe_G = clahe.apply(G) clahe_R = clahe.apply(R) CLAHE = cv2.merge((clahe_B, clahe_G, clahe_R)) plt.figure("CLAHE") plt.title("CLAHE") plt.imshow(CLAHE) plt.show() #C++ code #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(int argc, char** argv){ Mat src = imread("xxx.jpg", 0); Mat dst; cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(); clahe->setClipLimit(2); clahe->setTilesGridSize(cv::Size(8, 8)); clahe->apply(src, dst); namedWindow("src", 0); imshow("src", src); namedWindow("dst", 0); imshow("dst", dst); waitKey(0); return 0;}
参数建议:
clipLimit:对比度限制大小(推荐2~5,太大了噪声太多)
tileGridSize :方格大小,将图片按照大小进行分割,针对方格进行白平衡;
2.3.3 测试结果
从左往右以此为: 原图, HE, CLAHE, 从图中可以看到, CLAHE实现了对细节的增强且没有使得图像过度增强.
参考:
[1] https://en.wikipedia.org/wiki/Adaptive_histogram_equalization#Contrast_Limited_AHE
[2] K. Zuiderveld: Contrast Limited Adaptive Histogram Equalization. In: P. Heckbert: Graphics Gems IV, Academic Press 1994 (http://www.docin.com/p-119164091.html)
[3] https://en.wikipedia.org/wiki/Adaptive_histogram_equalization
[4] 关于 CLAHE 的理解及实现
[5] Improving Object Detection with Contrast Stretching