欧酷勒斯的工作室任务 当前位置:首页>欧酷勒斯的工作室任务>正文

欧酷勒斯的工作室任务

发布时间:2018-10-18

原标题:用于 C# 图像识别的轮廓分析技术

刘皓心念一动,弑神枪瞬间放大亿万倍,一枪刺出,神魔皆屠,天崩地裂,大海被分裂开来,苍穹被刺穿,一枪之下全部太乙金仙中期的真龙都陨落了。

丛菊两开他日泪

“我杀了你!”张宣忽然纵身跳起,手持一柄长枪,向着大殿门口的纪丹青杀去。
城堡中驻扎有一千军队,按照一比三的比例,三百大食军,七百花剌子模的本土军,主将叫侯赛因,名字非常普通,是一名大食军中的低级军官。

大师先是愣了一下,紧接着脸色大变,“不好,可能是小三出事了。快去看看。”

用于 C♯ 图像识别的轮廓分析技术

供稿:Conmajia

标题:Contour Analysis for Image Recognition in C#

作者:Pavel Torgashov

此中文版翻译已获作者本人授权.

Jan. 23rd,2018



图 1 本文提供的范例程序截图

简介

本文阐述了轮廓分析 (Contour Analysis,以下简称 CA) 的理论基础以及它在图像识别方面的实际应用. 文章末尾提供了一个处理 CA 的库文件和一个范例 (参见图 1).

文章第一部分给出了 CA 的定义和相关定理. 笔者尝试尽量用精简的语言对 CA 进行概要说明,以使读者能尽快理解 CA 的理论基础并加以应用. 同时,笔者提出了一些自己的思考,试图将文章核心聚焦于 CA 理论的部分方面和算法优化上. 第二部分在此基础上对算法进行了阐述.

第三部分是对 C♯ 专用库 ContourAnalysis 的说明.

第一部分 轮廓分析基础

为什么需要轮廓分析

CA 允许对物体呈现的外部边界——即轮廓——进行描述、存储、比较和查找. 它假定此轮廓已包含有物体形状的必要信息,而不考虑物体内部的点. 对于图像,CA 将分析从 2 维空间限定到轮廓空间上可降低计算强度及算法的复杂性. 由此,CA 便可高效地解决模式识别的主要问题:图像物体的换位、旋转及重设大小. 对这些变换而言,CA 方法是不变的.

主要概念

首先,定义物体的轮廓.

轮廓是物体的边界,一组可将物体从背景中分离出来的点 (像素) 的集合.

在计算机视觉系统中,经常用到多种编码格式来记录轮廓,如 Freeman 编码、2 维编码、多项式编码等. 但在本文讲述的轮廓分析中,不使用上述任何一种编码.

作为替代,笔者使用一组复数序列对轮廓进行编码. 对某一轮廓而言,假定其上一点为起点,将该点固定. (顺时针或逆时针地) 遍历轮廓上的点,记录每个点相对于它前一个点偏移量,用复数 (a+mathbf{i}b​) 表示偏移向量(a​)(x​) 轴方向上的偏移量,(b​)(y​) 轴方向上的偏移量. 图 2 展示了一个简单的例子.

图 2 使用复数表示偏移向量

考虑到 3 维物体的物理实际,它们的轮廓不会内交,并且轮廓的最后一点总是与起点重合. 这保证了上述编码方法可以唯一地表示一个轮廓.

在这里,定义轮廓上的一个偏移向量为基础向量 (elementary vector),简称 EV,用小写希腊字母表示;由 EV 所组成的复数序列称为向量轮廓 (vector contour),简称 VC,用大写希腊字母表示.

这样,长度为 (k) 的向量轮廓 (Gamma) 可以表示为:
[ Gamma=(gamma_0,gamma_1,cdots,gamma_{k-1}) ]
之所以采用复数编码,是因为对向量进行运算相对于其他直接计算轮廓的编码方式,在不增加额外计算负担和复杂性的基础上,可以保留可观的轮廓数学信息.

