SIFT

Python实现图像全景拼接

目标:将数张有重叠部分的图像通过特征点检测,匹配,图像变换拼成一幅无缝的全景图或高分辨率图像 在图像拼接中首先利用SIFT算法提取图像特征进而进行特征匹配,继而使用RANSAC算法对特征匹配的结果进行优化,接着利用图像变换结构进行图像映射,最终进行图像融合。 在图像拼接过程中,运用SIFT局部描述算子检测图像中的关键点和特征,SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高,所以用来检测要拼接图像的特征及关键点就很有优势。而接下来即步骤三是找到重叠的图片部分,连接所有图片之后就可以形成一个基本的全景图了。匹配图片最常用的方式是采用RANSAC(RANdom SAmple Consensus, 随机抽样一致),用此排除掉不符合大部分几何变换的匹配。之后利用这些匹配的点来估算单应矩阵”(Homography Estimation),也就是将其中一张图像通过关联性和另一张匹配。 使用的算法: RANSAC SIFT 1. 利用SIFT方法检测特征点 def detectAndDescribe(image): # 将彩色图片转换成灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 建立SIFT生成器 descriptor = cv2.xfeatures2d.SIFT_create() # 检测SIFT特征点,并计算描述子 (kps, features) = descriptor.

区域检测——Blob & SIFT

针对Harris无法拟合尺度问题而提出 目标:独立检测同一图像缩放版本的对应区域 需要通过尺度选择机制来寻找与图像变换协变的特征区域大小 “当尺度改变时控制每个圆内的内容不变” Laplacian核 具体的算法是在边缘检测中使用的高斯一阶偏导核转换为高斯二阶偏导核 使用Laplacian核与图像进行卷积操作 **边缘:**出现波纹的地方 **尺度信息:**当波纹重叠并出现极值的地方 空间选择:如果Laplacian的尺度与blob的尺度“匹配”,则Laplacian响应的幅度将在blob的中心达到最大值 在实际运用的过程中是使用模板匹配信号,即不断改变Laplacian的参数$\sigma$取处理后的结果达到峰值时的$\sigma$,随着参数的增大会导致后面的特征消失(高斯偏导的面积公式中的$\sigma$在分母) 为了保持响应不变(尺度不变),必须将高斯导数乘以$\sigma$ 拉普拉斯导数是二阶高斯导数,所以它必须乘以$\sigma^2$ 二维空间的Blob的检测 高斯的拉普拉斯算子:用于二维检测的圆对称算子 $$\nabla^2 g=\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2}\Longrightarrow \nabla_{norm}^2 g=\sigma^2(\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2})$$ Laplcain算子中的$\sigma$与检测对象画出的圆的半径$r$的关系 为了得到最大响应,Laplacian的零点必须与圆对齐 令:$$\nabla_{norm}^2 g=0即:\sigma^2(\frac{\partial^2 g}{\partial x^2}+\frac{\partial^2 g}{\partial y^2})=0$$ 化简后: $$ (x^2+y^2-2\sigma^2)e^{-\frac{x^2+y^2}{2\sigma^2}}=0 $$