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实现带错误处理功能的远程文件读取方法
Apr 29 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
Python实现简易端口扫描器代码实例
Mar 15 Python
关于Python 3中print函数的换行详解
Aug 08 Python
用python与文件进行交互的方法
Mar 01 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
Python实现使用request模块下载图片demo示例
May 24 Python
Python Web版语音合成实例详解
Jul 16 Python
基于python二叉树的构造和打印例子
Aug 09 Python
Python3常用内置方法代码实例
Nov 18 Python
Python如何使用函数做字典的值
Nov 30 Python
python 实现从高分辨图像上抠取图像块
Jan 02 Python
Python初学者必备的文件读写指南
Jun 23 #Python
总结Python连接CS2000的详细步骤
python图片灰度化处理的几种方法
详解Python中的进程和线程
详解Go语言运用广度优先搜索走迷宫
常用的Python代码调试工具总结
Django+Celery实现定时任务的示例
You might like
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
jQuery 技巧小结
2010/04/02 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
JavaScript类型转换方法及需要注意的问题小结(挺全面)
2010/11/11 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
移动端吸顶fixbar的解决方案详解
2019/07/17 Javascript
[03:39]这就是刀塔,我们是冠军!燃情短片讲述我们的DOTA故事
2019/07/02 DOTA
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
WiFi云数码相框:Nixplay
2018/07/05 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
机械专业毕业生推荐信范文
2013/11/25 职场文书
给交警的表扬信
2014/01/12 职场文书
致全体运动员广播稿
2014/02/01 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
2015年公司新年寄语
2014/12/08 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
中学语文教学反思
2016/02/16 职场文书