计算机视觉项目实战-基于特征点匹配的图像拼接

😊😊😊 欢迎来到本博客😊😊😊
本次博客内容将继续讲解关于OpenCV的相关知识
🎉 作者简介:⭐️⭐️⭐️ 目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习(keras、pytorch、yolo),python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法。然后正在学习深度学习的相关内容。以后可能会涉及到网络安全相关领域,毕竟这是每一个学习计算机的梦想嘛!
📝 目前更新:🌟🌟🌟目前已经更新了关于网络爬虫的相关知识、机器学习的相关知识、目前正在更新计算机视觉-OpenCV的相关内容。
💛💛💛 本文摘要💛💛💛
本文我们将继续讲解计算机视觉领域项目-基于特征点匹配的图像拼接。

文章目录

*
🌟项目前言
🌟项目讲解前期准备

+ ⭐️图像特征检测Harris原理
+ ⭐️图像特征检测SIFT原理
+ ⭐️图像特征匹配实战
🌟项目详解

计算机视觉项目实战-基于特征点匹配的图像拼接

; 🌟项目前言

之前我们介绍过基于OpenCv的特征匹配操作,我们通过特征匹配可以精确的找到目标。本节我们继续探索基于特征匹配还可以做哪些事情。我们都在拍一个集体的过程中使用过苹果手机的全图效果进行拍照留念。那么苹果手机这个效果它是基于什么技术来做的呢?没错其实就是特征匹配。他是实时拍取多个照片,然后使用特征匹配操作继续两个图像之间特征点的匹配,然后生成转换矩阵,最后转换成效果图,我们本次博客就是要介绍一下这个操作如何使用OpenCv进行实现。

🌟项目讲解前期准备

⭐️图像特征检测Harris原理

  • 角点: 在图像的角度来看,无论是沿着水平方向还是竖直方向进行移动时候,灰度级会发生变化,而且这个变化是非常迅速的,我们称这个图像就是一个角点。
  • 边界: 在图像的角度上来看,指把图像按照水平或者垂直方向移动的时候,只有一个一个方向变化的比较明显,另一个方向变化就比较微弱,这样的我们就称之为边界。
  • 平面: *平面就是说无论向垂直方向还是水平方向移动,图像的灰度值都不会发生迅速的变化,这个就是平面。

计算机视觉项目实战-基于特征点匹配的图像拼接
原理图,这里第一个图表示的就是平面灰度值没有明显变化,第二个图就是要给边界灰度值水平方向变化明显垂直方向灰度值变化并不明显,第三个图表示的就是一个角点,无论水平还是垂直方向都很明显。主要看灰度级的变化结果:
计算机视觉项目实战-基于特征点匹配的图像拼接
边界:一个特征值大,一个特征值小,自相关函数在某一个方向上大,在其他方向上小。
平面:两个特征都小,且近似相等。
角点:两个特征都大,且近似相等,自相关函数在所有方向都大。
计算机视觉项目实战-基于特征点匹配的图像拼接

在OpenCV当中我们使用, cv2.cornerHarris()来进行角点检测。
其中参数都有:

  • img: 数据类型为 float32 的入图像
  • blockSize: 角点检测中指定区域的大小
  • ksize: Sobel求导中使用的窗口大小
  • k: 取值参数为 [0,04,0.06]
    我们使用几个小图像去做一下角点检测:
    计算机视觉项目实战-基于特征点匹配的图像拼接
import cv2
import numpy as np

img = cv2.imread('white-black.webp')
print ('img.shape:',img.shape)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

dst = cv2.cornerHarris(gray, 2, 3, 0.04)
print ('dst.shape:',dst.shape)
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

计算机视觉项目实战-基于特征点匹配的图像拼接
计算机视觉项目实战-基于特征点匹配的图像拼接

这里有一些点检测的不是特别好,然后我们用黑白棋盘来看一下。

计算机视觉项目实战-基于特征点匹配的图像拼接
这个效果堪称完美!!!

⭐️图像特征检测SIFT原理

SIFT是指尺度空间:是指在一定的范围内,无论物体是大是小,人眼都可以进行一个识别,然后计算机要去识别却很难,所以要让计算机能够对物体进行一个在不同尺度下都存在一个统一的认知,就要考虑图像在不同的尺度在都存在的特点,尺度空间的获取一般使用高斯模糊来实现-高斯滤波。
我们再说说SIFT有什么优点:
1、具有较好的稳定性和不变性,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。
2、区分性好,能够在海量特征数据库中进行快速准确的区分信息进行匹配
3、多量性,就算只有单个物体,也能产生大量特征向量
4、高速性,能够快速的进行特征向量匹配
5、可扩展性,能够与其它形式的特征向量进行联合

