赞
踩
不论是传统的图像增强算法还是神经网络,总有一些参数是需要手工调整的,而这些参数得设置是否恰当,往往会影响整个算法的表现。手动设置的参数往往是针对部分情景和特定目标的,若环境或任务发生改变,之前的参数很可能会失效。这也是为什么我们都追求一种能够适应尽可能多的场景的参数设定方法,亦或是尝试元学习以指导参数的自动选取,减少人为干预。
不过即使再怎么追求hand-crafted free,我们似乎无法逃脱设置参数的魔咒——用于选取参数的算法在另一种角度来看仍然是一种参数,也就是深度学习中常说的超参数,而超参数之上亦有参数,这就是meta learning。如果我们希望不要人为设定meta learning的参数呢?那便有了meta-meta learning,我们可以不断增加meta的前缀直至无穷无尽… 即使是下面介绍的自适应方法本身,也算是一种prior knowledge,或者约束。
因此,参数自适应的方法就显得尤为重要了。我们希望能够在分割图像的时候自动选取合适的阈值,希望在分类图像的时候得到错误率最小的置信度阈值,希望在获取图像特征的时候划分得到最富有语义信息的部分······
本节将会介绍传统的图像处理中常见的参数自动选取和阈值自适应技术,以及运用了这些方法的特征点检测/目标i检测算法如LBP/FAST/SURF/ORB/SIFT/HOG。此节的内容也会更贴近实际应用,会稍微涉及一些比赛中的实用coding方法。
理论上来说,这一部分应该放在神经网络和CNN之前,因为CNN其实算是借鉴传统方法发展起来的,其特征表和提取都算是传统方法的泛化结果。5.5 也是许多同学在学习CV的时候常常忽略的一环,常常是只学习了DNN和CNN,跑了几个数据集和经典网络就认为自己掌握了计算机视觉的基础知识。实际上这部分内容才是CV的基石之一。
对于黑白图像(彩色图像同理),亮度/像素点的值是最基本的特征。一般的计算机视觉任务都需要对输入进行预处理如标准化、提亮/暗化、锐化/模糊等,所以首先来看看像素级特征和形态学特征。
由于相机曝光/光圈/外界光线环境的变化,输入的图像常常有着不同的视野亮度。倘若我们希望在预处理中对所有图像进行整体提亮/暗化以达到相同的亮度水平,显然设置一两个一成不变的参数是不够的。不同的 图像要达到相同的 效果,就提醒我们应当使用自适应技术。 最简单的方法是对所有像素值求平均,然后使得所有图像的亮度均值相同,这样在稍后的处理中就可以用一个相同的参数对付所有图像了。
不过增减均值有时候并不是最好的选择,若我们希望在稍后得到图像的形态学特征,常常需要进行二值化处理,这时候阈值的选取就非常关键了,如果部分图像整张都偏暗或偏亮,阈值稍大可能导致特征被删除,太小又可能留下过多不需要的形状;特别有时候我们希望增大图像的对比图突出边缘和纹路等细节,那可以使用直方图均衡化的技巧,其将一张分布不均匀(常常是有大块明暗区域)的图像的直方图变得更接近均匀分布。这能够大大提升图像的对比度,使得明暗的差异增大,让我们更好地分离需要的部分。其基本思想是对在直方图中密度大的区域进行展宽,而对密度小灰度级进行缩减。
经过HE的操作,原本不明显的边缘和纹理也都变得更清晰了,最重要的是现在可以方便的选择阈值进行二值化操作了。
根据预处理目的的不同,我们也可以把没有达到均值部分的像素值与均值的差看作是某种损失,若相差越大就要施以更大的”惩罚“,即在稍后将此像素值增大/缩小得更多一些。比如L1 loss或L2 loss都是可用的,也可以采用一些更平滑的曲线。
前述的亮度自适应方法在一定程度上可以解决图像亮度变化造成的影响,但是考虑这种情况:我们分割出一张报纸上的文字(黑色字体),但是报纸的一侧暴露在阳光下,而另一侧则在黑暗中。那么即使进行了直方图均衡化,由于其亮度的”两极分化“,高亮和强暗区域仍然是糊成一团。这时候就应该选用局部阈值或局部直方图的方法了,其本质是使用比全局统计特征(即直方图)更精细的分类。
可以看到,采用动态阈值后很好地解决了这个问题。其实现过程也应该很容易想到:使用一个mean slide window或者gaussian slide Window处理整个图像,对部分区域统计均值/加权均值并由此设置均值的1/5或1/4(这个值仍然是人为设定的,取决于对细节的取舍,高斯窗则是做加权均值统计)作为阈值,便可以得到上面的效果了。
局部直方图均衡化可以取得的效果和动态阈值相仿,不过和全局直方图均衡化希望得到形态学特征相比其更注重的是纹理和细节:对比上图中的global equlize和local equalize的结果就可以看到,若只希望得到外形轮廓即形态学特征,应该使用全局直方图均衡化,中间下方的沙坑轮廓非常明显;而要获取所有纹理特征,则应该选用局部直方图均衡化。
其步骤也同样非常简单,取滑动窗口和一定的步长(你看吧,滑动窗口的大小的步长以及是否加padding仍然是需要人为设定的超参数,使用不同的参数可以得到不同的效果,可以自己想想试试看),对滑窗内进行均衡化即可。
动态阈值分割前景背景的经典方法还包括大津法,其思路为使得分割后的前景与背景类间方差最大,因此算法就是要找到一个合适的阈值以实现前述目标,一般用暴力搜索即可,从0-255遍历阈值得到类间方差的最大值。大津法对分类边缘的处理效果较好,因为一旦有伪正类或伪负类被划入对应类别,类间方差都会极大地减小,这使得损失函数对于分类错误的敏感性很高。
OpenCV对上两者都提供了接口,被统一写入cv::Threshold()
内,通过传递不同的阈值类型参数就可以选用自适应阈值或大津法。
我们常使用一些降噪滤波器如高斯、中值、均值等对图像进行平滑处理以去除噪声,但是它们都有一个缺点,就是容易损伤高频信息,随机噪声、椒盐噪声等都属于高频噪声,而前述的几个滤波器本质上都是low pass filter,所以高频纹理和边缘的损伤是在所难免的。那么我们能否开发出一种参数自适应的滤波器以避开边缘,只在平坦区域寻找噪声?这就是双边滤波的思想。它同时考虑空间域(xy两个维度)和值域(像素值的高低,即图像的"第三维"),力求减轻对边缘的模糊。
高斯滤波器的计算方式如下:
F
G
u
s
s
i
a
n
=
1
W
g
∑
p
∈
U
G
g
(
p
)
∗
I
p
F_{Gussian}=\frac{1}{W_{g}} \sum_{p \in U} G_{g}(p)* I_{p}
FGussian=Wg1p∈U∑Gg(p)∗Ip
其中高斯模板如下:
G
g
=
exp
(
−
∥
p
−
q
∥
2
2
σ
g
2
)
G_{g}=\exp \left(-\frac{\|p-q\|^{2}}{2 \sigma_{g}^{2}}\right)
Gg=exp(−2σg2∥p−q∥2)
而
W
s
W_s
Ws是归一化系数,即每个位置上的高斯权重之和,除以此系数保证所有位置的权重和为1。直观上理解,高斯滤波器以距采样点的距离的函数为加权系数,离得越远的像素贡献越小,越近的像素贡献越大。但双边滤波同时考虑值域的信息,在滤波的时候,还要看看窗口内的像素和中心像素是否相似,因此其计算方式如下:
F
B
i
l
a
t
e
r
a
l
=
1
W
b
∑
p
∈
U
G
g
(
p
)
G
r
(
p
)
∗
I
p
F_{Bilateral}=\frac{1}{W_{b}} \sum_{p \in U} G_{g}(p) G_{r}(p) * I_{p}
FBilateral=Wb1p∈U∑Gg(p)Gr(p)∗Ip
其中
G
r
G_r
Gr为:
G
r
=
exp
(
−
∥
I
p
−
I
q
∥
2
2
σ
r
2
)
G_{r}=\exp \left(-\frac{\|I_p-I_q\|^{2}}{2 \sigma_{r}^{2}}\right)
Gr=exp(−2σr2∥Ip−Iq∥2)
代表了中央像素和窗内其他像素的相似程度,即考虑了值域上的距离。和当前像素越相似,那么这个像素就会有越大的权重。这样,在边缘的时候,处于边缘一侧的像素都和中心像素相似,因此有较大的贡献;而另一侧因为在像素值域上相差甚远,因此权重很小,基本不会影响到滤波后的像素值。当然,同样要进行权重归一化,只需要对
W
s
W_s
Ws的每一项都乘上
G
r
(
p
)
G_r(p)
Gr(p)即可:
W
b
=
∑
p
∈
U
G
g
(
p
)
G
r
(
p
)
=
∑
p
∈
U
exp
(
−
∥
p
−
q
∥
2
2
σ
g
2
)
exp
(
−
∥
I
p
−
I
q
∥
2
2
σ
r
2
)
W_{b}=\sum_{p \in U} G_{g}(p) G_{r}(p)=\sum_{p \in U} \exp \left(-\frac{\|p-q\|^{2}}{2 \sigma_{g}^{2}}\right) \exp \left(-\frac{\left\|I_{p}-I_{q}\right\|^{2}}{2 \sigma_{r}^{2}}\right)
Wb=p∈U∑Gg(p)Gr(p)=p∈U∑exp(−2σg2∥p−q∥2)exp(−2σr2∥Ip−Iq∥2)
看看使用不同的
σ
g
,
σ
r
\sigma_g,\sigma_r
σg,σr的时候,滤波的效果:
不过由于值域项的调制作用,对噪声的滤除效果必然有所下降(噪声一般是平坦区域的一个凸出像素,以它为参考点滤波的时候,周围的像素肯定是和噪声不太一样的,因此权重减小)。为此,你可以添加更多的非线性项,比如规定当中间的像素和周围都不同(都大/小)时,赋予中间点更小的权重等,这自然会增加运算量。效果更好的自适应去噪方法包括NL-means和它的改进BM3D,它们都拥有非常优良的去噪效果,不仅考虑了邻域,还将图像中其他与当前滤波的patch(窗口)也考虑进来,分别从频域和空域对噪声进行估计。显然,在得到更好的滤除效果和保留细节的同时,你总得付出更大的代价:时间开销和空间开销。No Free Lunch Law再次降临!
图像复原、图像降噪、多光谱融合和超分辨率等领域,依托传统图像处理方法的同时引入深度学习,也是CV的一个重要但不那么卷(好像也有点卷了?)的方向。2016/17年一篇仅使用简单的CNN+encode-decoder结构就能去除图像噪声的论文(忘记叫什么了,知道的可以联系下笔者)引爆全场,只不过是让一张图片通过一个bottleneck一样的结构(就是编码器-解码器的架构)其上的噪声就消失的无影无踪。至此,类似U-Net的结构便在上述领域内层出不穷,各种编码方式、前处理(一般是从频域、小波变换等入手)、跨域融合就被加入进来,DNN逐渐就占据了这些方向的SOTA宝座。感兴趣的同学可以进一步学习相关内容。
注意区别这里介绍的是形态学特征(morphology feature,指的是图像中具有一定形状的图形)而非前述的一般特征,不过形态学特征是作为一般特征的子集。请结合具体的例子进行理解,如RoboMaster比赛中的装甲板识别任务。形态学操作和相关知识可以参照《学习OpenCV3》中的相关内容。
在处理形态学特征的时候,我们可能希望寻找一些由不同区块的轮廓组成的目标,在比赛中常见的即装甲板灯条的匹配,其在正常曝光下从远处看是两个对称的梯形,而我们一般将其视作一个轮廓进行处理。当我们希望匹配处于同一个物体上的两个或多个形态特征(对于装甲板识别就是找到处于同一块装甲板上的灯条),应该寻找对旋转/尺度/平移都有不变性的特征。
以灯条匹配为例,装甲板距离相机的距离会导致灯条长度的改变,但是不论距离远近,处于同一块装甲板上的灯条的长度比始终应当保持不变(根据 4.1 介绍的相机小孔成像模型),这就是一个尺度不变特征,显然灯条的宽度比也同样是一个很好的衡量指标。而由长宽相乘得到的面积,也可以作为一个筛选/匹配的准则,不过应该使用面积比而不是面积(面积比和长/宽比似乎在一定程度上有一些耦合,不过可以对筛选顺序进行合理排序,面积比可能更容易清理哪些非灯条的目标,在 6.1.1 我们会再进行介绍)。
至于平移不变性,这对于非定位和non-global-based的特征来说都是可以得到保证的,因为要利用形态学特征进行匹配,首先就应该定位这些轮廓。
最后是旋转不变性,角度是候选的常客,只要是目标在空间中进行的是刚体变换,变换后的特征仍然会服从角度一致。但是对于out-of-plane的投影变换(相机成像)来说,物体的任何性质都不会被保留。但是对于畸变程度较小的镜头和真实尺度较小的目标,在数倍焦距外的相对角度被投影到2d平面后往往只会产生轻微的形变,因此之间的相对角度仍然可以作为一个筛选的标准,一般只要适当放宽筛选条件即可,这也适合对匹配目标进行初步筛选,删除那些极端值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。