opencv-python图像配准(匹配和叠加)的实现


Posted in Python onJune 23, 2021

图像配准需是指对不同条件下得到的两幅或多幅图像进行匹配、叠加的过程。最简单的做法就是求得原图像到目标图像之间的透视变换矩阵,将原图像按照矩阵进行变换,就可以得到和目标图像相似的效果。透视变换是将成像投影到一个新的视平面,也称作投影映射。

opencv-python图像配准(匹配和叠加)的实现

透视变换实质上是将二维的图片变换到三维的坐标系中之后再变换到另一个二维坐标系,与仿射变换相比透视变换实现的效果要多一些。求解精确矩阵和透视变换可以很容易地在opencv-python中实现。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
original_image = cv.imread("Image A.jpg")
target_image = cv.imread("Image B.jpg")
# 生成透视矩阵
src_points = np.array([[957, 1655], [2177, 1170], [2676, 24], [2487, 1931]], dtype=np.float32)
den_points = np.array([[687, 1150], [2000, 996], [2757, 18], [2098, 1819]], dtype=np.float32)
# getPerspectiveTransform可以得到从点集src_points到点集den_points的透视变换矩阵
T = cv.getPerspectiveTransform(src_points, den_points)
# 进行透视变换
# 注意透视变换第三个参数为变换后图片大小,格式为(高度,宽度)
warp_imgae = cv.warpPerspective(original_image, T, (target_image.shape[1], target_image.shape[0]))
plt.imshow(warp_imgae)
plt.show()

进行四点变换前后的结果为

opencv-python图像配准(匹配和叠加)的实现

opencv-python也可以计算超过四个点的两数组点之间的变换矩阵。对原图像选择7个点进行透视变换的结果为

# 设置原始和目标特征点
src_more_point = np.float32([[957, 1655], [2177, 1170], [620, 2586], [1280, 2316], [2487, 1931], [937, 758], [2676, 24]]).reshape(-1, 1, 2)
den_more_point = np.float32([[687, 1150], [2000, 996], [121, 1974], [927, 1886], [2098, 1819], [899, 280], [2757, 18]]).reshape(-1, 1, 2)
# 调用库函数计算特征矩阵
# cv.findHomography第三个参数为计算单位矩阵所用的方法,0为常规算法,cv.RANSAC为基于RANSAC的鲁棒算法,cv.LMEDS为最小中值
# 鲁棒算法,cv.RHO基于PROSAC的鲁棒算法.第四个参数取值范围在1到10,绝一个点对的阈值。原图像的点经过变换后点与目标图像上对应
# 点的误差.返回值中H为变换矩阵.mask是掩模,在线的点.
H, status = cv.findHomography(src_more_point, den_more_point, cv.RANSAC, 5.0)
# 进行透视变换
warped_more_point_image = cv.warpPerspective(original_image, H, (target_image.shape[1], target_image.shape[0]))

对4个点、7个点和opencv-python函数库自动匹配的效果对比如下

opencv-python图像配准(匹配和叠加)的实现

可以看出如果匹配点选择恰当,三种方法的效果并没有太大区别。

调用库函数的图像自动匹配代码如下

# 用AKAZE库函数进行自动特征检测,AKAZE与SIFT等属于相似的 特征检测,但是有一些不同
akaze = cv.AKAZE_create()
# Find the keypoints and descriptors with SIFT
kp1, des1 = akaze.detectAndCompute(original_image_gray, None)
kp2, des2 = akaze.detectAndCompute(target_image_gray, None)

bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append([m])

# 画出符合条件的匹配点的连线
img3 = cv.drawMatchesKnn(original_image_gray, kp1, target_image_gray, kp2, good_matches, None, flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)


src_automatic_points = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
den_automatic_points = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

# 调用库函数计算特征矩阵
H, status = cv.findHomography(src_more_point, den_more_point, cv.RANSAC, 5.0)
# 进行透视变换
warped_automatic_image = cv.warpPerspective(original_image, H, (target_image.shape[1], target_image.shape[0]))

# 绘制图像
my_draw(warped_automatic_image, tip='automatic')

到此这篇关于opencv-python图像配准的实现的文章就介绍到这了,更多相关opencv-python图像配准内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python深入学习之装饰器
Aug 31 Python
Python构造函数及解构函数介绍
Feb 26 Python
Python远程桌面协议RDPY安装使用介绍
Apr 15 Python
Python中类的初始化特殊方法
Dec 01 Python
Numpy数组转置的两种实现方法
Apr 17 Python
python实现随机漫步算法
Aug 27 Python
详解Python requests 超时和重试的方法
Dec 18 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 Python
Python提取PDF指定内容并生成新文件
Jun 09 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
codeigniter框架批量插入数据
2014/01/09 PHP
php中final关键字用法分析
2016/12/07 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
AutoSave/自动存储功能实现
2007/03/24 Javascript
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
vue脚手架及vue-router基本使用
2018/04/09 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
Python random模块常用方法
2014/11/03 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
Python BS4库的安装与使用详解
2018/08/08 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
python word转pdf代码实例
2019/08/16 Python
python 日志 logging模块详细解析
2020/03/31 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
质检部职责
2013/12/28 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
元旦红领巾广播稿
2014/02/19 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
校庆标语集锦
2014/06/25 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
党建工作汇报材料
2014/12/24 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
Java 在生活中的 10 大应用
2021/11/02 Java/Android
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js