我们都知道如果图片经过高斯滤波操作之后呢,他会变模糊,那么为什么要这么做呢?因为当我们从很近的看一个人的时候,他是清晰的,那么从很远看的时候他就是模糊的。所以我们为了模拟这个过程,就用高斯滤波来进行相同了一个模拟。
不同σ的高斯函数决定了对图像的平滑程度,越大的σ值对应的图像越模糊。
因此我们要介绍一个金字塔, 高斯差分金字塔
我们需要做一个多分辨率的金字塔,对于金字塔的每一层都要做高斯滤波。

计算机视觉项目实战-基于特征点匹配的图像拼接
根据意思就是5个输入的高斯图像,相邻的进行像素值相减,得到4张差分后的结果。那么我们想要找什么呢?找SIFT,就是特征点,那么什么样的点被认为是特征点呢? 通常关键点数值较大、差分结果较大的、极值里面较大的。是不是有点像之前讲的图像金字塔。

; ⭐️图像特征匹配实战

计算机视觉项目实战-基于特征点匹配的图像拼接

🌟项目详解

前面我们简单的将特征匹配介绍了一下,然后我们开始讲一下我们本次博客的内容。
主函数:

from Stitcher import Stitcher
import cv2

imageA = cv2.imread("left_02.jpg")
imageB = cv2.imread("right_02.jpg")

stitcher = Stitcher()
(result, vis) = stitcher.stitch([imageA, imageB], showMatches=True)

cv2.imshow("Image A", imageA)
cv2.imshow("Image B", imageB)
cv2.imshow("Keypoint Matches", vis)
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在主函数这里我们把两张图像导入进来,注意这里的图像宽度必须一致,因为后续要进行拼接。长度可以保持不一致。然后我们进入拼接全景图的操作当中。
Stitcher()函数部分:

import numpy as np
import cv2

class Stitcher:

    def stitch(self, images, ratio=0.75, reprojThresh=4.0,showMatches=False):

        (imageB, imageA) = images
        (kpsA, featuresA) = self.detectAndDescribe(imageA)
        (kpsB, featuresB) = self.detectAndDescribe(imageB)
        M = self.matchKeypoints(kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh)

        if M is None:
            return None

        (matches, H, status) = M

        result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))

        result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB

        if showMatches:

            vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches, status)

            return (result, vis)

        return result

首先我们将程序写成一个类,然后在类中使用 self.detectAndDescribe()函数检测A、B图片的SIFT关键特征点,并计算特征描述子。

    def detectAndDescribe(self, image):

        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        descriptor = cv2.SIFT_create()
        (kps, features) = descriptor.detectAndCompute(image, None)
        kps = np.float32([kp.pt for kp in kps])
        return (kps, features)

首先我们将图像转换成了灰度图,然后我们建立了使用SIFT检测特征点的检测器。然后对两张图片进行特征点检测,然后将结果转化成numpy数组并且返回。
然后在使用 self.matchKeypoints()对特征点进行匹配。

    def matchKeypoints(self, kpsA, kpsB, featuresA, featuresB, ratio, reprojThresh):

        matcher = cv2.BFMatcher()

        rawMatches = matcher.knnMatch(featuresA, featuresB, 2)
        matches = []
        for m in rawMatches:

            if len(m) == 2 and m[0].distance < m[1].distance * ratio:

                matches.append((m[0].trainIdx, m[0].queryIdx))

        if len(matches) > 4:

            ptsA = np.float32([kpsA[i] for (_, i) in matches])
            ptsB = np.float32([kpsB[i] for (i, _) in matches])

            (H, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, reprojThresh)

            return (matches, H, status)

        return None

通过上述代码我们可以计算出来两张图象的视角变换矩阵,然后返回结果。最后进行可视化操作。

    def drawMatches(self, imageA, imageB, kpsA, kpsB, matches, status):

        (hA, wA) = imageA.shape[:2]
        (hB, wB) = imageB.shape[:2]
        vis = np.zeros((max(hA, hB), wA + wB, 3), dtype="uint8")
        vis[0:hA, 0:wA] = imageA
        vis[0:hB, wA:] = imageB

        for ((trainIdx, queryIdx), s) in zip(matches, status):

            if s == 1:

                ptA = (int(kpsA[queryIdx][0]), int(kpsA[queryIdx][1]))
                ptB = (int(kpsB[trainIdx][0]) + wA, int(kpsB[trainIdx][1]))
                cv2.line(vis, ptA, ptB, (0, 255, 0), 1)

        return vis

我们来看一下效果图:
左一图:

计算机视觉项目实战-基于特征点匹配的图像拼接
右一图:
计算机视觉项目实战-基于特征点匹配的图像拼接
最终效果图:
计算机视觉项目实战-基于特征点匹配的图像拼接
在用一个经典案例:
计算机视觉项目实战-基于特征点匹配的图像拼接
计算机视觉项目实战-基于特征点匹配的图像拼接
计算机视觉项目实战-基于特征点匹配的图像拼接

🔎 支持:🎁🎁🎁 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

Original: https://blog.csdn.net/m0_37623374/article/details/126929429
Author: 吃猫的鱼python
Title: 计算机视觉项目实战-基于特征点匹配的图像拼接

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/813191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 保姆级攻略 将 pycharm django项目部署到云服务器

    保姆级攻略 将 pycharm django项目部署到云服务器 1-下载python3.8压缩包 2-解压缩安装包 3-安装依赖工具 4-安装python3.8 5-修改pytho…

    Python 2023年8月6日
    048
  • 爬虫框架Scrapy总结笔记

    前言 由于工作需要,学习一下爬虫框架,在网上看了别人的笔记和教学视频,想总结一下便于以后复习用,然后和大家分享一下。 我的总结大概分为四步: Scrapy的整体架构 使用Scrap…

    Python 2023年10月2日
    035
  • 1.2 Qt Creater使用Python开发桌面软件的界面设计

    上节中介绍了项目创建流程,本节主要介绍软件界面的设计。 首先我们打开Qt Creater的设计界面,我们可以看到屏幕中间就是需要设计的软件窗体;左侧列表中为控件(软件设计所需要的各…

    Python 2023年6月10日
    065
  • python [ : , : ] [ : ,None , : ] 等形式的意义——Python学习系列

    先上结论: 设有基于 python语言的数组 arr, arr[ : , : ]表示的是对数组中 不同维度的 索引, 若存在关键字 None则表示 维度扩充。 不妨假设 arr维度…

    Python 2023年8月23日
    069
  • 8种Python字符串拼接的方法,你知道几种?

    join 是 python 中字符串自带的一个方法,返回一个字符串。使用语法为: sep.join(可迭代对象) –》 str sep 分隔符 可以为空 将一个包含多个字符串的可…

    Python 2023年5月25日
    061
  • Scrapy命令行工具的使用

    回答1: 是一款功能强大的Python网络爬虫框架,可用于抓取和提取网页数据。以下是 数据爬取和解析的一些基本步骤: 1. 创建一个 项目:在 startproject proje…

    Python 2023年10月4日
    041
  • pygame 移开的矩形留痕迹_使用pygame进行Python矩形碰撞处理

    在过去的几天里,我一直在对这个主题进行广泛的研究,我似乎无法找到我的确切问题的答案. 所以,我有一个简单的游戏设置,我将玩家设置为0,0,宽度为10×10 player= pyga…

    Python 2023年9月24日
    035
  • Ruia异步爬虫框架快速开始教程

    基于Ruia快速实现一个以Hacker News为目标的爬虫 概述 Ruia是一个基于asyncio和aiohttp的异步爬虫框架,目标在于让开发者编写爬虫尽可能地方便快速。 写更…

    Python 2023年10月2日
    044
  • Python pytest装饰器总结(实例详解)

    这篇文章主要介绍了Python pytest装饰器总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以关注下 威信攻粽号 “软件测试…

    Python 2023年9月10日
    032
  • Git&Gitee

    Git Git介绍 安装 命令学习 Git的作用 git与svn比较 Git,GitHub,GitLab,Gitee Git工作流程 Git常用命令 在仓库目录终端下 &#8211…

    Python 2023年6月10日
    064
  • 这些是最热门的机器学习方法!

    在上文中我们已经了解了机器学习的原理,就是模仿人类大脑进行学习的过程,通过让机器模仿这种学习过程实现所谓的”智能”。 经过近几十年的发展,机器学习的方法也越…

    Python 2023年10月29日
    047
  • Python面试题 – 基础题(一)

    1.为什么学习Python? 说到这个问题,就觉得有点难以启齿。自己对学习Java一直很抗拒,Python相对Java来说比较简单,再加上硕士期间一直都是使用Python进行数据挖…

    Python 2023年8月5日
    058
  • Pandas库学习

    一、Pandas是什么 Pandas 是 Python 语言的一个扩展程序库,用于数据分析。Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算…

    Python 2023年8月18日
    056
  • 设计模式(Python语言)—-简单工厂模式

    推荐文章 很多小伙伴都发现了,用户自主「申请上首页」的按钮取消了,那博主们写的文章还有上首页曝光的机会吗?我们的回答是”当然有!!!”虽然我们取消了上首页申…

    Python 2023年5月24日
    065
  • python绑定按键pageup键_python游戏教程一——键盘事件

    无论什么游戏,少不了输入设备,键盘鼠标可能应用的是最多的,当然除了他们还有游戏手柄或者其他。今天我们就一起来学习一下经常用到的鼠标和键盘事件。 python当中经常用来做游戏的标准…

    Python 2023年9月21日
    071
  • python(牛客)试题解析1 – 简单

    导航: 一、NC103 反转字符串 二、NC141 判断是否为回文字符串 三、NC151 最大公约数 四、NC65 斐波那契数列 五、字符按排序后查看第k个最小的字母 六、数组内取…

    Python 2023年10月14日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球