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中getaddrinfo()基本用法实例分析
Jun 28 Python
浅谈Python基础之I/O模型
May 11 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
python3.x实现发送邮件功能
May 22 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
python用插值法绘制平滑曲线
Feb 19 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
python 创建一维的0向量实例
Dec 02 Python
爬虫代理的cookie如何生成运行
Sep 22 Python
python实现银行账户系统
Feb 22 Python
Pygame Draw绘图函数的具体使用
Nov 17 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
php密码生成类实例
2014/09/24 PHP
PHP中通过trigger_error触发PHP错误示例
2015/06/23 PHP
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
bootstrap下拉框动态赋值方法
2018/08/10 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python使用matplotlib画饼状图
2018/09/25 Python
pytorch对可变长度序列的处理方法详解
2018/12/08 Python
浅谈python中get pass用法
2019/03/19 Python
python实现维吉尼亚算法
2019/03/20 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
商铺租赁意向书
2014/04/01 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
创业计划书之物流运送
2019/09/17 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
python脚本框架webpy模板赋值实现
2021/11/20 Python
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript
Python中的 No Module named ***问题及解决
2022/07/23 Python