话不多说,直接上代码,可以用的话别忘了请喝可乐!(手动笑哭脸)

【用法】

第45、46行的输入:

img1 = cv2.imread('sift/3.jpg')

img2 = cv2.imread('sift/4.jpg')

分别是两幅图像,改成你打算要配准的两幅图像即可(修改图像路径)。

python的跨平台特性好,windows和macOS系统都可用。输出:三幅图像。窗口1、窗口2是你输入的两幅图像,Result窗口展示的是本算法结果,即把img2移动变换到与img1匹配时的样子。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 23 16:37:02 2019
SIFT
@author: youxinlin
"""import numpy as np
import cv2def sift_kp(image):gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)sift = cv2.xfeatures2d_SIFT.create()kp,des = sift.detectAndCompute(image,None)kp_image = cv2.drawKeypoints(gray_image,kp,None)return kp_image,kp,desdef 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 gooddef 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 = 4H, status =cv2.findHomography(ptsA,ptsB,cv2.RANSAC,ransacReprojThreshold);#其中H为求得的单应性矩阵矩阵#status则返回一个列表来表征匹配成功的特征点。#ptsA,ptsB为关键点#cv2.RANSAC, ransacReprojThreshold这两个参数与RANSAC有关imgOut = cv2.warpPerspective(img2, H, (img1.shape[1],img1.shape[0]),flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)return imgOut,H,statusimg1 = cv2.imread('sift/3.jpg')
img2 = cv2.imread('sift/4.jpg')
while img1.shape[0] >  1000 or img1.shape[1] >1000:img1 = cv2.resize(img1,None, fx=0.5,fy=0.5,interpolation = cv2.INTER_AREA)
while img2.shape[0] >  1000 or img2.shape[1] >1000:img2 = cv2.resize(img2,None, fx=0.5,fy=0.5,interpolation = cv2.INTER_AREA)result,_,_ = siftImageAlignment(img1,img2)
allImg = np.concatenate((img1,img2,result),axis=1)
cv2.namedWindow('1',cv2.WINDOW_NORMAL)
cv2.namedWindow('2',cv2.WINDOW_NORMAL)
cv2.namedWindow('Result',cv2.WINDOW_NORMAL)
cv2.imshow('1',img1)
cv2.imshow('2',img2)
cv2.imshow('Result',result)#cv2.imshow('Result',allImg)
if cv2.waitKey(2000) & 0xff == ord('q'):cv2.destroyAllWindows()cv2.waitKey(1) 

【注意】如果你懂python,并且懂数字图像技术原理,可以网上搜资料读一读。特别是本程序中用到的单应性矩阵、KNN、RANSAC算法等。不多解释了。另外本程序做了降采样以加快处理速度,请自行调整。如果想并排展示,请直接用cv2.imshow出allImg这个变量试试~

如果你要显示key points的配对结果(连线图),可以用:

macth_img = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)

然后show出macth_img。

部分代码来源整合于网络,仅供学习交流使用。

参考文献:Lowe, David G. "Object recognition from local scale-invariant features." iccv. Vol. 99. No. 2. 1999.

python实现基于SIFT算法的图像配准(仿射变换)相关推荐

  1. 基于SIFT特征的图像配准(附Matlab源代码)

    基于SIFT特征的图像配准(附Matlab源代码) 本文先给出了采用SIFT方法进行图像配准的实验原图以及实验结果,最后附上Matlab源代码. 实验一: 实验一的图像(见图1.1)是本人自己拍摄的, ...

  2. c语言编程图像拼接,一种基于Lucas-Kanade算法的图像配准和拼接方法

    一种基于Lucas-Kanade算法的图像配准和拼接方法 [技术领域] [0001 ]本发明涉及图像处理技术领域,具体涉及一种基于Lucas-Kanade算法的图像配准 和拼接方法. [背景技术] [ ...

  3. python实现基于OCR算法的图像文字识别报错

    最近想用python实现基于OCR算法的图像文字识别工作,在网上看到调库实现的代码基于Python的OCR实现,在操作后报错,如下: 需要执行: brew install tesseract 然后执行 ...

  4. 基于sift特征提取的图像配准算法matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 SIFT 是一种从图像中提取独特不变特征的方法,其特点为基于图像的一些局部特征,而与图像整体的大小和 ...

  5. SIFT-FCACO算法的图像配准

    SIFT-FCACO算法的图像配准 2014年微型机与应用第15期 作者:吴金津,文志强,龙永新,武岫缘 2015/6/1 19:12:00 关键词: SIFT-FCACO算法 蚁群算法 RANSAC ...

  6. 图像配准系列之基于FFD形变与粒子群算法的图像配准

    在之前的文章中,我们分别使用了梯度下降发与LM算法来优化FFD形变的控制参数,达到图像配准的目的: 图像配准系列之基于FFD形变与梯度下降法的图像配准 图像配准系列之基于FFD形变与LM算法的图像配准 ...

  7. 基于强化学习的图像配准 - Image Registration: Reinforcement Learning Approaches

    配准定义 给定参考图像 I_f 和浮动图像 I_m ,所谓的配准就是寻找一个图像变换T,将浮动图像I_m变换到和 I_f 相同的坐标空间下,使得两个图像中对应的点处于同一坐标下,从而达到信息聚合的目的 ...

  8. python实现蒙特卡洛算法_用Python实现基于蒙特卡洛算法小实验

    用Python实现基于蒙特卡洛算法小实验 蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯· 诺伊曼 ,他在20世纪40年代中期用驰名世界的赌城- ...

  9. 【图像配准】基于粒子群改进sift实现SAR图像配准附matlab代码

    1 简介 1.1 SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找 ...

最新文章

  1. 深入理解SpringBoot之装配条件
  2. win7下简单FTP服务器搭建
  3. VisualBox中增大linux硬盘空间的方法
  4. BI中事实表和维度表的定义+具体SQL操作(转载+自己添加实验)
  5. python下载后是黑的_python下载文件记录黑名单的实现代码
  6. 如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...
  7. 深度学习优化算法实现(Momentum, Adam)
  8. python爬虫教程-Python爬虫入门教程——爬取自己的博客园博客
  9. ads1115应用电路及驱动程序
  10. 我在小公司,当了五年的前端切图仔
  11. cv2库中一些函数的使用
  12. C#支付宝扫码支付代码完整版
  13. PHP TP模板下的微博登录(wap)
  14. SQL相关概念与MYSQL下载安装卸载
  15. 利用VMM建立基于事务的层次化验证平台
  16. 【2018-CCPC青岛网赛】 HDU - 6441 Find Integer
  17. 推荐(笔记软件、日程安排软件)
  18. LInux常用的60个命令,小白必须掌握的命令
  19. Maven学习(一)---Maven简介
  20. 华为Datacom认证介绍

热门文章

  1. RAFT共识算法学习
  2. 智能家居系统中网关与服务器如何连接?
  3. 自己开发基于Web的打印控件,真正免费不是共享
  4. 从动态性、并发性、独立性和异步性上比较进程和程序。
  5. 王阳明:<二> 立志,勤学,改过,责善
  6. Java系统环境变量配置
  7. 在word中10秒一键将900个mathtype公式转换成word自带公式--GrindEQ公式转换神器
  8. 3ds Max 基于PC系统的3D建模渲染和制作软件
  9. H.265及最新芯片模组技术现状和研究方向
  10. XGBoost之分位点算法