iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >OpenCV-Python怎么实现两张图片自动拼接成全景图
  • 956
分享到

OpenCV-Python怎么实现两张图片自动拼接成全景图

2023-06-15 11:06:06 956人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章给大家分享的是有关OpenCV-python怎么实现两张图片自动拼接成全景图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景介绍图片的全景拼接如今已不再稀奇,现在的智能摄像机和手机摄像头基本都带有图片自

这篇文章给大家分享的是有关OpenCV-python怎么实现两张图片自动拼接成全景图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

背景介绍

图片的全景拼接如今已不再稀奇,现在的智能摄像机和手机摄像头基本都带有图片自动全景拼接的功能,但是一般都会要求拍摄者保持设备的平稳以及单方向的移动取景以实现较好的拼接结果。这是因为拼接的图片之间必须要有相似的区域以保证拼接结果的准确性和完整性。本文主要简单描述如何用 Python 和 OpenCV 库实现两张图片的自动拼合,首先简单介绍一下两张图片拼接的原理。

基本原理

要实现两张图片的简单拼接,其实只需找出两张图片中相似的点 (至少四个,因为 homography 矩阵的计算需要至少四个点), 计算一张图片可以变换到另一张图片的变换矩阵 (homography 单应性矩阵),用这个矩阵把那张图片变换后放到另一张图片相应的位置 ( 就是相当于把两张图片中定好的四个相似的点給重合在一起)。如此,就可以实现简单的全景拼接。当然,因为拼合之后图片会重叠在一起,所以需要重新计算图片重叠部分的像素值,否则结果会很难看。所以总结起来其实就两个步骤:

找两张图片中相似的点,计算变换矩阵

变换一张图片放到另一张图片合适的位置,并计算重叠区域新的像素值 (这里就是图片融合所需要采取的策略)

具体实现

寻找相似点

当然,我们可以手动的寻找相似的点,但是这样比较麻烦。因为相似点越多或者相似点对应的位置越准确,所得的结果就越好,但是人的肉眼所找的位置总是有误差的,而且找出很多的点也不是一件容易的事。所以就有聪明的人设计了自动寻找相似点的算法,这里我们就用了 SIFT 算法,而 OpenCV 也给我们提供 SIFT 算法的接口,所以我们就不需要自己费力去实现了。如下是两张测试图片的原图和找出相似点后的图片。

OpenCV-Python怎么实现两张图片自动拼接成全景图 OpenCV-Python怎么实现两张图片自动拼接成全景图

OpenCV-Python怎么实现两张图片自动拼接成全景图

其中红色的点是 SIFT 算法找出的相似点,而绿色的线表示的是在所有找出的相似的点中所筛选出的可信度更高的相似的点。因为算法找出的相似点并不一定是百分百正确的。然后就可以根据这些筛选出的相似点计算变换矩阵,当然 OpenCV 也提供了相应的接口方便我们的计算,而具体的代码实现也可以在 OpenCV 的 Python tutorial 中找到 [1]。

图片拼接

计算出变换矩阵后,接下来就是第二步,用计算出的变换矩阵对其中一张图做变换,然后把变换的图片与另一张图片重叠在一起,并重新计算重叠区域新的像素值。对于计算重叠区域的像素值,其实可以有多种方法去实现一个好的融合效果,这里就用最简单粗暴的但效果也不错的方式。直白来说就是实现一个图像的线性渐变,对于重叠的区域,靠近左边的部分,让左边图像内容显示的多一些,靠近右边的部分,让右边图像的内容显示的多一些。用公式表示就是,假设 alpha 表示像素点横坐标到左右重叠区域边界横坐标的距离,新的像素值就为 newpixel = 左图像素值 × (1 - alpha) + 右图像素值 × alpha 。这样就可以实现一个简单的融合效果,如果想实现更复杂或更好的效果,可以去搜索和尝试一下 multi-band 融合,这里就不过多赘述了。最后附上实现的结果和代码,可供参考。

OpenCV-Python怎么实现两张图片自动拼接成全景图

Python 代码如下:

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltif __name__ == '__main__':    top, bot, left, right = 100, 100, 0, 500    img1 = cv.imread('test1.jpg')    img2 = cv.imread('test2.jpg')    srcImg = cv.copyMakeBorder(img1, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))    testImg = cv.copyMakeBorder(img2, top, bot, left, right, cv.BORDER_CONSTANT, value=(0, 0, 0))    img1gray = cv.cvtColor(srcImg, cv.COLOR_BGR2GRAY)    img2gray = cv.cvtColor(testImg, cv.COLOR_BGR2GRAY)    sift = cv.xfeatures2d_SIFT().create()    # find the keypoints and descriptors with SIFT    kp1, des1 = sift.detectAndCompute(img1gray, None)    kp2, des2 = sift.detectAndCompute(img2gray, None)    # FLANN parameters    FLANN_INDEX_KDTREE = 1    index_params = dict(alGorithm=FLANN_INDEX_KDTREE, trees=5)    search_params = dict(checks=50)    flann = cv.FlannBasedMatcher(index_params, search_params)    matches = flann.knnMatch(des1, des2, k=2)    # Need to draw only good matches, so create a mask    matchesMask = [[0, 0] for i in range(len(matches))]    good = []    pts1 = []    pts2 = []    # ratio test as per Lowe's paper    for i, (m, n) in enumerate(matches):        if m.distance < 0.7*n.distance:            good.append(m)            pts2.append(kp2[m.trainIdx].pt)            pts1.append(kp1[m.queryIdx].pt)            matchesMask[i] = [1, 0]    draw_params = dict(matchColor=(0, 255, 0),                       singlePointColor=(255, 0, 0),                       matchesMask=matchesMask,                       flags=0)    img3 = cv.drawMatchesKnn(img1gray, kp1, img2gray, kp2, matches, None, **draw_params)    plt.imshow(img3, ), plt.show()    rows, cols = srcImg.shape[:2]    MIN_MATCH_COUNT = 10    if len(good) > MIN_MATCH_COUNT:        src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)        dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)        M, mask = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0)        warpImg = cv.warpPerspective(testImg, np.array(M), (testImg.shape[1], testImg.shape[0]), flags=cv.WARP_INVERSE_MAP)        for col in range(0, cols):            if srcImg[:, col].any() and warpImg[:, col].any():                left = col                break        for col in range(cols-1, 0, -1):            if srcImg[:, col].any() and warpImg[:, col].any():                right = col                break        res = np.zeros([rows, cols, 3], np.uint8)        for row in range(0, rows):            for col in range(0, cols):                if not srcImg[row, col].any():                    res[row, col] = warpImg[row, col]                elif not warpImg[row, col].any():                    res[row, col] = srcImg[row, col]                else:                    srcImgLen = float(abs(col - left))                    testImgLen = float(abs(col - right))                    alpha = srcImgLen / (srcImgLen + testImgLen)                    res[row, col] = np.clip(srcImg[row, col] * (1-alpha) + warpImg[row, col] * alpha, 0, 255)        # opencv is bgr, matplotlib is rgb        res = cv.cvtColor(res, cv.COLOR_BGR2RGB)        # show the result        plt.figure()        plt.imshow(res)        plt.show()    else:        print("Not enough matches are found - {}/{}".fORMat(len(good), MIN_MATCH_COUNT))        matchesMask = None

Reference

[1] OpenCV tutorial: https://docs.opencv.org/3.4.1/d1/de0/tutorial_py_feature_homography.html

感谢各位的阅读!关于“OpenCV-Python怎么实现两张图片自动拼接成全景图”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: OpenCV-Python怎么实现两张图片自动拼接成全景图

本文链接: https://www.lsjlt.com/news/280089.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • OpenCV-Python 实现两张图片自动拼接成全景图
    目录背景介绍基本原理具体实现寻找相似点图片拼接Reference背景介绍 图片的全景拼接如今已不再稀奇,现在的智能摄像机和手机摄像头基本都带有图片自动全景拼接的功能,但是一般都会要求...
    99+
    2022-11-12
  • OpenCV-Python怎么实现两张图片自动拼接成全景图
    这篇文章给大家分享的是有关OpenCV-Python怎么实现两张图片自动拼接成全景图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景介绍图片的全景拼接如今已不再稀奇,现在的智能摄像机和手机摄像头基本都带有图片自...
    99+
    2023-06-15
  • 使用OpenCV怎么实现全景图像拼接
    今天就跟大家聊聊有关使用OpenCV怎么实现全景图像拼接,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Stitcher.pyimport numpy as&nbs...
    99+
    2023-06-15
  • python怎么实现多张图片的无损拼接
    本篇内容主要讲解“python怎么实现多张图片的无损拼接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python怎么实现多张图片的无损拼接”吧!目录导入 python 库查看需要拼接的图片横向...
    99+
    2023-06-20
  • 基于Python和openCV实现图像的全景拼接详细步骤
    基本介绍 图像的全景拼接,即“缝合”两张具有重叠区域的图来创建一张全景图。其中用到了计算机视觉和图像处理技术有:关键点检测、局部不变特征、关键点匹配、RANSAC(Random Sa...
    99+
    2022-11-12
  • Python怎么实现将多张图片合成视频并加入背景音乐
    这篇文章主要介绍“Python怎么实现将多张图片合成视频并加入背景音乐”,在日常操作中,相信很多人在Python怎么实现将多张图片合成视频并加入背景音乐问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Pytho...
    99+
    2023-06-30
  • Java怎么实现自动生成缩略图片
    这篇文章主要介绍“Java怎么实现自动生成缩略图片”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么实现自动生成缩略图片”文章能帮助大家解决问题。一、自动生成缩略图方法:package&nb...
    99+
    2023-06-30
  • 基于Python怎么实现合并多张图片转成mp4视频
    一、需要调入的模块1、imageio模块Python模块imageio是一个用于读取和写入图像及视频数据的库。它支持多种格式,并且可以使用NumPy数组进行操作。以下是一些关键的函数:imageio.imread():从文件中读取图像数据并...
    99+
    2023-05-15
    Python
  • HTML5怎么实现渐变背景图片并自动下载
    这篇“HTML5怎么实现渐变背景图片并自动下载”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作