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 import自定义模块方法
Feb 12 Python
Python实现求最大公约数及判断素数的方法
May 26 Python
python的继承知识点总结
Dec 10 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
不到40行代码用Python实现一个简单的推荐系统
May 10 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
在django中实现页面倒数几秒后自动跳转的例子
Aug 16 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
python实现信号时域统计特征提取代码
Feb 26 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
Python基础之Socket通信原理
Apr 22 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
php下载excel无法打开的解决方法
2013/12/24 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
你不知道的 javascript【推荐】
2017/01/08 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
浅析Python3 pip换源问题
2020/01/06 Python
Python常用数据分析模块原理解析
2020/07/20 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
机关工会开展学习雷锋活动总结
2014/03/01 职场文书
平安建设实施方案
2014/03/19 职场文书
生日寄语大全
2014/04/08 职场文书
小学生评语集锦
2014/04/18 职场文书
梅花魂教学反思
2014/04/25 职场文书
大学生就业自荐书
2014/06/16 职场文书
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS