当初选方向时就由于从小几何就不好、缺乏空间想像能力才没有选择摄影測量方向而是选择了GIS。

昨天同学找我帮他做图像匹配。这我哪里懂啊,无奈我是一个别人有求于我,总是不好意思开口拒绝的人。于是乎就看着他给的一章节内容開始敲代码了,今天总算给他完毕了。

做的比較简单,中间也遇到了不少问题,尤其是计算量大的问题,由于老师给的数据是粗配准过的数据, RANSAC算法评估时就简化了下。

理论内容:

第5章 图像配准建立几何变换模型

特征点建立匹配关系之后,下一步就是求解图像之间的变换关系。仿射变换可以非常好的表达图像之间的一般变换,而且最少仅仅须要3对匹配点就行求解。因为之前用的匹配算法不能保证没有误匹配(实际上是存在误匹配的),本文将採用RANSAC方法来预计两幅图像之间的仿射变换关系。假设有足够多的图像特征匹配符合某一个特定的仿射变换,则我们觉得当前匹配惬意,反之,我们进行下一次预计。

5.1 RANSAC算法

RANSAC(RandomSample Consensus),即随机採样一致算法。准确来说是一种从一组包括噪声的观測数据中通过迭代的方式预计出数据所满足的某个数学模型的參数的算法。

由Fischler和Bolles于1981年提出,是眼下广泛使用的一种剔除误匹配点的方法。

5.2 仿射变换

仿射变换(Affine Transform)是一种仿射平面到自身的变换,它可以保持点的共线性(Parallelism,即保持二维图形之间相对位置关系不变,平行仍是平行。相交直线的交角不变)和直线的平行性(Straightness,即变换后圆弧还是圆弧。直线还是直线)。仿射变换是配准中最经常使用的一类转换模型,在几何学中有专门的仿射几何分支,并将仿射变换被看成一个平行的投影链。

仿射变换可用以个三乘三的矩阵表示,最后一行为(0,0,1)。

该变换矩阵将原坐标(x,y)变为(x`,y`)。

变换矩阵为:

我们在空间几何信息检验中。觉得假设两幅图像描写叙述的是同一个物体或场景,因为图片大小,位置和角度的不同,两幅图像中对应的兴趣点的位置信息应该满足某一个仿射变换关系。

因此,我们以两幅图像之间的特征匹配作为数据来预计仿射变换矩阵,假设能找到一个足够多特征匹配都服从的仿射变换。则觉得当前匹配让人惬意。

5.3 RANSAC仿射变换空间检验

空间检验就是通过RANSAC算法,依据图像之间的特征匹配信息,预计出一个仿射变换模型。

我们用下式来表示仿射变换矩阵

当中m1,m2,m3,m4体现尺度和旋转特性。tx是x方向上的平移,ty是y方向上的平移。

则一对匹配点的坐标能够写成

或者写成

当中。(x,y)是变换前,(u,v)是变换后的坐标。

为了解求仿射变换參数,对上式做一下变形:

可写成A*x=b,则模型參数x的值

要解六个參数。至少须要三对特征匹配。因此RANSAC随机採样每次须要三对数据来预计仿射变换矩阵。

介绍完相关概念和理论,以下是RANSAC空间几何信息检验的流程:

1. 数据准备:找到两幅图像(I1和I2)之间的匹配点对和坐标信息。

2. 模型预计:如果有n>3对的匹配点对,随机选取3对。依据公式解求仿射变换模型參数m1,m2,m3,m4,tx,ty。

3. 模型评估:对图像I1中全部的已匹配的点(x,y)做上述仿射变换,得到一系列变换后的坐标(u`,v`)。将这些得到的坐标和I2中相应的匹配点(u,v)求欧氏距离,即仿射变换的预计误差E。并用I2中相应特征点的尺度信息做归一化,这样每个特征匹配能够求出一个归一化的预计误差。终于得到一个预计误差向量。

4. 依据预计误差向量确定一个误差阈值T(该怎么确定阈值?),预计误差向量中低于T的相应的特征匹配为Inliers。

