我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在Python中拼接图像

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在Python中拼接图像

本篇文章给大家分享的是有关怎么在Python中拼接图像,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Python主要用来做什么

Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

一、前言

图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。

二、特征点匹配

特征点具有局部差异性

动机:特征点具有局部差异性

怎么在Python中拼接图像

图像梯度

怎么在Python中拼接图像

Harris矩阵

怎么在Python中拼接图像
怎么在Python中拼接图像

以每个点为中心取一个窗口,窗口大小为55或者77,如果这个点具有差异性,往周围任意方向移动,周围的环境变化都是会比较大的,如果满足这个特性,我们就认为这个特征点具有明显的局部差异性。在工事中,I表示像素,如果是 彩色图像就是RGB,灰色图像就是灰度。(u,v)表示方向。然后对上式进行一阶泰勒展开。
Harris矩阵H的特征值分析:

怎么在Python中拼接图像

矩阵特征值反应了两个垂直方向的变化情况,一个事变化最快的方向,一个事变化最慢的方向

怎么在Python中拼接图像

怎么在Python中拼接图像

兴趣点位于光滑区域,不是特征点

怎么在Python中拼接图像

兴趣点位于边缘区域

怎么在Python中拼接图像

兴趣点位于角点区域

所以检测特征的任务转化为计算Harris矩阵,判断特征值大小。

在实际操作中,很少通过计算特征值来判断,因为计算特征值计算量比较大,取而代之的是Harris角点准则。

三、匹配错误的特征点干扰

在进行图像匹配过程中,如果图像的噪声太大,就会使得特征点的匹配发生了偏差,匹配到了错误的点,这种不好的匹配效果,会对后面的图像拼接产生很大的影响,如下图

怎么在Python中拼接图像

四、消除干扰

为了进一步提升匹配精度,可以采用随机样本一致性(RANSAC)方法。

因为我们是使用一幅图像(一个平面物体),我们可以将它定义为刚性的,可以在pattern image和query image的特征点之间找到单应性变换(homography transformation )。使用cv::findHomography找到这个单应性变换,使用RANSAC找到最佳单应性矩阵。(由于这个函数使用的特征点同时包含正确和错误匹配点,因此计算的单应性矩阵依赖于二次投影的准确性)

五、RANSAC进行图像匹配

RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。

RANSAC的基本假设是:

