用于 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. su和sudo命令的区别

    一. 使用 su 命令临时切换用户身份 参考 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比如我们以普通用户beinan登录的,但要添加用户任务,执行useradd ,bein ...

  2. 从源码(编译)安装golang

    从源码安装golang 通常情况下,安装go只需要在官网(https://golang.org/dl/)下载适合系统的二进制发布包,按照安装说明进行安装即可. 对于Linux, Mac OS X和Fr ...

  3. Swift语言中与C/C++和Java不同的语法(四)

    这一节,我们将会讨论一下Swift中的函数相关的基本内容 首先是函数的创建: func sayHello (name:String) -> String { return "Hello ...

  4. 微信小程序开发之scroll-view

    本文主要介绍通过scroll-view实现回至顶部,如下效果 一.页面代码 顶部的工具栏放一个查找按钮,滚动区域实现分页,目的就是为了点击上一页\下一页时,自动回到顶部. scroll-view必须指 ...

  5. Hadoop源码篇---解读Mapprer源码outPut输出

    一.前述 上次讲完MapReduce的输入后,这次开始讲MapReduce的输出.注意MapReduce的原语很重要: "相同"的key为一组,调用一次reduce方法,方法内迭代 ...

  6. JQuery编写简易京东购物车功能

    前天无意间看到有一位程序员的博客,有一篇名为无聊时编写的购物车,看了之后,只是觉得很垃圾,因为代码很臃肿,当然我写的也不咋地,当然我也是复 习一下所学的js,再敲这个的期间遇到了如下问题,1:子元素父 ...

  7. Spring入门之IOC

    IOC/DI: Spring最核心的灵魂,IOC/DI(控制反转/依赖注入)!,这里一定要理解他,理解这个思想.我会细说什么是IOC/DI.他的思想是什么.它带来了那些好处. 进入正题,先说说什么是i ...

  8. Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解

    上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定 ...

  9. CSS中水平居中的方法

    居中是我们在css中经常遇到的问题,一般有水平居中.垂直居中.垂直水平居中这3种情况,那么今天首先就来对学习到的水平居中的方法做个总结笔记. css水平居中 text-align:center 它的效 ...

  10. u3d开发中可能会遇到的设计模式

    最近一段时间,面试了一些程序员,当然主要招聘的岗位是Unity3D开发.面试过程中对于三年以上的程序员我都会问其在开发中是否会总结一些常用的设计模式和设计方法,当然目的只是想了解程序员的自我学习情况以 ...