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 Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python实现批量读取word中表格信息的方法
Jul 30 Python
Python学习小技巧之列表项的排序
May 20 Python
基于pandas将类别属性转化为数值属性的方法
Jul 25 Python
使用Django搭建web服务器的例子(最最正确的方式)
Aug 29 Python
Django发送邮件功能实例详解
Sep 02 Python
python实现飞机大战小游戏
Nov 08 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
学习Python列表的基础知识汇总
Mar 10 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
Django项目创建及管理实现流程详解
Oct 13 Python
django使用channels实现通信的示例
Oct 19 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
一个图形显示IP的PHP程序代码
2007/10/19 PHP
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
php微信开发接入
2016/08/27 PHP
php常用正则函数实例小结
2016/12/29 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
javascript仿qq界面的折叠菜单实现代码
2012/12/12 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
vue cli 全面解析
2018/02/28 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
Python中设置变量访问权限的方法
2015/04/27 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
基于python监控程序是否关闭
2020/01/14 Python
中国医药集团国药在线:国药网
2017/02/06 全球购物
暑期实践思想汇报
2014/01/06 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
心灵点滴观后感
2015/06/02 职场文书
《所见》教学反思
2016/02/23 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
详解Vue router路由
2021/11/20 Vue.js
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python