5. 假设Inliers数目大于眼下最大的Inliers数目。则当做找到了当前最好的放射变换,保存此变换(我看到网上说要对其做局部优化,将全部满足当前最好的仿射变换的Inliers匹配点对。又一次做母性预计和模型评估并保存仿射变换信息。

一般说来。经过局部优化的新放射变换一般会有很多其它Inliers,是什么意思啊?)

6. 反复2到6步骤。终于得到的仿射变换觉得是I1和I2之间最好的放射变换模型。

这里记录下做的流程:

(1)推导六參数计算公式。编写仿射变换六參数类(因为之前没有检查数据,数据中有几组反复的,导致一直报“尝试除以零”这个错误);

代码例如以下:

/*
* 求解仿射变换模型參数的类
*
@ 刘硕编制
*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ImageMatching
{ class ParameterHelper
{
public int[] X_Cor
{
get;
set;
}
public int[] Y_Cor
{
get;
set;
}
public int[] U_Cor
{
get;
set;
}
public int[] V_Cor
{
get;
set;
}
//仿射变换模型六參数
public double m1
{
get
{
return ((U_Cor[1] - U_Cor[0]) - m2 * (Y_Cor[1] - Y_Cor[0])) / (X_Cor[1] - X_Cor[0]);
}
}
public double m2
{
get
{
return ((U_Cor[1] - U_Cor[0])*(X_Cor[2] - X_Cor[0]) - (U_Cor[2] - U_Cor[0])*(X_Cor[1] - X_Cor[0])) /
((Y_Cor[1] - Y_Cor[0])*(X_Cor[2] - X_Cor[0]) - (Y_Cor[2]- Y_Cor[0])*(X_Cor[1] - X_Cor[0]));
}
}
public double m3
{
get
{
return ((V_Cor[1] - V_Cor[0]) - m4 * (Y_Cor[1] - Y_Cor[0])) / (X_Cor[1] - X_Cor[0]);
}
}
public double m4
{
get
{
return ((V_Cor[1] - V_Cor[0]) * (X_Cor[2] - X_Cor[0]) - (V_Cor[2] - V_Cor[0]) * (X_Cor[1] - X_Cor[0])) /
((Y_Cor[1] - Y_Cor[0]) * (X_Cor[2] - X_Cor[0]) - (Y_Cor[2] - Y_Cor[0]) * (X_Cor[1] - X_Cor[0]));
}
}
public double tx
{
get
{
return U_Cor[0] - m1 * X_Cor[0] - m2 * Y_Cor[0];
}
}
public double ty
{
get
{
return V_Cor[0] - m3 * X_Cor[0] - m4 * Y_Cor[0];
}
} }
}

(2)对全部匹配点计算组合数,按RANSAC随机採样每次须要三对数据来预计仿射变换矩阵,则共同拥有(Cn3*Cn3)种组合情况,计算量相当大。

(3)求解完仿射变换模型六參数后,则要进行模型评估。

即计算归一化误差,得到归一化误差向量。

(4)确定阈值,计算Inliers数。这里參照论文。阈值取全部归一化误差的均值(按说应该取自适应阈值,奈何不懂啊)。

(5)比較全部组合的Inliers数。得到最优仿射变换,并保存。

(6)输出仿射变换六參数及匹配后坐标

欢迎留言拍砖!

图像配准建立仿射变换模型并用RANSAC算法评估的更多相关文章

  1. 非刚性图像配准 matlab简单示例 demons算法

    2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...

  2. 【图像配准】基于互信息的图像配准算法:MI、EMI、ECC算法

    简单介绍: 基于互信息的图像配准算法以其较高的配准精度和广泛的适用性而成为图像配准领域研究的热点之中的一个.而基于互信息的医学图像配准方法被觉得是最好的配准方法之中的一个.基于此.本文将介绍简单的基于 ...

  3. CV 两幅图像配准

    http://www.cnblogs.com/Lemon-Li/p/3504717.html 图像配准算法一般可分为: 一.基于图像灰度统计特性配准算法:二.基于图像特征配准算法:三.基于图像理解的配 ...

  4. 机器视觉之 ICP算法和RANSAC算法

    临时研究了下机器视觉两个基本算法的算法原理 ,可能有理解错误的地方,希望发现了告诉我一下 主要是了解思想,就不写具体的计算公式之类的了 (一) ICP算法(Iterative Closest Poin ...

  5. 【计算机视觉】图像配准(Image Registration)

    (Source:https://blog.sicara.com/image-registration-sift-deep-learning-3c794d794b7a)  图像配准方法概述 图像配准广泛 ...

  6. RANSAC算法详解

    给定两个点p1与p2的坐标,确定这两点所构成的直线,要求对于输入的任意点p3,都可以判断它是否在该直线上.初中解析几何知识告诉我们,判断一个点在直线上,只需其与直线上任意两点点斜率都相同即可.实际操作 ...

  7. RANSAC算法在图像拼接上的应用的实现

    关于算法原理请参考<基于SURF特征的图像与视频拼接技术的研究>. 一.问题提出         RANSAC的算法原理并不复杂,比较复杂的地方在于"建立模型"和&qu ...

  8. 图像配准:从SIFT到深度学习

      图像配准(Image Registration)是计算机视觉中的基本步骤.在本文中,我们首先介绍基于OpenCV的方法,然后介绍深度学习的方法. 什么是图像配准 图像配准就是找到一幅图像像素到另一 ...

  9. 图像数据到网格数据-1——MarchingCubes算法

    原文:http://blog.csdn.net/u013339596/article/details/19167907 概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用 ...

随机推荐

  1. 服务器编程心得(四)—— 如何将socket设置为非阻塞模式

    1. windows平台上无论利用socket()函数还是WSASocket()函数创建的socket都是阻塞模式的: SOCKET WSAAPI socket( _In_ int af, _In_ ...

  2. UVa-340-猜数字

    #include <stdio.h> char ans[1000],gus[1000]; int num[10]; int main() { int n,cnt=1; while (sca ...

  3. [LOJ] 分块九题 5

    区间开平方,区间查询. lazy标记改为区间是否全是1或者0,这样的区间是没有更新价值的. //Stay foolish,stay hungry,stay young,stay simple #inc ...

  4. soc desgin 目前需要做的事情

    1.熟练的画时序图 达到一旦有想法可以立即通过时序图表达出来. 2.下面是项目中经常用到的典型设计 2.1串并互相转换 2.2cdc 2.3握手协议 2.4cgc(门控时钟) 2.5AHB2reg文件 ...

  5. 条款7:为多太基类声明virtual析构函数

    NOTE: 1.polymorphic(多态性质的)base classes 应该声明一个virtual 析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. ...

  6. Python之微信-微信好友头像合成

    仔细看下图,你的头像就藏在里面哦!!! 有没有犯密集恐惧症?这并不震撼,如果你有 5000 位好友的话,做出来的图看着会更刺激些. 看完了图,你可能想知道这个图咋做出来的,不会是我闲着无聊把把好友头像 ...

  7. python初体验 ——>>> 模拟体育竞技

    python初体验 ——>>> 模拟体育竞技 一.排球训练营 1. 简介: 模拟不同的两个队伍进行排球的模拟比赛. 2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ...

  8. 【C#】【数据结构】005-栈:顺序栈

    C#数据结构:顺序栈 1.自定义顺序栈结构: /// <summary> /// 顺序栈 /// </summary> /// <typeparam name=" ...

  9. [第一波模拟\day1\T2]{分班}(divide.cpp)

    [题目描述] 小N,小A,小T又大了一岁了. 现在,他们已经是高二年级的学生了.众所周知,高二的小朋友是要进行文理科分班考试的,这样子的话,三个好朋友说不定就会不分在一个班. 于是三个人决定,都考平均 ...

  10. LA 4064 (计数 极角排序) Magnetic Train Tracks

    这个题和UVa11529很相似. 枚举一个中心点,然后按极角排序,统计以这个点为钝角的三角形的个数,然后用C(n, 3)减去就是答案. 另外遇到直角三角形的情况很是蛋疼,可以用一个eps,不嫌麻烦的话 ...