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

这篇具有很好参考价值的文章主要介绍了计算机视觉项目实战-基于特征点匹配的图像拼接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

本文我们将继续讲解计算机视觉领域项目-基于特征点匹配的图像拼接。

快速特征匹配拼接,计算机视觉,深度学习,人工智能

🌟项目前言

之前我们介绍过基于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)
# gray = np.float32(gray)
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
        # 否则,提取匹配结果
        # H是3x3视角变换矩阵      
        (matches, H, status) = M
        # 将图片A进行视角变换,result是变换后图片
        result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))
        #self.cv_show('result', result)
        # 将图片B传入result图片最左端
        result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB
        #self.cv_show('result', result)
        # 检测是否需要显示图片匹配
        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()
        # 使用KNN检测来自A、B图的SIFT特征匹配对,K=2
        rawMatches = matcher.knnMatch(featuresA, featuresB, 2)
        matches = []
        for m in rawMatches:
            # 当最近距离跟次近距离的比值小于ratio值时,保留此匹配对
            if len(m) == 2 and m[0].distance < m[1].distance * ratio:
            # 存储两个点在featuresA, featuresB中的索引值
                matches.append((m[0].trainIdx, m[0].queryIdx))
        # 当筛选后的匹配对大于4时,计算视角变换矩阵
        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)
        # 如果匹配对小于4时,返回None
        return None

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

    def drawMatches(self, imageA, imageB, kpsA, kpsB, matches, status):
        # 初始化可视化图片,将A、B图左右连接到一起
        (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

我们来看一下效果图:
左一图:
快速特征匹配拼接,计算机视觉,深度学习,人工智能
右一图:
快速特征匹配拼接,计算机视觉,深度学习,人工智能
最终效果图:
快速特征匹配拼接,计算机视觉,深度学习,人工智能
在用一个经典案例:
快速特征匹配拼接,计算机视觉,深度学习,人工智能
快速特征匹配拼接,计算机视觉,深度学习,人工智能
快速特征匹配拼接,计算机视觉,深度学习,人工智能

🔎支持🎁🎁🎁如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!文章来源地址https://www.toymoban.com/news/detail-787184.html

到了这里,关于计算机视觉项目实战-基于特征点匹配的图像拼接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉项目实战-目标检测与识别

    😊😊😊 欢迎来到本博客 😊😊😊 本次博客内容将继续讲解关于OpenCV的相关知识 🎉 作者简介 : ⭐️⭐️⭐️ 目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习(keras、pytorch、yolov5),python网页爬虫、机器学习、计算机视觉(OpenCV)

    2024年02月02日
    浏览(43)
  • 使用计算机视觉实战项目精通 OpenCV:6~8

    原文:Mastering OpenCV with Practical Computer Vision Projects 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。 非刚

    2023年04月21日
    浏览(66)
  • 计算机视觉——day 91基于双网络的鲁棒特征高光谱目标检测(偏门且很水啊)

    用于高光谱目标检测的深度网络训练通常面临样本有限的问题,在极端情况下,可能只有一个目标样本可用。为了解决这一挑战,我们提出了一种新的双网络方法。针对高光谱图像的光谱和空间特征,利用生成对抗网络(GAN)和卷积神经网络(CNN)两种神经网络对目标进行检测。然

    2024年02月04日
    浏览(81)
  • 计算机视觉实战项目2(单目测距+图像处理+路径规划+车牌识别)

    用python3+opencv3做的中国车牌识别,包括算法和客户端界面,只有2个文件,一个是界面代码,一个是算法代码,点击即可出结果,方便易用! 链接:车牌识别 大致的UI界面如下,点击输入图片,右侧即可出现结果! 额外说明:算法代码只有500行,测试中发现,车牌定位算法的

    2024年02月07日
    浏览(58)
  • 【实战精选】基于计算机视觉OpenCV的答题卡识别系统

    项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义: 随着科技的不断发展,计算机视觉技术在各个领域中的应用越来越广泛。其中,基于计算机视觉的答题卡识别系统在教育领域中具有重要的意义。传统的答题卡批阅方式需要大量的人力和时间,容易

    2024年04月25日
    浏览(41)
  • 基于深度学习的计算机视觉垃圾分类项目解析

    项目地址:https://gitcode.com/YaoHaozhe/Computer-vision-based-on-deep-learning-garbage-classification 在这个数字化的时代,数据已经成为我们生活和工作的重要组成部分,而其中,图像数据的处理能力更是关键。YaoHaozhe 创建的这个基于深度学习的计算机视觉垃圾分类项目,提供了一个实用的解决

    2024年04月12日
    浏览(28)
  • 计算机视觉之图像特征提取

    图像特征提取是计算机视觉中的重要任务,它有助于识别、分类、检测和跟踪对象。以下是一些常用的图像特征提取算法及其简介: 颜色直方图(Color Histogram) : 简介 :颜色直方图表示图像中各种颜色的分布情况。通过将图像中的像素分成颜色通道(如RGB)并计算每个通道

    2024年02月12日
    浏览(34)
  • 计算机视觉实战项目(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别)

    教程博客_传送门链接:链接 在本教程中,您将学习如何使用迁移学习训练卷积神经网络以进行图像分类。您可以在 cs231n 上阅读有关迁移学习的更多信息。 本文主要目的是教会你如何自己搭建分类模型,耐心看完,相信会有很大收获。废话不多说,直切主题… 首先们要知道深

    2024年02月07日
    浏览(52)
  • 计算机视觉基础__图像特征

    目录 一、前言 二、位图和矢量图概念 三、图像的颜色特征 四、RGB 颜色空间 五、HSV 颜色空间 六、HLS 颜色空间 七、CMYK 颜色 八、Lab模式 九、索引模式 十、HSB色彩模式 十一、灰度图 十二、二值图 十三、P(pallete)模式 十四、位图模式 十五、双色调模式 十六、多通道模式

    2023年04月19日
    浏览(45)
  • 图像特征Vol.1:计算机视觉特征度量|第一弹:【纹理区域特征】

    🍊 什么是计算机视觉特征? 简单来说就是 图像特征 ,对于我们来说,看到一张图片,能很自然的说出和描述图像中的一些特征,但是同样的图片,丢给计算机,只是一个二维矩阵,计算机需要从这个图像中提取计算得到一些数值表示,来描述这个图像所具有的特征:颜色

    2024年02月03日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包