首页 > 其他分享 >[Computer Vision]实验三:图像拼接

[Computer Vision]实验三:图像拼接

时间:2025-01-22 21:29:09浏览次数:3  
标签:plt 单应性 img Computer 矩阵 cv2 shape 拼接 Vision

目录

一、实验内容

二、实验过程及结果

2.1 单应性变换

 2.2 RANSAC算法

三、实验小结


一、实验内容

  1. 理解单应性变换中各种变换的原理(自由度),并实现图像平移、旋转、仿射变换等操作,输出对应的单应性矩阵。
  2. 利用RANSAC算法优化关键点匹配,比较优化前后图像拼接和所生成全景图的差别,输出RANSAC前后匹配点数量、单应性矩阵。

二、实验过程及结果

2.1 单应性变换

(1)实验代码

import cv2
from networkx import center
import numpy as np
from scipy.fft import dst
import matplotlib.pyplot as plt
img=cv2.imread("D:/Computer vision/test1 picture/picture3.png")

x=100
y=50
M0=np.float32([[1,0,x],[0,1,y]])
translated=cv2.warpAffine(img,M0,(img.shape[1],img.shape[0]))
print("平移变换单应性矩阵:\n",M0)

img_center=(img.shape[1]/2,img.shape[0]/2)
M1=cv2.getRotationMatrix2D(img_center,45,1)
rotated=cv2.warpAffine(img,M1,(img.shape[1],img.shape[0]))
print("旋转变换单应性矩阵:\n",M1)

M2=cv2.getRotationMatrix2D(img_center,0,0.5)
scaled=cv2.warpAffine(img,M2,(img.shape[1],img.shape[0]))
print("缩放变换单应性矩阵:\n",M2)

rows,cols,ch=img.shape
src_points=np.float32([[0,0],[cols-1,0],[0,rows-1]])
dst_points=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])
M3=cv2.getAffineTransform(src_points,dst_points)
warped=cv2.warpAffine(img,M3,(cols,rows))
print("扭曲变换单应性矩阵:\n",M3)

rows,cols=img.shape[:2]
pts1=np.float32([[150,50],[400,50],[60,450],[310,450]])
pts2=np.float32([[50,50],[rows-50,50],[50,cols-50],[rows-50,cols-50]])
M4=cv2.getPerspectiveTransform(pts1,pts2)
img_dst=cv2.warpPerspective(img,M4,(cols,rows))
print("透视变换单应性矩阵:\n",M4)

plt.figure("Processed Images")
plt.subplot(2,3,1)
plt.imshow(img)
plt.title("Original Image")
plt.subplot(2,3,2)
plt.imshow(translated)
plt.title("Translated Image")
plt.subplot(2,3,3)
plt.imshow(rotated)
plt.title("Rotated Image")
plt.subplot(2,3,4)
plt.imshow(scaled)
plt.title("Scaled Image")
plt.subplot(2,3,5)
plt.imshow(warped)
plt.title("Warped Image")
plt.subplot(2,3,6)
plt.imshow(img_dst)
plt.title("Dst Image")
plt.show()
plt.savefig("D:/Computer vision/ransac_picture/processed_images.png")
plt.show()

(2)实验结果截图

图1为输出的单应性矩阵结果截图:

平移变换:两个自由度(两个平移参数),单应性矩阵为2*3的矩阵

旋转变换:一个自由度(一个旋转角度参数),单应性矩阵为2*3的矩阵

缩放变换:一个自由度(一个缩放因子),单应性矩阵为2*3的矩阵

扭曲变换有六个自由度(两个旋转参数 一个缩放因子),单应性矩阵为2*3的矩阵

透视变换有八个自由度(5个是仿射变换参数,3个是透视变换参数),单应性矩阵为3*3的矩阵

图1

图2为输出的单应性变换的结果图:

可以看到,平移变换的图像在x方向上平移100个像素,在y方向上平移50个像素。旋转变换的图像绕图像中心旋转45度。缩放变换的图像在x方向上缩小到原来的一半,在y方向上缩小到原来的一半。扭曲变换的图像进行仿射变换,包括旋转、缩放、平移和剪切。透视变换的图像进行了透视变换,包括旋转、缩放、平移和透视变形。

图2
 2.2 RANSAC算法

(1)实验代码

