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读取html中指定元素生成excle文件示例
Apr 03 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
使用python实现接口的方法
Jul 07 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
python3.6.3转化为win-exe文件发布的方法
Oct 31 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
django删除表重建的实现方法
Aug 28 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
Python requests模块cookie实例解析
Apr 14 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
php实现httpRequest的方法
2015/03/13 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
打开超链需要“确认”对话框的方法
2007/03/08 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
2017/03/12 Python
Python制作词云的方法
2018/01/03 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
竞选班干部演讲稿600字
2014/08/20 职场文书
篮球赛新闻稿
2015/07/17 职场文书
java设计模式--建造者模式详解
2021/07/21 Java/Android
Python List remove()实例用法详解
2021/08/02 Python