Antkillerfarm Hacking V7.5

graphics » 图像处理理论(五)——ISP

2017-10-17 :: 4614 Words

SIFT

尺度空间(续)

尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中,更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐变大,能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。

尺度空间的应用实例就是图像金字塔

参考:

http://www.cnblogs.com/ronny/p/3886013.html

尺度空间理论

尺度空间的视觉不变性

视觉不变性是对尺度空间算子提出的一种要求:

1.对图像的分析不受图像的灰度水平和对比度变化的影响,即满足灰度不变性和对比度不变性。这主要体现了物体的光照变化

2.对图像的分析和图像的位置、大小、角度以及仿射变换无关,即满足平移不变性、尺度不变性、欧几里德不变性以及仿射不变性。这主要体现了物体的空间位置变化

DOG & LOG

DOG(Difference of Gaussians)和LOG(Laplacian of Gaussian)是尺度空间常用的两种算子。

DOG的定义如下:

\[\Gamma_{\sigma_1,\sigma_2}(x) = I*\frac{1}{\sigma_1\sqrt{2\pi}} \, e^{-(x^2)/(2\sigma^2_1)}-I*\frac{1}{\sigma_2\sqrt{2\pi}} \, e^{-(x^2)/(2\sigma_2^2)}\]

DOG实际上就是两个不同方差的Gaussian核做差。它最典型的用法就是《图像处理理论(二)》中提到的高斯差分金字塔

LOG的计算分2步:

1.计算Gaussian核和图像的卷积\(G(x,y)*f(x,y)\)。

其中:

\[G(x,y) = \frac{1}{2\pi \sigma^2} \exp \left(-\frac{x^2 + y^2}{2 \sigma^2}\right)\]

2.对第1步的结果应用Laplace算子。

Laplace算子的定义为:

\[\Delta f = \nabla^2 f = \nabla \cdot \nabla f\]

其中:

\[\nabla = \left ( \frac{\partial}{\partial x_1} , \ldots , \frac{\partial}{\partial x_n} \right )\]

因为:

\[\Delta[G(x,y)*f(x,y)] = [\Delta G(x,y)]*f(x,y)\]

一般将\([\Delta G(x,y)]\),称为LOG算子。

从上图可以看出两者的函数图像是非常相似的。

参见:

http://blog.csdn.net/kezunhai/article/details/11579785

高斯拉普拉斯算子(Laplace of Gaussian)

构建DOG金字塔

《图像处理理论(三)》中提到的DOG金字塔只用了一个5*5的Gaussian核。如果使用多种Gaussian核,就可得到如下所示的DOG金字塔。

上图中,尺度相同,Gaussian核不同的图片被分为一组(Octave)。

空间极值点检测

关键点是由DOG空间的局部极值点组成的,关键点的初步探查是通过同一组内各DoG相邻两层图像之间比较完成的。

为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。

如上图所示,中间的检测点要与同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

当然这样产生的极值点并不全都是稳定的特征点,因为某些极值点响应较弱,而且DOG算子会产生较强的边缘响应,因此需要剔除不稳定的边缘响应点。

关键点

离散空间的极值点并不是真正的极值点,上图显示了二维函数离散空间得到的极值点与连续空间极值点的差别。利用已知的离散空间点插值得到的连续空间极值点的方法叫做子像素插值(Sub-pixel Interpolation)。

为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。使用图像梯度的方法求取局部结构的稳定方向。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像\(3\sigma\)邻域窗口内像素的梯度和方向分布特征。

在完成关键点的梯度计算后,使用直方图统计邻域内像素的梯度和方向:

方向直方图的峰值则代表了该特征点处邻域梯度的方向,以直方图中最大值作为该关键点的主方向。为了增强匹配的鲁棒性,只保留峰值大于主方向峰值80%的方向作为该关键点的辅方向。

因此,对于有多个峰值的关键点位置,在相同位置和尺度将会有多个关键点被创建。这些关键点梯度相同,但方向不同。仅有15%的关键点被赋予多个方向,但可以明显的提高关键点匹配的稳定性。

实际编程实现中,就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点,并且离散的梯度方向直方图要进行插值拟合处理,来求得更精确的方向角度值,检测结果如下图所示:

通过以上步骤,对于每一个关键点,拥有三个信息:位置、尺度以及方向

关键点特征描述

接下来就是为每个关键点建立一个描述符,用一组向量将这个关键点描述出来,使其不随各种变化而改变,比如光照变化、视角变化等等。这个描述子不但包括关键点,也包含关键点周围对其有贡献的像素点,并且描述符应该有较高的独特性,以便于提高特征点正确匹配的概率。

Lowe建议描述子使用在关键点尺度空间内4*4的窗口中计算的8个方向的梯度信息,共4x4x8=128维向量表征。

表示步骤如下:

1.确定计算描述子所需的图像区域。

