pythonopencv图片拼接、特征点匹配

pythonopencv图⽚拼接、特征点匹配
⼀、算法⽬的:
在同⼀位置拍摄的两幅或者多幅图像是单应性相关的的,使⽤该约束将很多图⽚缝补起来,拼成⼀个⼤的图像来创建全景图像。两张图⽚的拼接必须⾸先到相同特征,也就是说两张照⽚必须要有重叠的部分才能实现拼接,对⼈眼来说很容易到两张图⽚的相似点,对计算机来说需要借助算法。因此图像拼接的第⼀步是分别获取两张图⽚的特征点并对特征点进⾏匹配,第⼆步对图⽚进⾏透视变换并对图⽚进⾏拼接。
⼆、特征点配对:
查特征点使⽤sift⽅法,将两幅或者多幅图像中的相似点提取出来并完成图像的特征点匹配,相关sift的原理解释请看前⾯介绍。
运⾏sift到特征匹配点对:
下⾯的图⽚是需要匹配的两张原图,⽽且它们具有相同的区域,可以到相同特征点并完成匹配,由于两张图⽚相似点⽐较多,特征点容易,所以匹配效果很明显。
三、RANSAC介绍:
1、ransac
是随机⼀致性采样,该⽅法是⽤来到正确模型来拟合带来有噪声数据的迭代⽅法。给定⼀个模型,例如点集之间的单应性矩阵,ransac 的基本思想是,数据中包含正确的点和噪声点,合理的模型应该能够在描述正确数据点的同时摒弃噪声点。大灯清洗装置
RANSAC算法的具体描述是:给定N个数据点组成的集合P,假设集合中⼤多数的点都是可以通过⼀个模型来产⽣的,且最少通过n个点
(n<N)可以拟合出模型的参数,则可以通过以下的迭代⽅式拟合该参数。
对下⾯的操作执⾏k次:
(1)从P中随机选择n个数据点;
(2)⽤这n个数据点拟合出⼀个模型M;
(3)对P中剩余的数据点,计算每个点与模型M的距离,距离超过阈值的则认定为局外点,不超过阈值的认定为局内点,并记录该模型M所对应的局内点的值m;
迭代k次以后,选择m最⼤的模型M作为拟合的结果。
因为在实际应⽤中N的值通常会很⼤,那么从其中任选n个数据点的组合就会很⼤,如果对所有组合都进⾏上⾯的操作运算量就会很⼤,因此对于k的选择就很重要。通常情况下,只要保证模型估计需要的n个点都是点的概率⾜够⾼即可。因此设w为N个数据中局内点的⽐例,z为进⾏k次选取后,⾄少有⼀次选取的n个点都是局内点的概率。则有
拟合结果显⽰表⽰为:
2、Ransac原理:
OpenCV中滤除误匹配对采⽤RANSAC算法寻⼀个最佳单应性矩阵H,矩阵⼤⼩为3×3。RANSAC⽬的是到最优的参数矩阵使得满⾜该矩阵的数据点个数最多,通常令h33=1来归⼀化矩阵。由于单应性矩阵有8个未知参数,⾄少需要8个线性⽅程求解,对应到点位置信息上,⼀组点对可以列出两个⽅程,则⾄少包含4组匹配点对。
RANSAC算法从匹配数据集中随机抽出4个样本并保证这4个样本之间不共线,计算出单应性矩阵,然后利⽤这个模型测试所有数据,并计算满⾜这个模型数据点的个数与投影误差(即代价函数),若此模型为最优模型,则对应的代价函数最⼩。
3、ransac算法步骤为:
1. 随机从数据集中随机抽出4个样本数据 (此4个样本之间不能共线),计算出变换矩阵H,记为模型M;
双片糊箱机垂直风道机箱2. 计算数据集中所有数据与模型M的投影误差,若误差⼩于阈值,加⼊内点集 I ;
3. 如果当前内点集 I 元素个数⼤于最优内点集 I_best , 则更新 I_best = I,同时更新迭代次数k ;
4. 如果迭代次数⼤于k,则退出 ; 否则迭代次数加1,并重复上述步骤)
注:迭代次数k在不⼤于最⼤迭代次数的情况下,是在不断更新⽽不是固定的;
使⽤ransac算法求解单应性矩阵,将下⾯模型类添加到homography.py中,相关解释如下:
class RansacModel(object):
#⽤于测试单应性矩阵的类
def __init__(self, debug=False):
self.debug = debug
def fit(self, data):
#计算选取的4个对应的单应性矩阵
#将其转置,来调⽤H_from_points()计算单应性矩阵
data = data.T
# 映射的起始点
fp = data[:3, :4]
# 映射的⽬标点
tp = data[3:, :4]
# 计算单应性矩阵然后返回
return H_from_points(fp, tp)
def get_error(self, data, H):
#对所有的对应计算单应性矩阵,然后对每个变换后的点,返回相应的误差
data = data.T
# 映射的起始点
fp = data[:3]
# 映射的⽬标点
tp = data[3:]
# 变换 fp
fp_transformed = dot(H, fp)
汽车电子调节器
# 归⼀化齐次坐标
for i in range(3):
fp_transformed[i]/=fp_transformed[2]
# 返回每个点的坐标
return sqrt(sum((tp - fp_transformed) ** 2, axis=0))
四、拼接图⽚:
估计出图像间的单应性矩阵,现在我们需要将所有的图像扭曲到⼀个公共的图像平⾯上。通常,这⾥的公共平⾯为中⼼图像平⾯。⼀种⽅法是创建⼀个很⼤的图像,⽐如图像中全部填充0,使其和中⼼图像平⾏,然后将所有的图像扭曲到上⾯。由于我们所有的图像是由照相机⽔平旋转拍摄的,由此我们可以使⽤⼀个简单的步骤:将中⼼图像左边或者右边的区域填充0,以便扭曲的图像腾出空间。
利⽤panorama()函数,使⽤单应性矩阵H,协调相幅图像,创建⽔平全景图像。结果为⼀幅和toim具有相同⾼度的图像。
扭曲图像的相关代码为:
im1 = array(Image.open(imname[1]), "uint8")led天花灯电源
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12, im1, im2, delta, delta)
im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)
im1 = array(Image.open(imname[3]), "f")
im_32 = warp.panorama(H_32, im1, im_02, delta, delta)
复合硅微粉im1 = array(Image.open(imname[4]), "f")
im_42 = warp.panorama(dot(H_32, H_43), im1, im_32, delta, 2 * delta)
五、实验结果分析:
第⼀对图⽚特征点匹配结果为:
拼接效果为:
由于两张图⽚重合的地⽅⽐较多,⽽且相同点⽐较多,特征点到的⽐较多,图⽚经过扭曲后的拼接效果较好,⽽且拼接也算完美,但是对于图⽚相差较较⼤的两张图⽚进⾏拼接时就会出现问题。

本文发布于:2024-09-22 17:35:24,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/228100.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   图像   模型
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议