SIFT算法得到了图像中的特征点以及相应的特征描述,一般的可以使用K近邻(KNN)算法。K近邻算法求取在空间中距离最近的K个数据点,并将这些数据点归为一类。在进行特征点匹配时,一般使用KNN算法找到最近邻的两个数据点,如果最接近和次接近的比值大于一个既定的值,那么我们保留这个最接近的值,认为它和其匹配的点为good match

def get_good_match(des1,des2):

bf = cv2.BFMatcher()

matches = bf.knnMatch(des1, des2, k=2)

good = []

for m, n in matches:

if m.distance < 0.75 * n.distance:

good.append(m)

return good

3.单应性矩阵Homography Matrix

通过上面的步骤,我们找到了若干两张图中的匹配点,如何将其中一张图通过旋转、变换等方式将其与另一张图对齐呢?这就用到了单应性矩阵了。Homography这个词由Homo和graphy,Homo意为同一,graphy意为图像,也就是同一个东西产生的图像。

单应性矩阵有八个参数,如果要解这八个参数的话,需要八个方程,由于每一个对应的像素点可以产生2个方程(x一个,y一个),那么总共只需要四个像素点就能解出这个单应性矩阵。

RANSAC算法选择其中最优的四个点

随机抽样一致算法(Random sample consensus:RANSAC)

其中:

第一个参数为需要投影的图像(img2)

第二个参数为单应性矩阵(H)

第三个参数为所得图像的矩阵大小((img1.shape[1],img1.shape[0]) )

最后的参数cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP,为插值时使用的插值方法INTER_LINEAR,cv2.WARP_INVERSE_MAP则将M设置为dst--->src的方向变换。

def siftImageAlignment(img1,img2):

_,kp1,des1 = sift_kp(img1)

_,kp2,des2 = sift_kp(img2)

goodMatch = get_good_match(des1,des2)

if len(goodMatch) > 4:

ptsA= np.float32([kp1[m.queryIdx].pt for m in goodMatch]).reshape(-1, 1, 2)

ptsB = np.float32([kp2[m.trainIdx].pt for m in goodMatch]).reshape(-1, 1, 2)

ransacReprojThreshold = 4

H, status =cv2.findHomography(ptsA,ptsB,cv2.RANSAC,ransacReprojThreshold);

imgOut = cv2.warpPerspective(img2, H, (img1.shape[1],img1.shape[0]),flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

return imgOut,H,status

5.综合应用:

import numpy as np

import cv2

import Utility

img1 = cv2.imread('1.jpg')

img2 = cv2.imread('2.jpg')

result,_,_ = siftImageAlignment(img1,img2)

allImg = np.concatenate((img1,img2,result),axis=1)

cv2.namedWindow('Result',cv2.WINDOW_NORMAL)

cv2.imshow('Result',allImg)

cv2.waitKey(0)

6.SIFT速度太慢,利用surf检测

def surf_kp(image):

'''SIFT(surf)特征点检测(速度比sift快)'''

height, width = image.shape[:2]

size = (int(width * 0.2), int(height * 0.2))

shrink = cv2.resize(image, size, interpolation=cv2.INTER_AREA)

gray_image = cv2.cvtColor(shrink,cv2.COLOR_BGR2GRAY)

surf = cv2.xfeatures2d_SURF.create()

kp, des = surf.detectAndCompute(gray_image, None)

return kp,des

为了再一次提升速度将图片进行了缩放,再进行匹配的时候要对4对坐标点进行相应的放大即可。

ORB速度更快,不过效果较差

python图像配准的原理_python利用sift和surf进行图像配准相关推荐

  1. python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)

    通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...

  2. python列表的实现原理_Python列表对象实现原理

    Python 列表对象实现原理 Python 中的列表基于 PyListObject 实现,列表支持元 素的插入.删除.更新操作,因此 PyListObject 是一个变长 对象(列表的长度随着元素的 ...

  3. python实现浮雕效果的原理_python+opencv+图像特效(图像灰度处理、颜色翻转、图片融合,边缘检测,浮雕效果,颜色映射)...

    原图 图像灰度处理 #方式1 import cv2 #读取彩色原图 img0=cv2.imread('E:/python_cv/01.jpg',1) #读取灰度图 img1=cv2.imread('E ...

  4. python是基于什么原理_Python基于class()实现面向对象原理详解

    首先,类是一个集合,包含了数据,操作描述的一个抽象集合 你可以首先只把类当做一个容器来使用 class Cycle: def __init__(self,r): self.pi=3.14 self.r ...

  5. python的模拟登录原理_Python模拟登陆实例详解

    本篇文章主要介绍了Python模拟登陆实现代码,这里整理了详细的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 下面分享一个使用Python进行网站模拟登陆的小例子. 原理 使用Cookie技 ...

  6. python绘制折线图保存_Python利用matplotlib绘制折线图的新手教程

    前言 matplotlib是Python中的一个第三方库.主要用于开发2D图表,以渐进式.交互式的方式实现数据可视化,可以更直观的呈现数据,使数据更具说服力. 一.安装matplotlib pip i ...

  7. python处理表格数据教程_python利用Excel读取和存储测试数据完成接口自动化教程...

    http_request2.py用于发起http请求 #读取多条测试用例 #1.导入requests模块 import requests #从 class_12_19.do_excel1导入read_ ...

  8. python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...

    在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地  ,时间  之后点击确定,这是我 ...

  9. python集合set底层原理_Python进阶11_字典dict和集合set的秘密

    本节你将看到关于字典dict和集合set更加深入的原理,尤其是关于散列在其中的作用,将回答以下问题:Python 里的 dict 和 set 的效率有多高? 为什么它们是无序的? 为什么并不是所有的 ...

最新文章

  1. svd协同过滤java实现_利用 SVD 实现协同过滤推荐算法
  2. 没有统计学基础可以学python-统计学专业应该学Java还是Python?
  3. 掘金专访 - 收藏集 - 掘金
  4. LwIP 之六 详解动态内存管理 内存池(memp.c/h)
  5. Android Json处理框架
  6. 敏捷开发总结(1)软件研发过程
  7. FS_S5PC100 UBOOT-2011.12移植,支持DM9000
  8. Redis学习笔记(四) 发布订阅命令
  9. vue+webpack实践
  10. float与double精度丢失问题
  11. python爬虫--爬取豆瓣top250电影名
  12. 手工打造迅雷9超精简版
  13. 网络安全篇 全局ACL与URPF-12
  14. 64qam带宽计算_烧脑:5G 理论峰值速率是怎么计算的?
  15. Nginx的安装使用----反向代理服务器
  16. hbase命令使用笔记
  17. WinSCP(5.11.2)绿色便携版,开源SCP/SFTP客户端
  18. R语言实现SOM(自组织映射)模型(三个函数包+代码)
  19. Boring Old Menu Bar for Mac(菜单栏美化工具)
  20. 关于JackJson接收前端UTC格式化报错SON parse error: Cannot deserialize value of type `java.util.Date` from String

热门文章

  1. R构建鲁棒回归模型(Robust Regression)
  2. pandas dataframe中的列进行重新排序、倒排、正排、自定义排序详解及实践
  3. java jibx_Jibx 处理XML
  4. 数字图像处理2:传统插值
  5. python去除英文字符中的数字和标点符号
  6. JAVA基础10-继承(1)
  7. numpy 数组 填充 0、1和各种值
  8. Jupyter Notebook教程
  9. ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了
  10. Image Super-Resolution Using Deep Convolutional Networks