用于 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) \tag{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) \tag{2}
\]
需要注意,在 CA 中计算轮廓的点积时,各轮廓维数必须一致,即 EV 的数量应相等.

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

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

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

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

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

于是,NSP 归一化的最大可能值为单位向量 \(\mathbf{E}\) (|\(\mathbf{E}|=1\)),且仅在
\[
\Gamma=\mu N \tag{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}\ne\mathbf{E}\).

下面引入一个新的概念,两个轮廓的内相关函数 (intercorrelation function,ICF):
\[
\tau(m)=(\Gamma,N^{(m)}), \qquad m=0,1,\cdots,k-1 \tag{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\) 的周期函数,所以我们限制 \(m\in[0,k-1]\). 显然有:
\[
\tau_{\mathrm{max}}=\max\left(\frac{\tau(m)}{|\Gamma||N|}\right),\qquad m=0,1,\cdots,k-1 \tag{8}
\]
综上,模 \(|\tau_{\mathrm{max}}|\) 表示了两个轮廓的相似度,并当轮廓相同时,\(|\tau_{\mathrm{max}}|=\mathbf{E}\). 夹角 \(\arg(\tau_{\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 \tag{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)^*\),\(\because |a^*|=|a|\),\(\therefore |\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 的理论部分. 在这一部分,笔者为了引入下一部分模式识别,只介绍了较为重要的相关概念和理论计算.

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

通用识别算法

(未完待续)

用于 C♯ 图像识别的轮廓分析技术的更多相关文章

  1. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  2. 分析技术和方法论营销理论知识框架,营销方面4P、用户使用行为、STP,管理方面5W2H、逻辑树、金字塔、生命周期

    原文:五种分析框架:PEST.5W2H.逻辑树.4P.用户使用行为 最近在一点点的啃<谁说菜鸟不懂得数据分析>,相当慢,相当的费脑力,总之,真正的学习伴随着痛苦:) 最初拿到这本书的时候, ...

  3. 控制流程完整性:给大家介绍一种“另类”的Javascript反分析技术

    写在前面的话 理解恶意软件的真实代码对恶意软件分析人员来说是非常有优势的,因为这样才能够真正了解恶意软件所要做的事情.但不幸的是,我们并不总是能够得到“真实”的代码,有时恶意软件分析人员可能需要类似反 ...

  4. SPSS分析技术:二阶聚类分析;为什么出现大学生“裸贷”业务,因为放贷者知道贷款者还不起

    SPSS分析技术:二阶聚类分析:为什么出现大学生"裸贷"业务,因为放贷者知道贷款者还不起 今天将介绍一种智能聚类法,二阶聚类法,在开始介绍之前,先解答很多人在后台提出的一个疑问:那 ...

  5. 分析技术在PMP中的应用

    Analytical Techniques, 根据可能的项目或者环境变量变化以及它们与其他变量之间的关系,对潜在后果进行评估,分析和预测的各种技术. 4.4.2.2 监控项目工作: 分析技术 包括: ...

  6. MCP|WJ|Identification of candidate plasma protein biomarkers for cervical cancer using the multiplex proximity extension assay(利用多重邻位延伸分析技术进行宫颈癌血浆蛋白候选生物标记物的鉴定研究)

    文献名:Identification of candidate plasma protein biomarkers for cervical cancer using the multiplex pr ...

  7. 书评第003篇:《0day安全:软件漏洞分析技术(第2版)》

    本书基本信息 丛书名:安全技术大系 作者:王清(主编),张东辉.周浩.王继刚.赵双(编著) 出版社:电子工业出版社 出版时间:2011-6-1 ISBN:9787121133961 版次:1 页数:7 ...

  8. 《0day安全软件漏洞分析技术》学习笔记

    最近因为工作需要在看0day的软件漏洞分析,发现这本<0day安全软件漏洞分析技术(第2版)>真是本好书,唯一缺点就是书上的环境是Windows XP 32Bit的,基于现状难以进行实践, ...

  9. SPSS分析技术:多元方差分析

    SPSS分析技术:多元方差分析 下面要介绍多元方差分析的内容,多元方差分析是研究多个自变量与多个因变量相互关系的一种统计理论方法,又称多变量分析.多元方差分析实质上是单因变量方差分析(包括单因素和多因 ...

随机推荐

  1. 重温javascript数据类型

    在javaScript中,有五种简单的数据类型,分别是 Undefined Null Boolean Number String 还有一种复杂的数据类型object,object本质是有一组无序的名值 ...

  2. Handwritten Parsers & Lexers in Go (翻译)

    用go实现Parsers & Lexers 在当今网络应用和REST API的时代,编写解析器似乎是一种垂死的艺术.你可能会认为编写解析器是一个复杂的工作,只保留给编程语言设计师,但我想消除这 ...

  3. Linux(CentOS6.5)下编译Popt报错”GNU gettext is required. The latest version”(gettext已经编译安装,但是没有安装在默认目录)的解决方案

    本文地址http://comexchan.cnblogs.com/,作者Comex Chan,尊重知识产权,转载请注明出处,谢谢!   背景: 编译popt的时候出现下述报错. 直接vi查看confi ...

  4. java 操作本地数据库 mysql

    单线程版 /** * */ import java.sql.*; import java.util.Date; import org.omg.CORBA.PUBLIC_MEMBER; /** * @a ...

  5. xlwt 官网的例子

    from time import * from xlwt.Workbook import * from xlwt.Style import * style = XFStyle() wb = Workb ...

  6. [编织消息框架][JAVA核心技术]异常基础

    Java异常体系结构 Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常. 其中异常类Exception又分为运行时异常(RuntimeExcept ...

  7. ubuntu 安装 pythonenv

    This will get you going with the latest version of pyenv and make it easy to fork and contribute any ...

  8. x的x次幂的值为10,求x的近似值

    public class Main { static double eps = 1e-7; public static void main(String[] args){ double l = 2,r ...

  9. Java内存分配以及GC

    转自http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html  写的太棒了,简单易懂 Java垃圾回收概况 Java GC(Gar ...

  10. Robot Framework学习笔记(三)------常用关键字介绍

    下面关键字全部由 Builtin 库提供,Builtin 为 Robot Framework 标准类库.Builtin库提供常用的关键字 1.log log 关键字就是编程语言里的"prin ...