清华主页 - 清华新闻 - 综合时讯 - 正文

SIFT算法基于OpenCV实现图像拼接(全景图像)

一、SIFT算法。

特征转换的尺度不变。(Scale-invariant feature transform或SIFT)机器视觉算法用于检测和描述图像中的局部特征,它在空间尺度上寻找极值点,并提取位置、尺度、旋转不变量,这个算法是David Lowe于1999年发表,2004年完善总结。

SIFT算法的本质。SIFT算法的本质。

在不同的尺度空间上找到关键点(特征点),并计算关键点的方向。SIFT发现的关键点是一些非常突出的,光照不会,由仿射变换和噪声等因素引起的点,如角点、边缘点、暗区亮点、亮区暗点等。

SIFT算法的步骤。1.尺度空间的极值检测。

:利用高斯金字塔和高斯差分函数找出极大值和极小值,这些极值被认为是可能的关键点。2.定位特征点。

:通过一系列拟合函数模型找出特征点的位置,或通过双线插值找到不同尺度关键点的精确位置,确保它们在尺度变化下仍然稳定。3.赋值特征点。

:每个关键点󿀌计算周围区域的梯度方向图像,然后找到方向直方图。选择方向直方图中强度最高的两个方向(邻近角)xff0;,确定关键点的主要方向。4.描述特征点。

:基于关键点的局部图像,操作࿰,如高斯滤波、差分、旋转不变性和对比度归一化c;生成固定长度的SIFT描述符。

详细操作步骤可参考相关文章:http://t.csdnimg.cn这里不要介绍太多iHTDD。

二、图像拼接。图像拼接技术。

它是一种将多个具有重叠部分的图像组合成无缝全景图或高分辨率图像的技术。该技术在医学成像、计算机视觉、卫星数据处理、军事目标自动识别等领域具有重要应用。图像拼接的基本思想是找到图像之间的映射关系,然后将它们拼接在一起�形成一个统一的视图。

  1. 图像拼接通常包括以下关键步骤:特征检测和提取。
  2. :检测所有输入图像中的特征点,这些特征是图像中的像素组,用于后续图像配置。SIFT(常用的特征提取方法;尺度不变特征变化)、SURF(xfff09加速稳定性;、FAST(特征加速检测算法)和ORB(Oriented FAST and Rotated BRIEF)等。特征匹配。
  3. :建立图像之间的几何对应关系,它们可以在一个共同的参考系统中进行变换、比较和分析。这一步通常涉及使用匹配算法,如暴力匹配或KNN(最近的邻居)匹配。透视变换。
  4. :图像之间的变换矩阵࿰是根据匹配的特征来计算的c;单应性矩阵࿰通常是单应性矩阵c;用于将图像从一个坐标系映射到另一个坐标系。图像融合。

:通过改变边界附近的图像灰度级,去除缝隙󿀌创建混合图像󿀌从而实现图像之间的平滑过渡。#xff08混合模式;Blend modes)将两层融合在一起。

三、操作实现。

这里先展示一下需要拼接的图片。

(1)特征提取与检测:

def detectAndDescribe(self, image): # 将彩色图片转换成灰度图片 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 建立SIFT生成器 descriptor = cv2.xfeatures2d.SIFT_create() # 检测SIFT特征点󿀌并计算描述子 (kps, features) = descriptor.detectAndCompute(image, None) # 将结果转化为NumPy数组 kps = np.float32([kp.pt for kp in kps]) # 返回特征集󿀌以及相应的描述特征 return (kps, features)。

(2)#xff08模板匹配;暴力模板匹配)并计算透视变换矩阵。

def matchKeypoints(self, kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh): # 建立暴力匹配器 matcher = cv2.BFMatcher() # 使用KNN检测来自AANN检测、B图SIFT特征匹配,K=2 rawMatches = matcher.knnMatch(featuresA, featuresB, 2) matches = [] for m in rawMatches: # 当最近距离和次近距离的比值小于ratio值时,保留此匹配对 if len(m) == 2 and m[0].distance < m[1].distance * ratio: # featuresa存储两个点, featuresB中的索引值 matches.append((m[0].trainIdx, m[0].queryIdx)) # 筛选后的匹配大于4点,转换矩阵的计算视角 if len(matches) > 4: # 获得匹配的点坐标 ptsA = np.float32([kpsA[i] for (_, i) in matches]) ptsB = np.float32([kpsB[i] for (i, _) in matches]) # 转换矩阵的计算视角 (H, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, reprojThresh) # 返回结果 return (matches, H, status) # 如果匹配小于4点󿀌返回None return None。

(3)拼接图片的初始化。

def drawMatches(self, imageA, imageB, kpsA, kpsB, matches, status): # 初始化可视化图片󿀌将A、图B左右连接在一起 (hA, wA) = imageA.shape[:2] (hB, wB) = imageB.shape[:2] vis = np.zeros((max(hA, hB), wA + wB, 3), dtype="uint8") vis[0:hA, 0:wA] = imageA vis[0:hB, wA:] = imageB # 联合经历󿀌画出匹配对 for ((trainIdx, queryIdx), s) in zip(matches, status): # 当点匹配成功时,在可视化图上画画 if s == 1: # 画出匹配对 ptA = (int(kpsA[queryIdx][0]), int(kpsA[queryIdx][1])) ptB = (int(kpsB[trainIdx][0]) + wA, int(kpsB[trainIdx][1])) cv2.line(vis, ptA, ptB, (0, 255, 0), 1) # 返回可视化结果 return vis。

(4)图像融合。

def stitch(self, images, ratio=0.75, reprojThresh=4.0,showMatches=False): #获取输入图片 (imageB, imageA) = images #检测A、SIFT图片的关键特征点,并计算特征描述子 (kpsA, featuresA) = self.detectAndDescribe(imageA) (kpsB, featuresB) = self.detectAndDescribe(imageB) # 与两张图片相匹配的所有特征点,返回匹配结果 M = self.matchKeypoints(kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh) # 如果返回结果为空,不匹配成功的特征点,退出算法 if M is None: return None # H从3x3的角度改变矩阵 (matches, H, status) = M # 转换图片A的视角,result是转换后的图片 result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0])) self.cv_show('result', result) # 将图片B传输到result图片的最左端 result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB self.cv_show('result', result) # 测试是否需要显示图片匹配 if showMatches: # 生成匹配图片 vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches, status) # 返回结果 return (result, vis)。

(5)效果展示。

# 读拼接图片imageage = cv2.imread("left_01.png")imageB = cv2.imread("right_01.png")# 将图片拼接成全景图stitcher = Stitcher()(result, vis) = stitcher.stitch([imageA, imageB], showMatches=True)# cv2显示所有图片.imshow("Image A", imageA)cv2.imshow("Image B", imageB)cv2.imshow("Keypoint Matches", vis)cv2.imshow("Result", result)cv2.waitKey(0)cv2.destroyAllWindows()。

2025-06-24 12:43:05

相关新闻

清华大学新闻中心版权所有,清华大学新闻网编辑部维护,电子信箱: news@tsinghua.edu.cn
Copyright 2001-2020 news.tsinghua.edu.cn. All rights reserved.