python图像配准的原理_python利用sift和surf进行图像配准
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进行图像配准相关推荐
- python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)
通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...
- python列表的实现原理_Python列表对象实现原理
Python 列表对象实现原理 Python 中的列表基于 PyListObject 实现,列表支持元 素的插入.删除.更新操作,因此 PyListObject 是一个变长 对象(列表的长度随着元素的 ...
- python实现浮雕效果的原理_python+opencv+图像特效(图像灰度处理、颜色翻转、图片融合,边缘检测,浮雕效果,颜色映射)...
原图 图像灰度处理 #方式1 import cv2 #读取彩色原图 img0=cv2.imread('E:/python_cv/01.jpg',1) #读取灰度图 img1=cv2.imread('E ...
- python是基于什么原理_Python基于class()实现面向对象原理详解
首先,类是一个集合,包含了数据,操作描述的一个抽象集合 你可以首先只把类当做一个容器来使用 class Cycle: def __init__(self,r): self.pi=3.14 self.r ...
- python的模拟登录原理_Python模拟登陆实例详解
本篇文章主要介绍了Python模拟登陆实现代码,这里整理了详细的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 下面分享一个使用Python进行网站模拟登陆的小例子. 原理 使用Cookie技 ...
- python绘制折线图保存_Python利用matplotlib绘制折线图的新手教程
前言 matplotlib是Python中的一个第三方库.主要用于开发2D图表,以渐进式.交互式的方式实现数据可视化,可以更直观的呈现数据,使数据更具说服力. 一.安装matplotlib pip i ...
- python处理表格数据教程_python利用Excel读取和存储测试数据完成接口自动化教程...
http_request2.py用于发起http请求 #读取多条测试用例 #1.导入requests模块 import requests #从 class_12_19.do_excel1导入read_ ...
- python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...
在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地 ,时间 之后点击确定,这是我 ...
- python集合set底层原理_Python进阶11_字典dict和集合set的秘密
本节你将看到关于字典dict和集合set更加深入的原理,尤其是关于散列在其中的作用,将回答以下问题:Python 里的 dict 和 set 的效率有多高? 为什么它们是无序的? 为什么并不是所有的 ...
最新文章
- svd协同过滤java实现_利用 SVD 实现协同过滤推荐算法
- 没有统计学基础可以学python-统计学专业应该学Java还是Python?
- 掘金专访 - 收藏集 - 掘金
- LwIP 之六 详解动态内存管理 内存池(memp.c/h)
- Android Json处理框架
- 敏捷开发总结(1)软件研发过程
- FS_S5PC100 UBOOT-2011.12移植,支持DM9000
- Redis学习笔记(四) 发布订阅命令
- vue+webpack实践
- float与double精度丢失问题
- python爬虫--爬取豆瓣top250电影名
- 手工打造迅雷9超精简版
- 网络安全篇 全局ACL与URPF-12
- 64qam带宽计算_烧脑:5G 理论峰值速率是怎么计算的?
- Nginx的安装使用----反向代理服务器
- hbase命令使用笔记
- WinSCP(5.11.2)绿色便携版,开源SCP/SFTP客户端
- R语言实现SOM(自组织映射)模型(三个函数包+代码)
- Boring Old Menu Bar for Mac(菜单栏美化工具)
- 关于JackJson接收前端UTC格式化报错SON parse error: Cannot deserialize value of type `java.util.Date` from String