计算机视觉--------图像拼接

1 图像拼接

1.1 图像拼接简介

图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。

1.2 图像拼接步骤

在这里插入图片描述
特征提取 Feature Extraction:在所有输入图像中检测特征点
图像配准 Image Registration:建立了图像之间的几何对应关系,使它们可以在一个共同的参照系中进行变换、比较和分析。
大致可以分为以下几个类

  1. 直接使用图像的像素值的算法,例如,correlation methods
  2. 在频域处理的算法,例如,基于快速傅里叶变换(FFT-based)方法;
  3. 低水平特征的算法low level features,通常用到边缘和角点,例如,基于特征的方法,
  4. 高水平特征的算法high-level features,通常用到图像物体重叠部分,特征关系,例如,图论方法(Graph-theoretic methods)

图像变形 Warping:
图像变形是指将其中一幅图像的图像重投影,并将图像放置在更大的画布上。
图像融合 Blending
图像融合是通过改变边界附近的图像灰度级,去除这些缝隙,创建混合图像,从而在图像之间实现平滑过渡。混合模式(Blend modes)用于将两层融合到一起。

1.3 相关原理

1.3.1进行sift特征匹配和RANSAC剔除错误匹配

sift匹配结果
在这里插入图片描述RANSAC算法筛选SIFT特征匹配
在这里插入图片描述
在这里插入图片描述

上一篇博客有介绍https://blog.csdn.net/qq_41958347/article/details/104632766

1.3.2图像配准(Apap)

图像配准是将两张场景相关的图像进行映射,寻找其中的关系,多用在医学图像配准、图像拼接、不同摄像机的几何标定等方面,其研究也较为成熟。
在这里插入图片描述图像配准寻找一种空间变换把一幅图像映射到另一幅图像,使变化后的图像能与上一张图像拼接,但是两张图片之间的景深不同,所以如果直接将两张图片映射到一张,就会产生鬼影,这种现象是无法避免的。而apap算法则是将图像分为若干个区域,在每个小区域内进行图像的匹配和映射,这样能够减少因为景深而带来的鬼影现象

Apap算法原理https://blog.csdn.net/warrenwg/article/details/49759779
Apap虽然能够较好地完成配准,但非常依赖于特征点对。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量。

1.3.3图像分割

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。
在这里插入图片描述
运用最大流最小割定理,可以找出两张图片拼接成的图片中找出最小割沿着最小割将图片分外两部分,两个部分分别使用对应的图片映射,这样得到的拼接图片会有更好的效果
在这里插入图片描述

1.3.4根据multi-band bleing策略实现融合

Multi-Band算法就是将图像分解为不同频带的分量之加和,图像的宏观特征在它的低频分量图里,而局域特征在高频分量图里。
在这里插入图片描述计算输入图像的高斯金字塔
计算输入图像的拉普拉斯金字塔
在这里插入图片描述将处于同一级的拉普拉斯金字塔进行融合。可以是简单的线性融合。
将高层的拉普拉斯金字塔依次扩展直至和源图像相同分辨率

在这里插入图片描述
将得到的图像依次叠加,则得到最终的输出图像
在这里插入图片描述

1.4 代码实现

from pylab import *
from numpy import *
from PIL import Image

# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift
import numpy as np
"""
This is the panorama example from section 3.3.
"""
np.seterr(divide='ignore'
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
全景图像拼接是将多张拍摄自同一地点、视角不同的照片拼接成一张大的全景图像。OpenCV是一个非常强大的计算机视觉库,可以用来实现全景图像拼接。 下面是实现全景图像拼接的基本步骤: 1. 加载图片。使用OpenCV的cv2.imread()函数加载图片。 2. 特征点检测。使用OpenCV的SIFT、SURF、ORB等算法检测每张图片的特征点。 3. 特征点匹配。使用OpenCV的FLANN或者Brute-Force算法对特征点进行匹配。 4. 计算单应性矩阵。使用OpenCV的findHomography函数计算单应性矩阵,将当前图片与上一张图片进行拼接。 5. 图像拼接。使用OpenCV的warpPerspective函数将当前图片进行透视变换,然后将图片拼接到上一张图片上。 6. 重复步骤2-5,直到所有图片拼接完成。 下面是一个基于OpenCV实现全景图像拼接的示例代码: ```python import cv2 import numpy as np # 加载图片 img1 = cv2.imread('img1.jpg') img2 = cv2.imread('img2.jpg') # 特征点检测 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # 特征点匹配 bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) good_matches = [] for m, n in matches: if m.distance < 0.75 * n.distance: good_matches.append(m) 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) # 计算单应性矩阵 M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # 图像拼接 result = cv2.warpPerspective(img1, M, (img1.shape[1] + img2.shape[1], img1.shape[0])) result[0:img2.shape[0], 0:img2.shape[1]] = img2 cv2.imshow('result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码实现了两张图片拼接。你可以使用这个基本的框架,将多张图片进行拼接,从而实现全景图像拼接
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值