import cv2
import numpy as np

def detectAndCompute(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    sift = cv2.SIFT_create()
    keypoints, descriptors = sift.detectAndCompute(gray, None)
    return keypoints, descriptors

def matchKeyPoints(kpsA, kpsB, featuresA, featuresB, ratio=0.75, reprojThresh=4.0):
    matcher = cv2.BFMatcher()
    rawMatches = matcher.knnMatch(featuresA, featuresB, 2)
    matches = []
    for m in rawMatches:
        if len(m) == 2 and m[0].distance < ratio * m[1].distance:
            matches.append((m[0].queryIdx, m[0].trainIdx))
    ptsA = np.float32([kpsA[i].pt for (i, _) in matches])
    ptsB = np.float32([kpsB[i].pt for (_, i) in matches])
    (M, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, reprojThresh)
    return (M, matches, status)

def drawMatches(imgA, imgB, kpsA, kpsB, matches, status):
    (hA, wA) = imgA.shape[:2]
    (hB, wB) = imgB.shape[:2]
    result = np.zeros((max(hA, hB), wA + wB, 3), dtype="uint8")
    result[0:hA, 0:wA] = imgA
    result[0:hB, wA:] = imgB
    for ((trainIdx, queryIdx), s) in zip(matches, status):
        if s == 1:
            ptA = (int(kpsA[queryIdx].pt[0]), int(kpsA[queryIdx].pt[1]))
            ptB = (int(kpsB[trainIdx].pt[0]) + wA, int(kpsB[trainIdx].pt[1]))
            cv2.line(result, ptA, ptB, (0, 255, 0), 1)
    return result

def stitchImages(imageA, imageB, M):
    (hA, wA) = imageA.shape[:2]
    (hB, wB) = imageB.shape[:2]
    result = cv2.warpPerspective(imageA, M, (wA + wB, hA))
    result[0:hB, 0:wB] = imageB
    return result

if __name__ == '__main__':
    imageA = cv2.imread("D:\Computer vision/ransac_picture/ransac1.jpg")
    imageB = cv2.imread("D:/Computer vision/ransac_picture/ransac2.jpg")
    
    kpsA, featuresA = detectAndCompute(imageA)
    kpsB, featuresB = detectAndCompute(imageB)
    
    M, matches, status = matchKeyPoints(kpsA, kpsB, featuresA, featuresB)
    
    initial_matches = sum(status)
    final_matches = len(matches)
    print(f"RANSAC前匹配点数量: {initial_matches}")
    print(f"RANSAC后匹配点数量: {final_matches}")
    print("单应性矩阵为:\n", M)
    
    drawImgBeforeRANSAC = drawMatches(imageA, imageB, kpsA, kpsB, matches, status)
    cv2.imshow("drawMatches Before RANSAC", drawImgBeforeRANSAC)
    cv2.waitKey()
    cv2.destroyAllWindows()

    stitchedImage = stitchImages(imageA, imageB, M)
    cv2.imshow("Stitched Image", stitchedImage)
    cv2.waitKey()
    cv2.destroyAllWindows()
    cv2.imwrite("D:/Computer vision/ransac_picture/stitched_image.jpg", stitchedImage)
cv2.imwrite("D:/Computer vision/ransac_picture/drawMatchesBeforeRANSAC.jpg", drawImgBeforeRANSAC)

(2)数据集(待拼接)

(3)实验结果截图

图3为输出的单应性矩阵结果截图:

如图所示,在运行SIFT特征检测和描述符提取后,通过BFMatcher进行特征匹配,初始匹配点的数量是198对。经过RANSAC算法去除错误匹配后,剩余的匹配点数量为1074对。这表明RANSAC算法有效地保留了正确的匹配点并去除了错误的匹配点。

图3

图4为在应用RANSAC算法之前绘制的匹配结果图像:

如图所示,绘制两幅图像的匹配结果并显示特征点之间的匹配关系。通过可视化匹配结果,可以直观地看到哪些特征点被成功匹配。

图4

图5为最终拼接后的图像:

图5

三、实验小结

图像拼接是计算机视觉领域的一个重要研究方向,通过将多张重叠的图像拼接在一起,实现更大、更全面的图像展示。实验中通过使用opencv中的相关函数实现图像的单应性变换,并使用BFMatcher和RANSAC算法进行了特征点匹配以及图像拼接。使用RANSAC算法后拼接效果良好,没有出现明显的错位或重叠问题。

标签:plt,单应性,img,Computer,矩阵,cv2,shape,拼接,Vision
From: https://blog.csdn.net/weixin_73049545/article/details/145310881

相关文章

  • 白话大模型概念,一起来看看Phi小模型系列区别:mini、small、medium 和 vision 版本
    大家好,我是编程乐趣。前面文章,我们已经初步感受到Phi的魅力了,见《Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5》。今天我们以Phi为例子来学习大模型的各种专业性的术语。Phi-3系列包括mini、small、medium和vision版......
  • 星海智算:Llama3.2 Vision使用教程
    (一)前言​1、磁盘空间​占用33G磁盘,预留了近67G磁盘空间以供用户使用。2、模型介绍​Llama3.2-Vision多模态大型语言模型(LLM)集合是一个包含11B和90B尺寸的指令微调图像推理生成模型的集合(文本+图像输入/文本输出)。Llama3.2-Vision指令微调模型针对视觉识别......
  • post、get请求(查询字符串参数)将对象拼接为地址栏请求参数new URLSearchParams
    constparams=newURLSearchParams({param1:'value1',param2:'value2'}).toString();该方法可将param1和param2拼接为param1=value1&param2=value2实例consturl='https://example.com/api/resource';constparams=newURLSearchP......
  • 本次小论文minor revision中的知识积累
    可以发邮件向编辑申请延期返修截止日期https://cn.service.elsevier.com/app/answers/detail/a_id/29653/c/10595/supporthub/publishing/role/作者/https://zhuanlan.zhihu.com/p/577324425申请邮件模板:如何在EditorialManager系统中提交修改稿?【爱思唯尔Editorial......
  • 解密 Apple Vision Pro 的眼睛舒适度调节技术
    如果你在长时间佩戴使用VisionPro后感觉到异常的眼睛疲劳,即便没有观看太多高速运动的画面仍然感觉到眩晕,或者在摘下VisionPro后眼睛需要额外花一点时间才能重新对焦到周边物体,那么你可以尝试手动调整一下这一显示屏距离,以找到最适合自己的屏幕显示效果。【视频Vision......
  • ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision(V
    ViLT:Vision-and-LanguageTransformerWithoutConvolutionorRegionSupervision(ViLT无卷积或区域监督的语言视觉转换器)1.摘要大概内容就是视觉与语言预训练(VLP)在各种视觉与语言联合下游任务重表现很牛逼,但是目前他们大部分都以来图像特征提取过程(比如区域监督和卷积结......
  • 地平线Vision Mamba:超越ViT,最具潜力的下一代通用视觉主干网络
    •VisionMamba论文链接:https://arxiv.org/abs/2401.09417•项目主页:https://github.com/hustvl/Vim简介本文的工作VisionMamba[1]发表在ICML2024。研究的问题是如何设计新型神经网络来实现高效的视觉表示学习。该任务要求神经网络模型能够在处理高分辨率图像时既保持......
  • 《使用 Vision Transformer 进行图像分类》
    《使用VisionTransformer进行图像分类》作者:KhalidSalama创建日期:2021/01/18最后修改时间:2021/01/18描述:实现用于图像分类的VisionTransformer(ViT)模型。(i)此示例使用Keras3 在Colab中查看 • GitHub源介绍此示例实现了AlexeyDosovitskiy等人的......
  • VP UNIQUE VISION Programming Contest 2024 Christmas (AtCoder Beginner Contest 38
    A-Equally题意:给你三个数,判断能不能分成大于一组后每组和相等。只可能分成两个和一个或者三组一个的。点击查看代码voidsolve(){inta,b,c;std::cin>>a>>b>>c;if((a==b&&b==c)||(a+b==c)||(b+c)==a||(a+c)==b){ s......
  • 中考英语优秀范文-013 Computer in my life 电脑在我的生活中
    中考英语优秀范文-013Computerinmylife电脑在我的生活中1写作要求假设某中学生英文报开展关于计算机与学生生活的征文活动,请你根据下表所提示的要点,以Computerinmylife为题,用英语为该报写一篇短文,简述计算机在你生活中的用途,并就计算机对你生活的影响谈谈你的感受。2......