(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。

局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。

RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。

RANSAC原理

OpenCV中滤除误匹配对采用RANSAC算法寻找一个最佳单应性矩阵H,矩阵大小为3×3。RANSAC目的是找到最优的参数矩阵使得满足该矩阵的数据点个数最多,通常令h4=1来归一化矩阵。由于单应性矩阵有8个未知参数,至少需要8个线性方程求解,对应到点位置信息上,一组点对可以列出两个方程,则至少包含4组匹配点对。

怎么在Python中拼接图像

其中(x,y)表示目标图像角点位置,(x',y')为场景图像角点位置,s为尺度参数。

RANSAC算法从匹配数据集中随机抽出4个样本并保证这4个样本之间不共线,计算出单应性矩阵,然后利用这个模型测试所有数据,并计算满足这个模型数据点的个数与投影误差(即代价函数),若此模型为最优模型,则对应的代价函数最小。

怎么在Python中拼接图像

RANSAC算法步骤:

随机从数据集中随机抽出4个样本数据 (此4个样本之间不能共线),计算出单应矩阵H,记为模型M;

计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集 I ;

如果当前内点集 I 元素个数大于最优内点集 I_best , 则更新 I_best = I,同时更新迭代次数k ;

如果迭代次数大于k,则退出 ; 否则迭代次数加1,并重复上述步骤;

注:迭代次数k在不大于最大迭代次数的情况下,是在不断更新而不是固定的;
其中,p为置信度,一般取0.995;w为"内点"的比例 ; m为计算模型所需要的最少样本数=4;

使用RANSAC图片匹配

from numpy import *from matplotlib.pyplot import *from PIL import Imageimport warpimport homographyfrom PCV.localdescriptors import siftfeatname = ['img/' + str(i + 1) + '.sift' for i in range(5)]imname = ['img/' + str(i + 1) + '.jpg' for i in range(5)]l = {}d = {}for i in range(5):    sift.process_image(imname[i], featname[i])    l[i], d[i] = sift.read_features_from_file(featname[i])matches = {}for i in range(4):    matches[i] = sift.match(d[i + 1], d[i])# visualize the matches (Figure 3-11 in the book)for i in range(4):    im1 = array(Image.open(imname[i]))    im2 = array(Image.open(imname[i + 1]))    figure()    sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)# 将匹配转换成齐次坐标点的函数def convert_points(j):    ndx = matches[j].nonzero()[0]    fp = homography.make_homog(l[j + 1][ndx, :2].T)    ndx2 = [int(matches[j][i]) for i in ndx]    tp = homography.make_homog(l[j][ndx2, :2].T)    # switch x and y - TODO this should move elsewhere    fp = vstack([fp[1], fp[0], fp[2]])    tp = vstack([tp[1], tp[0], tp[2]])    return fp, tp# 估计单应性矩阵model = homography.RanSacModel()fp, tp = convert_points(1)H_12 = homography.H_from_ransac(fp, tp, model)[0]  # im 1 to 2fp, tp = convert_points(0)H_01 = homography.H_from_ransac(fp, tp, model)[0]  # im 0 to 1tp, fp = convert_points(2)  # NB: reverse orderH_32 = homography.H_from_ransac(fp, tp, model)[0]  # im 3 to 2tp, fp = convert_points(3)  # NB: reverse orderH_43 = homography.H_from_ransac(fp, tp, model)[0]  # im 4 to 3# 扭曲图像delta = 100  # 用于填充和平移 for padding and translationim1 = array(Image.open(imname[1]), "uint8")im2 = array(Image.open(imname[2]), "uint8")im_12 = warp.panorama(H_12, im1, im2, delta, delta)im1 = array(Image.open(imname[0]), "f")im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)im1 = array(Image.open(imname[3]), "f")im_32 = warp.panorama(H_32, im1, im_02, delta, delta)im1 = array(Image.open(imname[4]), "f")im_42 = warp.panorama(dot(H_32, H_43), im1, im_32, delta, 2 * delta)figure()imshow(array(im_42, "uint8"))axis('off')show()

进行匹配的图片

怎么在Python中拼接图像
怎么在Python中拼接图像

匹配后的图片

怎么在Python中拼接图像
怎么在Python中拼接图像
怎么在Python中拼接图像

分析:

本次的拼接效果比较好,原因是因为我在同一时刻差不多角度拍摄的照片,噪声比较小,之前一组图片拍摄的噪声太大,导致最后出现不了结果。
由图片这部分可得,在不同时刻下拍摄照片导致天空颜色不同,在拼接的时候也会有明显的分割线。

怎么在Python中拼接图像

在实验过程中,刚开始使用了一组照片,但运行不出结果,后来经过查询找到原因是因为图片匹配度太低,没办法进行匹配,后来重新拍摄了一组图片最终才完成。

怎么在Python中拼接图像

以上就是怎么在Python中拼接图像,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在Python中拼接图像

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在Python中拼接图像

本篇文章给大家分享的是有关怎么在Python中拼接图像,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科
2023-06-14

python中怎么用opencv实现影像拼接

这篇文章主要介绍“python中怎么用opencv实现影像拼接”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中怎么用opencv实现影像拼接”文章能帮助大家解决问题。1.垂直影像拼接 v
2023-06-29

怎么在python中拼接变量

怎么在python中拼接变量?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、
2023-06-14

怎么在python中拼接列表

怎么在python中拼接列表?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对
2023-06-14

使用OpenCV怎么实现全景图像拼接

今天就跟大家聊聊有关使用OpenCV怎么实现全景图像拼接,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Stitcher.pyimport numpy as npimport cv2
2023-06-15

matlab图像拼接的方法是什么

在MATLAB中,图像拼接可以通过以下几种方法实现:1. 使用imresize函数对图像进行调整大小以使其具有相同的尺寸,然后使用imtile函数将它们平铺在一起。```matlab% 读取图像image1 = imread('image1
2023-08-31

怎么在C#中拼接Json串

这篇文章将为大家详细讲解有关怎么在C#中拼接Json串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 利用 JsonConvert.SerializeObject方法 (Nuget获取
2023-06-15

怎么在golang中拼接json数组

这篇文章将为大家详细讲解有关怎么在golang中拼接json数组,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发
2023-06-14

怎么在Shell中拼接字符串

怎么在Shell中拼接字符串?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 字符串声明概述字符串的基本操作脚本 1# 声明字符串str01="str01"echo ${
2023-06-09

怎么在python中利用pillow处理图像

这篇文章将为大家详细讲解有关怎么在python中利用pillow处理图像,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2
2023-06-14

怎么在python中处理图像二值化

怎么在python中处理图像二值化?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫
2023-06-14

怎么在python中使用np.concatenate()函数拼接numpy数组

这期内容当中小编将会给大家带来有关怎么在python中使用np.concatenate()函数拼接numpy数组,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python可以做什么Python是一种编程语
2023-06-14

怎么在Python中利用m3u8拼接mp4视频文件

本篇文章为大家展示了怎么在Python中利用m3u8拼接mp4视频文件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Pytho
2023-06-06

基于C++的摄像头图像采集及拼接程序该怎么实现

今天给大家介绍一下基于C++的摄像头图像采集及拼接程序该怎么实现。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。程序的说明实现从摄像头实时采集单帧图像,之后完成
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录