基本上,复数编码非常接近 2 维编码,后者将轮廓定义为一组 2 维空间中的坐标. 然而在处理点积上二者是不同的.

轮廓的性质

  1. 闭合轮廓的所有 EV,其和为零. EV 最终指向起点,它们的和是一个零向量.
  2. 轮廓向量不依赖于源图像的平行换位. 由于轮廓是相对于起点编码的,所以这种编码方式不会因初始轮廓而改变.
  3. 图像旋转相当于对轮廓上所有 EV 旋转同一角度.
  4. 改变起点不会改变 VC. EV 是相对于它之前的一点而编码,显然改变起点后,整个轮廓的 EV 序列除了起点位置外不会有任何改变.
  5. 源图像缩放可认为是对轮廓中每个 EV 与缩放因子的乘积.

轮廓的点积

考虑轮廓 (Gamma) 和轮廓 (N) 的点积,有:
[ eta=(Gamma,N)=sum_{n=0}^{k-1}(gamma_n,upsilon_n) ag{1} ]
其中,(k) 是向量轮廓 VC 的维数;(gamma_n) 是轮廓 (Gamma) 的第 (n) 个 EV;(upsilon_n) 是轮廓 (N) 的第 (n) 个 EV. 复数点积 ((gamma_n,upsilon_n)) 计算方法为:
[ (a+mathbf{i}b,c+mathbf{i}d)=(a+mathbf{i}b)cdot(c-mathbf{i}d)=ac+bd+mathbf{i}(bc-ad) ag{2} ]
需要注意,在 CA 中计算轮廓的点积时,各轮廓维数必须一致,即 EV 的数量应相等.

将两个 EV 作为简单向量相乘,其点积为:
[ left((a,b),(c,d) ight)=ac+bd ag{3} ]
比较式 ((2)) 和式 ((3)),可以发现:

  1. 向量的点积结果为实数,复数的乘积为复数.
  2. 复数点积的实数部分与对应向量的点积相等.

根据线性代数知识,向量的点积等于其夹角的余弦. 这意味着两个垂直的向量其点积总是为零,同向的两个向量其点积最大.

向量乘积的这些性质,使得它可以用来衡量向量之间的接近程度. 乘积值越大,说明向量间夹角越小,即它们越接近. 互相垂直的向量其乘积为零,随着夹角继续增大,其乘积为负值,直到再次平行时得到最大值 (绝对值). 式 ((1)) 显然也具有与此相同的性质.

接下来引入归一化点积 (Normalized Scalar Product,NSP) 的概念:
[ eta=frac{(Gamma,N)}{|Gamma||N|} ag{4} ]
(|Gamma|)(|N|) 计算方法为:
[ |Gamma|=left(sum_{n=0}^{k-1}|gamma_n|^2 ight)^{frac{1}{2}} ag{5} ]
复数空间中的 NSP 亦为复数.

于是,NSP 归一化的最大可能值为单位向量 (mathbf{E}) (|(mathbf{E}|=1)),且仅在
[ Gamma=mu N ag{6} ]
时成立. 式中 (mu) 为任意复数.

我们知道,两个复数相乘,相当于它们的长度相乘 (缩放),幅角相加 (旋转). 式 ((6)) 中轮廓 (mu N) 即表示轮廓 (N) 被旋转和缩放 (mu) 后的结果.

所以对 NSP 而言,当且仅当轮廓 (Gamma) 和轮廓 (N) 为相同轮廓时——可以按一定系数旋转或缩放——其模达到最大.

如表 1 所示例子. 假设两个同样的轮廓进行点积运算,可得 (mathrm{NSP}=1). 将其中一个旋转 (90^circ),可得 (mathrm{NSP}=0+mathbf{i}). 旋转 (180^circ) 则得 (mathrm{NSP}=-1). 于是,NSP 的实数部分给出了轮廓夹角的余弦值,而模 (|mathrm{NSP}|) 恒等于 (1).

表 1 轮廓归一化点积的性质

类似的,由式 ((4)) 可知,如果增加某个向量轮廓的缩放因数,仍有 (mathrm{NSP}=1).

结论 1 NSP 的模不随换位、旋转或缩放而改变.

故而仅当两个轮廓在旋转方向和缩放大小均相同时,其 NSP 为 (mathbf{E}),否则均小于 (mathbf{E}). 实际上,NSP 的模与其换位、旋转或缩放等变换均无关. 类似的,如果轮廓处于变化中,则它们的 NSP 必小于 (mathbf{E}).

结论 2 NSP 的模体现了轮廓之间的接近程度.

轮廓的相关函数

上一节,我们确立了 NSP 在轮廓相似性判断中的作用. 然而要使用这一性质,取决于对起点的选取.

((6)) 仅当轮廓的起点一致时成立. 如果轮廓唯一,但 EV 所参考的起点不同,则其 (mathrm{NSP} emathbf{E}).

下面引入一个新的概念,两个轮廓的内相关函数 (intercorrelation function,ICF):
[ au(m)=(Gamma,N^{(m)}), qquad m=0,1,cdots,k-1 ag{7} ]
式中 (N^{(m)}) 是轮廓 (N) 循环移位 (m) 次得到的 EV.

例如,(N=(n_1,n_2,n_3,n_4))(N^{(1)}=(n_2,n_3,n_4,n_1))(N^{(2)}=(n_3,n_4,n_1,n_2)).

ICF 揭示了轮廓 (Gamma) 和轮廓 (N) 在移位 (m) 次时的相似程度. 它是 (k) 的周期函数,所以我们限制 (min[0,k-1]). 显然有:
[ au_{mathrm{max}}=maxleft(frac{ au(m)}{|Gamma||N|} ight),qquad m=0,1,cdots,k-1 ag{8} ]
综上,模 (| au_{mathrm{max}}|) 表示了两个轮廓的相似度,并当轮廓相同时,(| au_{mathrm{max}}|=mathbf{E}). 夹角 (arg( au_{mathrm{max}})) 给出了一个轮廓相对另一个的夹角.

结论 3 ICF 模最大值表示了两个轮廓的相似度.

结论 4 ICF 模的最大值不受换位、缩放、旋转或起点移位的影响.

另一个新概念是自相关函数 (autocorrelation function,ACF). ACF 实际是 ICF 在 (Gamma=N) 时的特例,有:
[ upsilon(m)=(Gamma,Gamma^{(m)}),qquad m=0,1,cdots,k-1 ag{9} ]
下面考察 ACF 的性质.

图 3 自相关函数的性质
  1. ACF 与轮廓起点选取无关. 由式 ((1)) 可知,起点的变化不会导致 (eta) 改变,

  2. ACF 由轮廓 EV 两两相乘得到,在 (0)(k) 范围内对称分布,对称点为 (k/2).

(N=(n_1,n_2,n_3,n_4)),可以写出其对不同 (m) 的 ACF:

(mathrm{ACF}(0)=(n_1,n_1)+(n_2,n_2)+(n_3,n_3)+(n_4,n_4))

(mathrm{ACF}(1)=(n_1,n_2)+(n_2,n_3)+(n_3,n_4)+(n_4,n_1))

(mathrm{ACF}(2)=(n_1,n_3)+(n_2,n_4)+(n_3,n_1)+(n_4,n_2))

(mathrm{ACF}(3)=(n_1,n_4)+(n_2,n_1)+(n_3,n_2)+(n_4,n_3))

(mathrm{ACF}(4)=(n_1,n_1)+(n_2,n_2)+(n_3,n_3)+(n_4,n_4))

可知 (mathrm{ACF}(1)=mathrm{ACF}(3)^*)(ecause |a^*|=|a|)( herefore |mathrm{ACF}(1)|=|mathrm{ACF}(3)|).

