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添加模块搜索路径方法
Sep 11 Python
python图像常规操作
Nov 11 Python
mac 安装python网络请求包requests方法
Jun 13 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
Python 3.8中实现functools.cached_property功能
May 29 Python
python manage.py runserver流程解析
Nov 08 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Python单元测试模块doctest的具体使用
Feb 10 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
php IP及IP段进行访问限制的代码
2008/12/17 PHP
php实现Mysql简易操作类
2015/10/11 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
jquery控制页面部分刷新的方法
2015/06/24 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
最丑的时钟效果!js canvas时钟制作方法
2016/08/15 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
JavaScript基础进阶之数组方法总结(推荐)
2017/09/04 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
小程序实现左滑删除功能
2018/10/30 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python深入06——python的内存管理详解
2016/12/07 Python
python 实现A*算法的示例代码
2018/08/13 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
使用Tkinter制作信息提示框
2020/02/18 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
平面设计岗位职责
2013/12/14 职场文书
远程研修随笔感言
2014/02/10 职场文书
股份合作协议书范本
2014/04/14 职场文书
工作收入住址证明
2014/10/28 职场文书
义诊活动总结
2015/02/04 职场文书
安全主题班会教案
2015/08/12 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python