机器视觉算法
图像采集一章讲述了将一张图像传送到计算机这一过程中所需的各种硬件部件。例如:为了突出感兴趣的物体时,光源是至关重要的;为了在恰当时刻正确曝光来拍摄一幅图像时,带有外触发功能的图像卡和摄像机就是解决问题的关键;为了获取清晰且没有畸变的图像,镜头就变得很重要。但设备并不会真正去“看”,并不能提取我们感兴趣的信息。就如人的眼睛仅仅只是一个传感器,没有大脑的协助我们仍然处理不了所看到的信息。因此在传感器将图像数据传送到计算机后,对这些图像数据传送到计算机后,对这些图像数据的处理才是机器视觉过程的真正关键。
1.数据结构
本节介绍图像、区域和亚像素轮廓的数据结构。
1.1. 图像
机器视觉里,图像是基本的数据结构,它所包含的数据通常是由图像采集设备传送到计算机内存中的。一个像素能被看成对能量的采样结果,此能量是在曝光过程中传感器 上一个感光单元所累积得到的,它积累了在传感器光谱响应范围内的所有光能。传感器的光谱响应通常包括全部可见光谱和部分近红外光谱。因此,黑白摄像机会返回每个像素所对应的一个能量的采样结果,这些结果就组成了一副单通道灰度值图像。而对RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像。再还有遥感图像,图像的每个像素对应非常多的能量采样结果,这样做的目的是对光谱进行更细致的采样,所以每个像素对应更多个能量样本也是可以的。例如,HYDICE传感器的每个像素可以采集210个光谱采样结果。所以,为了处理所有可能的应用,图像可以被视为由一组任意多的通道组成的。
很直观地,图像通道可以被简单地看作是一个二维数组,这也是程序设计语言中表示图像时所使用的数据结构。因此在像素(r, c)处的灰度值可以被解释为矩阵:
中的一个元素。使用更正规的描述方式,视某个宽度为 W ,高度为 h 的图像通道 f 为一个函数,该函数表述从离散二维平面的一个矩形子集
到某一个实数的关系,像素位置是(r,c)处的灰度值 g ,定义为 g = f(r,c)。
图像采集设备不但在空间上把图像离散化,同事也会把灰度值离散化到某个固定的 灰度级范围内。多数情况下,灰度值被离散化为8位(一个字节),即所有可能的灰度值所组成的集合是
有些情况下则需要使用更高的位深。自此我们已视一幅图像为一个在空间上采样的函数,如此处理是因为我们就是以这种方式从图像采集设备获取图像的。
1.2. 区域
机器视觉的任务之一就是识别图像中包含某些特性的区域(感兴趣区域ROI),比如执行一个阈值分割处理(见1.4节)。因此我们还需要一种数据结构,它可以表示一幅图像中一个任意的像素子集。故而,我们把区域定义为离散平面的一个任意子集:
对任意图像,可以用一个包含该图像所有像素点的矩形感兴趣区域来表示该幅图像。我们默认每幅图像都有一个相关的感兴趣区域存在,这个感兴趣区域用 R 来表示。很多时候需要描述一幅图像上多个物体,它们可以由区域的集合来简单地表示。
但现在我们还不清楚最好的表示区域的方法。数学上,我们能把区域描述成集合。另一种等价定义将使用区域的特征函数:
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲
{\chi}_{R}{(r,…
这个定义引入了二值图像来描述区域。一个二值图像用灰度值0表示不在区域内的点,用1(或其他非0的数)表示被包含在区域内的点。同样的我们可以将图像中多个目标物体描绘成多个标记图像,图像中像素灰度值表示此像素属于哪个区域,大于0的标记被用来表示不同区域,0为不被包含的点。
二值图像的弊端:(1)必须存储区域外的点,效率不高; (2)二值图像不易向负坐标区域保存扩展; (3)用标记图像表示多个区域时无法描述交叠区域。
因此需要找到一种通过高效率的方式仅存储区域内所包含的点来表示区域。
表3.1是区域的一个小例子:
沿水平或垂直方向,行程延伸所覆盖的邻近像素点属于一个区域。如图所示的区域能用四个行程来保存,区域也可以表示为该区域全部行程的一个并集:
此处,Ri表示一个行程,也可以表示一个区域。行程存储的顺序是根据其纵坐标和起始横坐标的字典序确定的,这样的排序方式对于算法的执行速度是至关重要的。
上个例子中,若每个像素占一个字节,,采用二值图像来描述区域要占用35个字节,如果每个像素占一位,此区域也需要5个字节(因为每个格子都要存储为数值)。**而采用行程编码时,如果区域的坐标值保存在16位的整数中,只需要24个字节即可(2字节*12个数据)。**虽然没有节省很多空间,但我们注意到使用行程编码时仅仅需要保存区域的边界。而边界上的点的数量与区域面积的平方根成比例。由于二值图像法至少需要保存区域外接矩形内所有像素点,所以使用行程编码相较于二值图像法通常会明显减少存储空间的使用。例如:对于w X h的一个矩形区域,只需要存储h个行程,而二值发需要保存w X h 个像素点(即,w h或(w h/8)个字节)。另外,行程编码仅存储区域内的点,所以无需检查像素是在区域内还是区域外。最后,为了表示多个区域,我们可以使用链表或数组来保存行程编码描述的多个区域,此时由于每个区域的信息是被独立保存和处理的,因此处理交叠区域也没有问题
1.3. 亚像素精度轮廓
通常讨论的数据结构都是像素级别的。因为某些应用需要达到比图像分辨率还高的精度,因此从图像中提取亚像素精度数据是很重要的。亚像素数据可以通过亚像素阈值分割或亚像素边缘提取来获得。图 3.1 显示了几个轮廓的例子:
典型的轮廓提取是基于像素网络的。,轮廓上控制点之间的距离平均约为1个像素。在计算机里,轮廓只是用浮点数表示的横和纵坐标所构成的数组来表示的。闭合轮廓(图1)通常使用同一个坐标来表示轮廓上的第一个点和最后一个点,或使用一个特殊属性来表示。此外,几个轮廓能在一个结合点汇合,如轮廓3、4、5.