SIFT图像拼接(python)

SIFT算法python实现图像拼接

目录

SIFT算法.... 2

1.读入图片并转化为灰度图... 2

2.创建SIFT对象.... 2

求解特征点和特征向量.... 2

3.构造BFMacher对象... 2

4.用knnMatch方法进行关键点多点匹配.... 2

5.去除不可靠匹配.... 3

6.寻得可靠匹配点并转换类型.... 3

7.求解转换矩阵.... 4

8.图像空间变换.... 4

9.图像拼接.... 5

10.显示结果.... 5

SIFT算法

1.读入图片并转化为灰度图

left = cv2.imread("left.png")
right = cv2.imread(
"right.png")

gray1 = cv2.cvtColor(left, cv2.THRESH_BINARY)
gray2 = cv2.cvtColor(right
, cv2.THRESH_BINARY)

2.创建SIFT对象

sift = cv2.xfeatures2d.SIFT_create()

创建对象时不需要传递参数

求解特征点和特征向量

kpsA, dpA = sift.detectAndCompute(gray1, None)
kpsB
, dpB = sift.detectAndCompute(gray2, None)

有两个必须的参数,第一个是求解特征点和特征向量的图像。第二个参数决定是否对特定区域求解,传入一个mask

返回值kps是对图像求解的特征点,是一个一维向量,其中每一个元素属于keypoint类型。dp是与kps对性的特征向量,也是一个列表,其中每一个元素是长度为128的向量.

3.构造BFMacher对象

brute force蛮力匹配

bf = cv2.BFMatcher()

4.用knnMatch方法进行关键点多点匹配

matches = bf.knnMatch(dpA, dpB, k=2)

knnMatch有三个参数,前两个是需要进行匹配的图像的特征向量,k为需要匹配的点的对数。

返回值是一个列表,其中每个元素也是一个列表,列表中有两个元素,为DMatch类型

[<DMatch 00000191C8166470>, <DMatch 00000191C81664B0>]

                                                         (图片截屏自blbl课程视屏)

5.去除不可靠匹配

good_matches = []
for m in matches:
   
if len(m) == 2 and m[0].distance < 0.4 * m[1].distance:
        good_matches.append((m[
0].queryIdx, m[0].trainIdx))

新建一个空列表

遍历matches,如果第一对点的欧氏距离小于k倍第二对点的欧氏距离则说明第一对点匹配可靠,将这对点的索引号追加到good_matches

6.寻得可靠匹配点并转换类型

kps1 = np.float32([kp.pt for kp in kpsA])
kps2 = np.float32([kp.pt
for kp in kpsB]

keypointpt属性(即关键点的坐标)赋值给kps

kps1 = np.float32([kps1[a[0]] for a in good_matches])
kps2 = np.float32([kps2[a[
1]] for a in good_matches]

将根据good_matches匹配好的序号,将kps1kps2对应排序

7.求解转换矩阵

M, status = cv2.findHomography(kps2, kps1, cv2.RANSAC, 4.0)

findHomography的参数,前两个是对应关键点的坐标,第三个是求解方法,第四个是将点对视为内点的最大允许重投影错误阈值(仅用于RANSACRHO方法)。

返回值M为变换矩阵。

8.图像空间变换

result = cv2.warpPerspective(right, M, (left.shape[1] + right.shape[1], right.shape[0]))

warpPerspective的参数中,第一个为要变换的图像,第二个为变换矩阵,第三个为变换后图像的长,第四个为变换后图像的高。

9.图像拼接

result[0:left.shape[0], 0:left.shape[1]] = left

将变换后的图像对应要拼接原图像的地方用原图像覆盖。

10.显示结果

cv2.imshow("left", left)
cv2.imshow(
"right", right)
cv2.imshow(
"result", result)
cv2.waitKey(
0)
cv2.destroyAllWindows()

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SIFT(尺度不变特征变换)是一种常用的图像特征提取算法,可以用于图像拼接。下面是一个使用Python实现SIFT图像拼接的示例代码: ```python import cv2 import numpy as np def sift_image_stitching(image1, image2): # 使用SIFT算法提取关键点和特征描述子 sift = cv2.SIFT_create() keypoints1, descriptors1 = sift.detectAndCompute(image1, None) keypoints2, descriptors2 = sift.detectAndCompute(image2, None) # 使用FLANN匹配器进行特征点匹配 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(descriptors1, descriptors2, k=2) # 进行筛选,保留良好的匹配点 good_matches = [] for m, n in matches: if m.distance < 0.7 * n.distance: good_matches.append(m) # 获取匹配点的坐标 src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) # 使用RANSAC算法估计单应性矩阵 M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 进行图像拼接 result = cv2.warpPerspective(image1, M, (image1.shape[1] + image2.shape[1], image1.shape[0])) result[0:image2.shape[0], 0:image2.shape[1]] = image2 return result # 读取两张待拼接的图像 image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') # 调用SIFT图像拼接函数 result = sift_image_stitching(image1, image2) # 显示拼接结果 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,上述代码中的`image1.jpg`和`image2.jpg`是待拼接的两张图像文件路径,你需要将其替换为你自己的图像文件路径。此外,你还需要安装OpenCV库来运行该代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值