立体图像——NCC匹配方法计算视差图

本文介绍了立体图像的概念,重点探讨了以窗口代价计算视差的原理,特别是归一化互相关(NCC)算法。通过实验展示了不同窗口大小对匹配精度的影响,揭示了窗口大小与匹配效果、图像细节、噪声敏感性的关系。实验结果表明,适中的窗口大小能提供更精确的视差图,而过小或过大的窗口可能导致错误匹配或信息丢失。
摘要由CSDN通过智能技术生成

一、什么是立体图像

一个多视图成像的特殊例子是立体视觉(或者立体成像),即使用两台只有水平(向一侧)偏移的照相机观测同一场景。当照相机的位置如上设置,两幅图像具有相同的图像平面,图像的行是垂直对齐的,那么称图像对是经过矫正的。该设置在机器人学中很常见,常被称为立体平台
通过将图像扭曲到公共的平面上,使外极线位于图像行上,任何立体照相机设置都能得到矫正(我们通常构建立体平台来产生经过矫正的图像对)。假设两幅图像经过了矫正,那么对应点的寻找限制在图像的同一行上。一旦找到对应点,由于深度是和偏移成正比的,那么深度(Z 坐标)可以直接由水平偏移来计算,在这里插入图片描述,f 是经过矫正图像的焦距,b 是两个照相机中心之间的距离,xl 和 xr 是左右两幅图像中对应点的 x 坐标。分开照相机中心的距离称为基线。矫正后的立体照相机设置如图 所示。
在这里插入图片描述

二、以窗口代价计算视差的原理

基于滑动窗口的图像匹配
上述问题的解决方法:使用滑动窗口来进行匹配。如下图所示。对于左图中的一个像素点(左图中红色方框中心),在右图中从左到右用一个同尺寸滑动窗口内的像素和它计算相似程度,相似度的度量有很多种方法,比如 误差平方和法(Sum of Squared Differences,简称SSD),左右图中两个窗口越相似,SSD越小。下图中下方的SSD曲线显示了计算结果,SSD值最小的位置对应的像素点就是最佳的匹配结果。滑动窗口匹配原理示意图如下图所示。
在这里插入图片描述
具体操作中还有很多实际问题,比如滑动窗口尺寸。滑动窗口的大小选取还是很有讲究的。

三、归一化互相关(NCC)算法匹配原理

对于原始的图像内任意一个像素点(px,py)构建一个n×n的邻域作为匹配窗口。然后对于目标相素位置(px+d,py)同样构建一个n×n大小的匹配窗口,对两个窗口进行相似度度量,注意这里的d有一个取值范围。对于两幅图像来说,在进行NCC计算之前要对图像处理,也就是将两帧图像校正到水平位置,即光心处于同一水平线上,此时极线是水平的,否则匹配过程只能在倾斜的极线方向上完成,这将消耗更多的计算资源。
NCC计算公式如下图所示:
在这里插入图片描述
在这里插入图片描述
其中NCC(p,d)得到的值得范围将在[−1,1]之间
Wp​为之前提到的匹配窗口。
I1(x,y)为原始图像的像素值。
I1¯¯¯(px,py)为原始窗口内像素的均值。
I2(x+d,y)为原始图像在目标图像上对应点位置在x方向上偏移d后的像素值。
I2¯¯¯(px+d,py)为目标图像匹配窗口像素均值。
若NCC=−1则表示两个匹配窗口完全不相关,相反,若NCC=1时,表示两个匹配窗口相关程度非常高。
匹配流程:
①采集图像:通过标定好的双目相机采集图像,当然也可以用两个单目相机来组合成双目相机。
②极线校正:校正的目的是使两帧图像极线处于水平方向,或者说是使两帧图像的光心处于同一水平线上。通过校正极线可以方便后续的NCC 操作。
·由标定得到的内参中畸变信息中可以对图像去除畸变。
·通过校正函数校正以后得到相机的矫正变换R和新的投影矩阵P,接下来是要对左右视图进行去畸变,并得到重映射矩阵
③特征匹配:这里便是我们利用NCC做匹配的步骤啦,匹配方法如上所述,右视图中与左视图待测像素同一水平线上相关性最高的即为最优匹配。完成匹配后,我们需要记录其视差d,即待测像素水平方向xl与匹配像素水平方向xr之间的差值d=xr−xl,最终我们可以得到一个与原始图像尺寸相同的视差图D。

四、实验

1.实验要求

实验要求:
1 实现NCC 视差匹配方法,即给定左右两张视图,根据NCC计算视差图
2.分析不同窗口值对匹配结果的影响,重点考查那些点(或者哪些类型的点)在不同窗口大小下的匹配精度影响

2.实验代码

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
import cv2
from numpy import *
from numpy.ma import array
from scipy.ndimage import filters
np.seterr(divide='ignore', invalid='ignore')
def plane_sweep_ncc(im_l,im_r,start,steps
视差是指相机左右两个摄像头拍摄同一场景时,由于视角不同而导致的像素位移差异。NCC(Normalized Cross Correlation)视差匹配是一种常用的计算视差的方法之一。下面是在Python中实现NCC视差匹配计算视差图的步骤: 1. 读取左右两个摄像头拍摄的图像。 2. 对图像进行预处理,包括去噪、灰度化、归一化等。 3. 定义一个窗口大小,遍历左图像的每个像素点,在右图像中搜索与该像素点最相似的像素点。相似度可以通过计算两个窗口的NCC系数来得到。 4. 根据计算出的相似度,确定该像素点的视差值。 5. 对所有像素点都进行相似度计算和视差值确定,得到最终的视差图。 下面是一段Python代码示例,实现了NCC视差匹配计算视差图的功能: ```python import cv2 import numpy as np # 读取左右两张图像 imgL = cv2.imread('left.png', 0) imgR = cv2.imread('right.png', 0) # 图像预处理 imgL = cv2.GaussianBlur(imgL, (5, 5), 0) imgR = cv2.GaussianBlur(imgR, (5, 5), 0) imgL = cv2.normalize(imgL, None, 0, 255, cv2.NORM_MINMAX) imgR = cv2.normalize(imgR, None, 0, 255, cv2.NORM_MINMAX) # 定义窗口大小和搜索范围 winSize = 5 searchRange = 50 # 初始化视差图 disparity = np.zeros_like(imgL) # 遍历左图像的每个像素点 for i in range(winSize, imgL.shape[0] - winSize): for j in range(winSize, imgL.shape[1] - winSize): # 定义左图像窗口 leftWin = imgL[i - winSize:i + winSize + 1, j - winSize:j + winSize + 1] # 初始化最大相似度和视差值 maxCorr = -1 disp = 0 # 在右图像中搜索与左图像窗口最相似的窗口 for k in range(j - searchRange, j + searchRange): if k < winSize or k >= imgR.shape[1] - winSize: continue rightWin = imgR[i - winSize:i + winSize + 1, k - winSize:k + winSize + 1] corr = np.sum(leftWin * rightWin) / np.sqrt(np.sum(leftWin ** 2) * np.sum(rightWin ** 2)) if corr > maxCorr: maxCorr = corr disp = j - k # 将视差值保存到视差图中 disparity[i, j] = disp # 显示视差图 cv2.imshow('disparity', disparity) cv2.waitKey(0) cv2.destroyAllWindows() ``` 注意,此代码示例仅作为参考,实际应用中还需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值