python学习之将两张图片生成为全景图片

1、全景图片的介绍

全景图通过广角的表现手段以及绘画、相片、视频、三维模型等形式,尽可能多表现出周围的环境。360全景,即通过对专业相机捕捉整个场景的图像信息或者使用建模软件渲染过后的图片,使用软件进行图片拼合,并用专门的播放器进行播放,即将平面照片或者计算机建模图片变为360 度全观,用于虚拟现实浏览,把二维的平面图模拟成真实的三维空间,呈现给观赏者。

2、如何实现

2.1、实现原理

主要是利用sift的特征提取与匹配,参考链接:https://blog.youkuaiyun.com/qq_43433255/article/details/92000982

2.2、实现代码

# -*- coding:utf-8 -*-
u'''
Created on 2019年6月14日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2019-06-14'
import numpy as np
import cv2 as cv
from PIL import Image
from matplotlib import pyplot as plt
print('cv version: ', cv.__version__)

def pinjie():
    top, bot, left, right = 100, 100, 0, 500
    img1 = cv.imread('G:/2018and2019two/qianrushi/wuluo1.png')
    cv.imshow("img1", img1)
    img2 = cv.imread('G:/2018and2019two/qia
<think>我们正在寻找用Python实现两张相似图片无缝拼接的代码。根据引用[4]中的描述,图像拼接的一个关键步骤是估计图像间的单应性矩阵,然后将所有图像扭曲到一个公共的平面上。但是,对于简单的两张相似图片的无缝拼接,我们可以考虑使用图像特征匹配和透视变换的方法。步骤:1.读取两张图片。2.检测图片的特征点(如SIFT、ORB等)并计算描述子。3.匹配两张图片的特征点。4.计算单应性矩阵(HomographyMatrix)。5.利用单应性矩阵对其中一张图片进行透视变换,使其与另一张图片的视角对齐。6.将两张图片拼接在一起(可以通过加权融合等方式实现无缝拼接)。但是,根据引用[3]中的方法,如果图片是滑动屏幕保存的录屏视频(即上下滚动截图),则可以采用简单的纵向拼接(或横向拼接)并考虑重叠部分。不过,用户要求的是“相似图片”的无缝拼接,这里假设图片有重叠区域,但可能由于视角不同需要变换对齐。下面提供一个使用OpenCV实现两张图片拼接的示例代码。注意:需要安装OpenCV(包含contrib模块,因为SIFT在contrib中)和numpy。如果图片是同一平面内拍摄的(比如平移或旋转),则可以使用单应性变换。如果是简单的上下或左右平移(比如截图滚动),则可以直接拼接重叠部分。这里我们考虑一般情况:使用特征匹配和单应性矩阵。注意:由于OpenCV的SIFT专利问题,我们可以使用ORB(免费)作为替代。代码步骤:1.读取两张图片。2.初始化ORB检测器。3.检测关键点和计算描述子。4.匹配特征点(使用BFMatcher或FLANN)。5.筛选好的匹配点(使用Lowe'sratiotest)。6.计算单应性矩阵。7.使用单应性矩阵对第二张图片进行透视变换。8.将第一张图片和变换后的第二张图片拼接在一起(注意重叠区域的融合)。但是,如果两张图片只是简单的平移(没有旋转和缩放),那么我们可以直接拼接重叠部分,并做融合。不过,用户要求“无缝拼接”,因此我们需要考虑重叠区域的平滑过渡。这里提供两种方法:方法一:使用单应性矩阵对齐然后拼接(适合有透视变换的情况)方法二:直接拼接并做图像融合(适合只有平移的情况)由于用户没有明确说明图片的变换关系,我们提供方法一的代码,因为方法一更通用。注意:如果两张图片没有足够的重叠区域,单应性矩阵可能无法正确计算,代码会报错。以下是使用OpenCV和ORB进行特征匹配和拼接的代码示例:</think>以下是使用 Python 实现两张相似图片无缝拼接的示例代码,基于特征点匹配和透视变换技术: ```python import cv2 import numpy as np def stitch_images(img1_path, img2_path, output_path): # 1. 读取图片 img1 = cv2.imread(img1_path) img2 = cv2.imread(img2_path) # 2. 转换为灰度图 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 3. 使用SIFT检测关键点和描述符 sift = cv2.SIFT_create() kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) # 4. 特征点匹配 bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) # 5. 筛选优质匹配点 (Lowe's ratio test) good_matches = [] for m, n in matches: if m.distance < 0.75 * n.distance: good_matches.append(m) # 6. 计算单应性矩阵 if len(good_matches) > 4: src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 7. 图像变换与拼接 height, width = img2.shape[:2] result = cv2.warpPerspective(img1, H, (width * 2, height)) result[0:height, 0:width] = img2 # 8. 保存结果 cv2.imwrite(output_path, result) return result # 使用示例 stitched = stitch_images('left.jpg', 'right.jpg', 'result.jpg') ``` ### 关键步骤说明: 1. **特征检测**:使用 SIFT 算法检测关键点并生成描述符 2. **特征匹配**:使用 KNN 匹配算法寻找相似特征点 3. **单应性矩阵**:通过 RANSAC 算法计算透视变换矩阵 $H$,解决公式: $$s\begin{bmatrix}x'\\y'\\1\end{bmatrix} = H\begin{bmatrix}x\\y\\1\end{bmatrix}$$ 4. **图像变换**:应用单应性矩阵实现透视变换 5. **融合拼接**:将变换后的图像与目标图像拼接 ### 优化无缝效果: - 添加加权融合处理重叠区域: ```python # 在拼接步骤后添加融合处理 overlap_width = 100 # 重叠区域宽度 for col in range(width - overlap_width, width): alpha = (col - (width - overlap_width)) / overlap_width result[:, col] = alpha * img2[:, col] + (1 - alpha) * result[:, col] ``` - 使用图像金字塔实现多分辨率融合 - 应用直方图匹配减少颜色差异 ### 使用要求: 1. 安装依赖库:`pip install opencv-python-headless numpy` 2. 图片应有 20-30% 的重叠区域 3. 拍摄角度应保持近似水平位置 > 此方法适用于具有重叠区域的相似图片拼接,如全景照片、地图切片等场景[^4]。对于完全相同的图片(如截图滚动拼接),可直接使用更简单的`numpy.concatenate()`方法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值