特征描述子与特征点所在的尺度有关,因此,对梯度的求取应在特征点对应的高斯图像上进行。将关键点附近的邻域划分为d * d(Lowe建议d=4)个子区域,每个子区域做为一个种子点,每个种子点有8个方向。

2.将坐标轴旋转为关键点的方向,以确保旋转不变性。

3.将邻域内的采样点分配到对应的子区域内,将子区域内的梯度值分配到8个方向上,计算其权值。

4.插值计算每个种子点八个方向的梯度。

5.如上统计的4x4x8=128个梯度信息即为该关键点的特征向量。特征向量形成后,为了去除光照变化的影响,需要对它们进行归一化处理,对于图像灰度值整体漂移,图像各点的梯度是邻域像素相减得到,所以也能去除。

6.描述子向量门限。非线性光照,相机饱和度变化对造成某些方向的梯度值过大,而对方向的影响微弱。因此设置门限值(向量归一化后,一般取0.2)截断较大的梯度值。然后,再进行一次归一化处理,提高特征的鉴别性。

7.按特征点的尺度对特征描述向量进行排序。

总结

SIFT大概算是最复杂的算子了,上文仅是概括描述,省略了大量公式及其推导,但仍然花了很大篇幅才讲完。可以想见,设计一个比SIFT还好的算子会有多么困难,人工设计特征走到这里,差不多也就到头了,后面的天下是属于DL的。

参考

http://blog.csdn.net/zddblog/article/details/7521424

SIFT算法详解

https://mp.weixin.qq.com/s/wYiwuBt8VVYOheJ_jgCHgA

一文读懂图像局部特征点检测算法!

https://mp.weixin.qq.com/s/RnEYHlKA8k-Mva6eK00cnA

基于特征点的视觉全局定位技术

https://zhuanlan.zhihu.com/p/36382429

特征点检测:Harris, SIFT, SURF, ORB

https://zhuanlan.zhihu.com/p/128937547

基于图像的三维建模——特征点检测与匹配

https://zhuanlan.zhihu.com/p/261697473

尺度不变特征转换-SIFT

ISP

ISP(Image Signal Processor),图像信号处理器,是运用在相机或者具备拍摄功能设备上的一种芯片。在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为整个相机拍照、录像的第一步处理流程,对图像质量起着非常重要的作用。

ISP的一般流程如下所示:

下文以如下示例图片的处理流程为例,对整个流程做一个简单的概述。

图像sensor

相机的图像sensor,一般可分为两种,如下图所示:

Foveon X3:Foveon公司的这种sensor(上图左侧)拥有三个感光层,可在不同的深度撷取RGB色光。

Foveon X3虽然色彩不失真,但制作工艺比较复杂,目前只用在少数(10款左右)高端相机中。

Bayer Array:绝大多数相机使用的是上图右侧所示的sensor。这种sensor由两层材料组成。下层是感光层,上层是滤光片。上层中RGB三色滤光片的排列方式被称为Bayer Array。

Bryce E. Bayer,1929~2012,美国科学家。 University of Rochester硕士。Kodak公司研究员。

一个Bayer Array的最小单元包含4个像素点(两个绿色滤光片+一个红色滤光片+1个蓝色滤光片)。两个绿色点呈对角分布,红色点和蓝色点占据剩余的空间。

绿色位于可见光频谱的中段,也是最常见的颜色,所以采样要多一些。

除了Bayer Array之外,常见的还有Fuji Array(主要用于Fuji相机):

当然了,不常见的就更多了:

比如华为最近出的Mate P30 Pro(2019.4)就使用了RYYB Array。

Quad Bayer(4 Cell)技术很好的补偿了小pixel size在低光时的损失.将用户使用场景分成了高光使用小像素高分辨率,低光中”大像素”低噪声。

参考:

https://mp.weixin.qq.com/s/Y9BKcJ-0VjdsRqe387P2kQ

关于RGBNIR sensor的一些讨论

https://mp.weixin.qq.com/s/19UJS6AJzMuUhjTkyqVSxQ

从一个亿像素看camera sensor的发展

RAW Data

图像sensor数字采样的结果,就是所谓的RAW Data。

RAW Data的取值范围取决于sensor的处理器位宽。比如12bit的范围就是0~4095。

考虑到噪点(由热/电噪声产生的光点)的存在,一般会给取值范围设一个>0的下限以过滤噪点,这就是Black Level。这里令Black Level=128,则取值范围为128~4095。

由于实际场景的光强度范围通常只占所有光强可见范围的很小一段,因此,RAW Data直接看起来就像是一块几乎纯色的图片。

比如下图所示的RAW Data,由于取值主要集中于低值区间,因此看起来就是黑乎乎的一片,什么也看不出来。


LibRaw是一个专门用于处理Raw Data的库。

官网:

https://www.libraw.org/

Fork me on GitHub