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的Django框架中的项目进行单元测试的方法
Apr 11 Python
python 接口_从协议到抽象基类详解
Aug 24 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
基于Python实现用户管理系统
Feb 26 Python
PyQt5响应回车事件的方法
Jun 25 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
python自动化测试之Selenium详解
Mar 13 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
js tab 选项卡
2009/04/26 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
python3使用smtplib实现发送邮件功能
2018/05/22 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
水果超市创业计划书
2014/01/27 职场文书
房地产广告策划方案
2014/05/15 职场文书
爱护公共设施的标语
2014/06/24 职场文书
计算机多媒体专业自荐信
2014/07/04 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
商务信函英语问候语
2015/11/10 职场文书
英语教学课后反思
2016/02/15 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技