类似的,(|mathrm{ACF}(0)|=|mathrm{ACF}(4)|).

  1. 由图 4 可以看出,除最后一幅图像外,前 3 幅图像其 ACF——用蓝色表示——均关于 (k/2) 对称.





图 4 轮廓 ACF 示例
  1. 在某种意义上,可以认为轮廓的 ACF 代表了轮廓的形状特性.

  2. 对 ACF 取模无关于其缩放、位置、旋转或是起点的选取.

以上即是 CA 的理论部分. 在这一部分,笔者为了引入下一部分模式识别,只介绍了较为重要的相关概念和理论计算.

第二部分 轮廓分析的实际应用

一般的识别算法

图像识别运算一般有以下几个步骤:

  1. 图像预处理. 包括平滑、去噪,提高对比度等.
  2. 二值化处理.
  3. 筛选轮廓,提取边界、范围,峰值因数等.
  4. 强制限定轮廓为归一化长度、平滑度.
  5. 遍历各个已发现的轮廓,并搜索与之具有最大相似度的模板,完成识别.

步骤 1 至步骤 3 涉及到专门的图像处理方法,与本文讲述的 CA 无关,故不作讨论.

下面将研究搜索和比较轮廓模板的算法.

估算 CA 算法性能

假设已有大小为 (n imes n) 像素,预处理完毕的图像,其轮廓也已选取. 以步长 (s) 对图像进行归一化,得其总边长为:
[ L=2 frac{n^2}{s} ag{10} ]
可见平面 2 维图像转化为轮廓后不会降低其维度,计算复杂度依然为 (O(n^2)).

但是我们依然可以得到这样的推论:

  1. 上述估算考虑的是极限情况. 真实图像中的轮廓很少出现轮廓极小而覆盖面极大,轮廓的总边长远小于 (2n^2/s).
  2. 图像被分解为多个轮廓后,可以对各个部分进行分别处理以降低复杂度.
  3. 2 维图像的基本算法不会随图像尺寸缩放 (如 SURF、SIFT) 或旋转 (如 Haar) 而改变.
  4. CA 允许渐进式处理图像. 这意味着可以对轮廓进行分类,随后处理每类中的第一个轮廓得到结果. 余下的轮廓在后台进行处理,这样就能以 (O(n)) 的复杂度获得第一批次处理结果,极大地提高算法响应速度.
  5. 由于轮廓之间互相独立,所以可以并行化处理,或是利用 GPU 加速.

以上只考虑了如何处理轮廓,然而要从图像中得到这些轮廓,依然需要至少 (O(n^2)) 的复杂度. 当然,实际计算中,提取轮廓所占处理时间通常不会超过 (10\%)~(20\%).

由于轮廓实际上是 1 维的复数向量,它的复杂度随着轮廓数量增加而呈指数上升. 显然通过预处理减少轮廓数量是提高算法性能最有效的方式.

由式 ((7))、式 ((8)),我们知道要比较轮廓——在目标轮廓和模板之间——需要找到其 ICF. 对长度为 (k) 的轮廓来说,点积运算复杂度为 (O(k)),ICF 的复杂度为 (O(k^2)). 同时,假设有 (t) 个待比较的模板轮廓,那么匹配模板的时间就是
[ O(k^2 t) ag{11} ]
于是总的复杂度即为
[ O(n^2k^2t) ag{12} ]
计算第一批次 (即前文推论 4) 轮廓的复杂度为
[ O(nk^2t) ag{13} ]
显然计算量依然很大,接下来将尝试对此进行化简和优化.

轮廓描述符

(未完待续)

编辑:建帝开

发布:2018-10-18 02:17:58

当前文章:http://thrksw.com/html/gd/2014/0820/8454466.html

清粉话术 网络游戏赚钱的方法 2018年挣钱的行业 初中党支部民主生活会 最牛的邀约成功话术 广告联盟 如何加入蜂鸟赚钱团队 米赚和钱咖哪个好

38212 45290 42467 23453 95816 5469550046 45293 37121

责任编辑:王戏北

随机推荐