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 文件操作实现代码
Oct 07 Python
全面解读Python Web开发框架Django
Jun 30 Python
在Django中使用Sitemap的方法讲解
Jul 22 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
Python遍历pandas数据方法总结
Feb 09 Python
python高阶爬虫实战分析
Jul 29 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
python 异步async库的使用说明
May 04 Python
如何基于Python实现word文档重新排版
Sep 29 Python
python 实现逻辑回归
Dec 30 Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
php Rename 更改文件、文件夹名称
2011/05/24 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
纯css实现窗户玻璃雨滴逼真效果
2015/08/23 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
解决vue单页面应用打包后相对路径、绝对路径相关问题
2020/08/14 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
jenkins自动构建发布vue项目的方法步骤
2021/01/04 Vue.js
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
python 连接sqlite及简单操作
2017/06/30 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
怎样比较两个类型为String的字符串
2016/08/17 面试题
社区安全生产月活动总结
2014/07/05 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
工作检讨书怎么写
2014/10/10 职场文书
工程款申请报告
2015/05/15 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python