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 相关文章推荐
Django 导出 Excel 代码的实例详解
Aug 11 Python
Django2.1.3 中间件使用详解
Nov 26 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
pytorch的batch normalize使用详解
Jan 15 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
Django cookie和session的应用场景及如何使用
Apr 29 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
谈谈PHP的输入输出流
2007/02/14 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
php实现微信企业转账功能
2018/10/02 PHP
jQuery 操作option的实现代码
2011/03/03 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
React降级配置及Ant Design配置详解
2018/12/27 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
python清除字符串里非字母字符的方法
2015/07/02 Python
python访问抓取网页常用命令总结
2017/04/11 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
2017/07/13 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
基于树莓派的语音对话机器人
2019/06/17 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
秋季运动会加油稿200字
2014/01/11 职场文书
小学红领巾中秋节广播稿
2014/01/13 职场文书
服务行业演讲稿
2014/09/02 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang