其他分享
首页 > 其他分享> > 机器视觉学习笔记(四)-- 数据结构

机器视觉学习笔记(四)-- 数据结构

作者:互联网

3.1.1  图像

        很直观地,图像通道可以被简单看作是一个二维数组,这也是程序设计语言中表示图像时所使用的数据结构。因此,在像素(r,c)处的灰度值可以被解释为矩阵:g=f_{r,c}中的一个元素。使用更正规的描述方式,我们能视某个宽度为\omega高度为h的图像通道f为一个函数,该函数表述从离散二维平面\mathbb{Z}^2(也即,R\subset \mathbb{Z}^2)的一个矩形子集R={0,...,h-1}*{0,...,w-1}到某一个实数的关系:f:R \mapsto \mathbb{R},像素的位置是(r,c)处的灰度值g定义为g=f(r,c)。同理,一个多通道图像可以被视为一个函数f:R \mapsto \mathbb{R}^n,这里的n表示通道的数目。

        在上面的讨论中,我们已经假定了灰度值是由实数表示的。在几乎所有的情况下,图像采集设备不但在空间上把图像离散化,同时也会把灰度值离散化到某一固定的灰度级范围内。多数情况下,灰度值将被离散化为8位(一个字节),也就是,所有可能的灰度值所组成的集合是\mathbb{G}_{8}={0,...,255}。在有些情况下,需要使用更高的位深,如10,12,甚至16位,相应地,为了更精确旗舰,一个单通道图像应被视为某个函数f:R \mapsto \mathbb{G}_b,此处\mathbb{G}_{b}={0,...,2^b-1}是位深b时的灰度值集合。然而,这一差别在很多情况下并不重要,所以我们将图像视为实数集的一个函数。

        到目前为止,我们已经视一幅图像为一个在空间上采样的函数,如此处理是因为我们就是以这种方式从图像采集设备获取图像的。出于理论上的考虑,有时为了方便会将图像视为无限连续域上的函数,即,f:\mathbb{R}^2 \mapsto \mathbb{R}^n。我们将在本章部分地方使用此种约定。

3.1.2  区域

        机器视觉的任务之一就是识别图像中包含某些特性的区域,比如执行一个阈值分割处理(见3.4节)。因此,至少我们还需要一种数据结构,它可以表示一幅图像中一个任意的像素子集。此外,对于形态学处理,在3.6.1节我们将会读到为避免artifact,能将区域延伸到图像边界外是重要的。故而,我们把区域定义为离散平面的一个任意子集:R \subset \mathbb{Z}^2

        在很多情况下,将图像处理限制在图像上某一特定的感兴趣区域(ROI)内是机器有用的。就此而论,可以视一幅图像为一个从某感兴趣区域到某一数据集的函数:f:R \mapsto \mathbb{R}^n。这个感兴趣区域有时也被称为图像的定义域,因为它是图像函数f的定义域。我们可以将这两种图像表示的方法统一:对任意一幅图像,可以用一个包含该图像所有像素点的矩形感兴趣区域来表示此幅图像。所以,从现在开始我们默认每幅图像都有一个相关的感兴趣区域存在,这个感兴趣区域用R来表示。

        在3.4.2节中我们将看到,很多时候需要描述一幅图像上的多个物体。从概念上讲,它们可以由区域的集合来简单表示。

        从抽象的观点看,讨论图像中的区域将使问题更简单。但现在我们还不清楚最好地表示区域的方法。从数学上,我们能把区域描述成集合,如上文中的定义。另一种等价定义讲使用区域的特征函数:

\chi _{R}(r,c)=\left\{\begin{matrix} 1(r,c)\in R\\ 0(r,c)\notin R \end{matrix}\right.

        这个定义引入了二值图像来描述区域。一个二值图像用灰度值0表示不在区域内的点,用1(或其他非0的数)表示被包含在区域内的点。作为此定义的延伸,我们可以讲图像中的多个目标物体描绘成多个标记图像,标记图像中每个像素的灰度值表示此像素应属于哪个区域。典型地,标记0将用来表示不被任何区域包含的那些点,而大于0的标记将被用来表示不同的区域。

        以二值图像来描述区域的方法存在着一个明显的缺陷:它必须存储那些区域外的(有时是非常多的)点。此外,这种表示法的效率也不高:图像上的每个点至少需要占用一个位来保存。通常情况下,这种表示法回使用一个位来保存。通常情况下,这种表示法会使用一个字节而不是一个位来表示图像上的一个点,因为访问字节比访问位更容易。这种表示法在运行时间上也不经济:为了确定哪些点在区域内,我们必须对二值图像上的所有点进行检测。此外,以二值图像来保存扩展到负坐标的区域是不易实现的,因为那需要借助复杂麻烦的算法才可以实现。最后,用标记图像表示多个区域时无法描述交叠区域,所以如果基于这些区域时无法描述交叠区域,所以如果基于这些区域进行形态学处理将会引起问题。如果能通过一种高效率的方式仅存储区域内所包含的点来表示区域,那么这种表示法将非常有用。

        表3.1是区域的一个小示例。我们首先注意到沿水平或者垂直方向,行程延伸所覆盖的邻近像素点属于一个区域。大多数的区域都是这种情况。我们能使用这种特征来仅保存每次行程的必要数据。由于图像数据在内存中通常是一行紧接一行保存的,所以最好使用水平行程.因此,表示每次行程的最小量的数据包括该行程的纵坐标值、行程开始和行程结束对应横坐标值。这一保存区域的方法被称作行程表示法或行程编码。使用此种方式,本例所示的区域能用四个行程来保存,如图3.1所示。因此,区域也可以表示位该区域全部行程的一个并集:

R = \bigcup_{i=1}^{n}r_{i}

        此处,r_{i}表示一个行程,也可以表示一个区域。注意,行程存储的顺序是根据其纵坐标和其实横坐标的字典序确定的。也就是说,行程r_{i}=(r_{i},cs_{i},ce_{i})R内的存储顺序定义为:

        r_{i}\prec r_{j}\Leftrightarrow r_{i}<r_{j}\vee r_{i}=r_{j}\wedge cs_{i}<cs_{j}

        对于使用了行程编码区域的算法,此排序方法对于算法的执行速度是至关重要的。

        在上例中,如果每个像素占用一个字节,那么采用二值图像来描述区域要占用35个字节,如果每个像素占用一个位,用二值图像来描述此区域也需要5个字节。而采用行程编码表示此区域时,如果区域的坐标值保存在16位整数中,只需要24个字节即可。虽然与每个像素只占一个位的二值图像相比,行程编码没有阶跃任何存储空间。但同每像素一个字节的二值图像相比,行程编码已经节省了存储空间,尽管节省的空间有限。

        为加深理解行程编码如何节省存储空间,我们注意到使用行程编码时仅仅需要保存区域的边界。一般来说,区域边界上的点的数量与区域面积的平方根成比例。由于二值图像法至少需要保存区域外接矩形内的所有像素点,所以同二值图像法相比,使用行程编码通常会明显减少存储空间的使用。例如,对于一个w\times h的矩形区域,采用行程编码只需要存储h个行程,而二值图像法需要保存w\times h个像素点(即,wh[w/8]h个字节,取决于二值图中每个像素是占一个字节还是一个位)。同理,直径是d的圆采用行程编码只需保存d个行程,而二值法需要保存至少d \times d个像素。我们能够看出采用行程编码通常可以显著地降低内存的使用。另外,行程编码仅存储区域内的点,所以无须检查像素是在区域内还是在区域外。行程编码的这两个优点可以显著减少执行的时间。并且,使用行程编码可以容易地表示含有负坐标的区域。最后一点,为表示多个区域,我们可以使用链表或数组来保存采用行程编码描述的多个区域,此时由于每个区域的信息是被独立保存和处理的,因此处理交叠区域也没有问题。

3.1.3  亚像素精度轮廓

        目前为止,我们讨论的数据结构都是像素精度的。通常,因为某些应用中需要达到比图像像素分辨率更高的精度,因此从图像中提取亚像素精度数据是很重要的。亚像素数据可以通过亚像素阈值分割或亚像素边缘提取来获得。这些处理得到的结果可以用亚像素精度轮廓来表示。图3.1显示了几个轮廓的例子。可以看到,轮廓基本上可以被描绘成多边形,即一组排序后的控制点(r_{i},c_{i})的集合,排序是用来说明哪些控制点是彼此相连接的。由于典型的轮廓提取是基于像素网格的,所以轮廓提取是基于像素网格的,所以轮廓上控制点之间的距离平均约为一个像素。在计算机里,轮廓只是用浮点数表示的横和纵坐标所构成的数组来表示的。从图3.1我们还可以发现轮廓有多种空间拓扑结构,比如,轮廓可以是闭的(图中轮廓1)或是开的(图中轮廓2~5)。闭合轮廓通常使用同一个坐标来表示轮廓上的第一个点和最后一个点,或使用一个特殊属性来表示。此外,几个轮廓能在一个接合点回合,如轮廓3、4和5。与轮廓一起明确地保存这些拓扑信息有时是有用的。

标签:编码,轮廓,--,行程,笔记,像素,区域,图像,数据结构
来源: https://blog.csdn.net/qq_45006390/article/details/121126103