分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
图像配准算法一般可分为基于图像灰度统计特性配准算法、基于图像特征配准算法和基于图像理解的配准算法。
基于特征的图像配准算法的核心步骤为:特征提取、特征匹配、模型参数估计、图像变换和灰度插值。
下面把论坛中一些人的看法在此总结一下,便于以后参考:
gordon3000:再两幅图像上找到足够的同名点对,然后用多项式模型强行纠正。大小、旋转、噪声等都不是问题。
自己构造算法的话,可以这样。假设A为正确位置的图像,B是待校正的图像。B图上的任意一点(x,y),在校正后图像上的位置应该为(u,v)有(假设多项式为2阶):
u = a0 + a1*x + a2*y + a3*x2 + a4*y2 + a5*x*y
v = b0 + b1*x + b2*y + b3*x2 + b4*y2 + b5*x*y
在B图上散布取x,y值,在A图的同名点上取u,v值,当点数足够时,解a、b共12个参数。
得到方程后,遍历b图所有像元点x,y带入上述公式,就得到了全部配准后的位置u,v。
自动获取同名点比较困难些,其它容易。这个可以多阶,但如果像你说的非刚性变化一般3阶就够了。
littleplane:时间效率要求如何,可以看看Sift算法。
xpjandy:选取两幅图的两个应该相同的点(一共4个点),得到4个点的坐标,然后用A图的两点线段与B图的两点线段计算出坊射变换的矩阵,再把矩阵应用于整幅图就行了。看看opencv吧,好多现成的API函数。
Aniao:必然是六参数配准(仿射变换)啊。
具体求法:
一共是6个参数,坐标轴的变化夹角,旋转夹角,X尺度变化,Y尺度变化,X平移,Y平移。
进行一系列运算过后,可以变成一个线性代数式(具体怎么变换的不用管,比较复杂)
u = Ax + By + C
v = Dx + Ey + F
其中,U,V是目标图的横纵坐标,X,Y是原图横纵坐标
也就是说
u A B C x
v = D E F * y
1 0 0 1 z
具体A-F六个参数的计算可以通过SIFT在两张图中找到足够的尺度不变特征点,然后对这些特征点进行匹配。匹配后就能得到很多特征点对。然后建立
u = Ax + By + C
v = Dx + Ey + F
这样的方程。
一共3对特征点,6个方程,就足够解6个参数了。
但是实际上矩阵空间内三个远远不够。一般要把所有的一起拿来解超定方程组。
u A B C x
v = D E F * y
1 0 0 1 z
你可能还是摸不着头脑,其实是先用SIFT算法找出两张图的尺度不变点,然后再对这些点进行匹配,然后把每一对匹配的点用来计算这个方程
据我所知,OPENCV没有SIFT,不过有人用OPENCV实现过SIFT,可以搜索。至于特征点匹配,SIFT应该能算出128位特征描述子,用两个点之间的特征描述子的欧式距离可以实现匹配。另外要速度优化的话可以不算这个,直接用灰度相关系数和一些其他算法来排除误匹配,比如ransac,另外还有俺毕业论文的新算法。
其实128位特征描述子只有在进行初始配准的时候有用。而且128位空间的欧氏距离计算开销大,一般都用的正交反余弦来逼近。所以干脆不算这个东西,时间开销一下就少了70%以上。那么只知道一些特征点,用什么来进行初始匹配呢?方法就是用特征点之间的灰度相关系数,这个是很轻量级的。
具体我可以给你看论文和代码,但是代码是MATLAB的。另外,里面的剔除误匹配也是很有趣的一个创新。不是ransac,没有那么学术派,而是浅显易懂的东西
leodream:要做图像配准你必须得考虑3个问题,分别是配准时所用到的空间变换模型、配准的相似性测度准则以及空间变换矩阵的寻优方式。
下面我一个一个来给你解释:
1)空间变换模型,是指的这两幅要配准的图像之间的映射模型,比如只有旋转、平移这些操作,那就是刚体变换模型,又比如有缩放操作,甚至X方向和Y方向缩放的幅度都还不一样,那就是仿射变换或者非线性变换模型。总之你要做配准,先要确定这两幅图像之间是一种什么样的映射模型。要是对这个变换模型还不清楚,你就到google上或者万方上搜索“仿射变换”、“刚体变换”这些关键词。帖子里不可能讲的太详细。
2)配准的相似性测度准则。在你确定了变换模型后,接下去要做什么?当然是确定模型里的参数了,而要确定这些参数(不同的变换模型参数个数是不一样的,像刚体变换有x平移、y平移和旋转角度sita三个参数,仿射变换有6个参数)你得告诉程序什么参数是最好的,或者说是正确的。那么判断什么参数是正确的一个准则就是我们说的配准的相似性测度准则,也就是告诉程序在某组参数下是配准的程度是多少,显然使得配准程度最好的那组参数就是我们要找的参数。
3)空间变换矩阵的寻优方式。因为大多数情况下,模型中的参数不是靠解出来的,而是要靠“尝试-判断”这种方式去寻找,空间变换矩阵的寻优说白了也就是怎么对这些参数进行寻优,找出使得配准程度最好的那一组参数的过程。这里有很多方法,如遗传算法、粒子群优化算法等等,如果你对这些算法都不了解,没办法,你只有用最笨的遍历式搜索方法了,也就是以某一个步距,搜索所有的参数组合方式,然后找出使得按照相似性测度准则配准程度最高的那一组参数。
理论性的东西都说完了,下面举一个简单的例子来说明这个过程。
比如有一幅图像A,我将A左移了2个像素,再往下移了3个像素,又顺时针旋转了60度,这时的图像我们称作B。如果我们要对A和B进行配准,其实就是确定2、3、60这三个参数的过程,因为这三个参数一旦确定了,我就知道了B和A的对应关系,换句话说对于B中的任何一个像素点我就知道在A中对应的是哪个点。
这里因为我知道这两幅图只有平移和旋转的变换操作,所以我们采用的模型是刚体变换模型(实际情况下,你如果不知道这两幅图像进行了什么变换操作,只有大概根据图像的位置信息揣测了,一般情况下非线性变换模型是最正确的,但是参数也最多)。
配准的相似性测度准则这里我们就用简单点的(只是举个例子说明下过程,事实上的许多情况都要复杂的多),以二值化后两幅图像重合的像素点个数为准,也就是说我们认为使得两幅图像重合的像素最多的那组参数就是正确的变换参数,理论上来讲,如果两幅图像严格配准了,那么显然他们所有的像素点都是重合的,否则就有错开的部分。
寻优方法比较啰嗦,任何一个优化算法都不是几句话说的明白的,这里直接用遍历搜索法吧。
因为有三个参数需要寻优因此,我们对这三个参数的解空间进行遍历,比如对X方向的平移像素个数我们从-100搜索到+100,步距为1像素,对Y方向的平移像素我们也从-100搜索到+100,步距为1像素,对旋转角度我们从0搜索到360度,步距为1度。这样等于说要完成一个200*200*360次的循环,然后在每次循环里面,我们都判断一下,按照当次循环参数进行变换后的A图像与B图像的重合像素个数有多少,找出200*200*360次循环中使得重合像素个数最多的那组循环中所使用的参数,这组参数就是我们所要的结果,如果一切正常,显然我们会在2,3,60这组参数所在循环中得到重合像素个数最多的结果。而所谓优化算法其实就是用一种更为智能的方式得到2,3,60这三个参数的过程。
这样就完成了配准的过程。
bitsun1983:不知道你说的要配准是什么意思. 是要看这两个图匹配不匹配?
如果是的话,就是先做image alignment,找到最优变换参数(楼上把该这点说的基本都说了),然后变换后再求两个image difference,如果小于一定阀值,就是匹配,这个阀值需要你自己实验,自己找。
我再补充下:
1,慎用SIFT,你这种近似于binary image,SIFT算法我感觉不适用,提取的特征点应该会及其不稳定,我个人经验sift适用于普通的gray image,
附:opencv里面没sift的implementation,据说是应为sift已经被申请专利
2.减少亮度对比度差异的影响的方法很简单,用image normalization,就是先求图的mean,std,然后把所有pixel变换,使得最终mean是0,std是1.
2.关于Image Alignment,推荐论文: Lucas-Kanade 20 years On: A Unifying Framework: Part1,整个TR48页太长,我只读前10页,我用了compositional algorithm,它是最慢的,不过根据我的经验来看,z在变换并不是特别大的时候,还蛮好用的(当然我只用于普通gray image,理论上也适用于近似binary image)。它适用于translation,scaling,rotation变换,寻找最优过程类似于用gradient of multi-variable function 寻找 local minimum。 但是假如变换太大,这个方法应该不行
3,关于代码,http://www.codeproject.com/KB/recipes/ImgAlign.aspx
好好读读刚才那论文,那个代码基本你就能看懂了,否则就是看天书。
Remark:如果图像里有太多非刚性变换,忽略我所有的推荐。
1,你是不是已经试过了SIFT算法?虽然我高度质疑sift在这种场合的适用性,但是既然假如你已经实验了,你可以大概粗略看看特征点提取是不是稳定,不稳定的话后面的特征点向量提取根本不用考虑了
2,你说内存溢出?是不是matlab里面的out of memory 报错啊。我不知道你用了什么sift的implementation,但是还是我的感觉,sift不适用这样的image,当然了,这方面我没太多经验,但是假如你确定你用的sift implementation是可信的,但是产生的key point几千上万了,你就应该想另外算法了。
3,匹配完直接做binary image subtraction 应该会有很多误报,也许你应该用morphological operation 去除一些 outliers,当然具体问题具体分析,我想能看到具体的图应该能给出更详细的建议吧。
无论如何都要resize到比较小的分辨率再做进一步处理的,要不然你的特征点会太多了。
总之这样的问题你总是要实验,看结果,分析,再做改动,很难说有个算法能一定解决的。
xq830210:在SPIE或者IEEE或者SpringerLink上找几篇文章读读,关于图像配准的所有算法在这几个上面都有。
runley:surf算法 opecv2.0。
swimmingfish2004:Shi-Tomasi角点特征+Lucas-kanade(光流)
learning Opencv,P318。
Harris's original definition involved taking the determinant of H(p), subtracting the trace of H(p) (with some weighting coefficient), and then comparing this difference to a predetermined threshold. It was later found by Shi and Tomasi [Shi94] that good corners resulted as long as the smaller of the two eigenvalues was greater than a minimum threshold. Shi and Tomasi's method was not only sufficient but in many cases gave more satisfactory results than Harris's method.
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block var foo = 'bar';
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
一个具有注脚的文本。2
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
gantt
dateFormat YYYY-MM-DD
title Adding GANTT diagram functionality to mermaid
section 现有任务
已完成 :done, des1, 2014-01-06,2014-01-08
进行中 :active, des2, 2014-01-09, 3d
计划一 : des3, after des2, 5d
计划二 : des4, after des3, 5d
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::
这将产生一个流程图。:
我们依旧会支持flowchart的流程图:
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