1.NCC匹配介绍
1.1原理
对于原始的图像内任意一个像素点(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 时,表示两个匹配窗口相关程度非常高。
1.2匹配流程
1.采集图像:通过标定好的双目相机采集图像,当然也可以用两个单目相机来组合成双目相机。
2.极线校正:校正的目的是使两帧图像极线处于水平方向,或者说是使两帧图像的光心处于同一水平线上。通过校正极线可以方便后续的NCC操作。
- 由标定得到的内参中畸变信息中可以对图像去除畸变。
- 通过校正函数校正以后得到相机的矫正变换R和新的投影矩阵P,接下来是要对左右视图进行去畸变,并得到重映射矩阵。
3.特征匹配:这里便是我们利用NCC 做匹配的步骤啦,匹配方法如上所述,右视图中与左视图待测像素同一水平线上相关性最高的即为最优匹配。完成匹配后,我们需要记录其视差d,即待测像素水平方向xl与匹配像素水平方向xr之间的差值d=xr-xl,最终我们可以得到一个与原始图像尺寸相同的视差图D。
4.深度恢复:通过上述匹配结果得到的视差图D,我们可以很简单的利用相似三角形反推出以左视图为参考系的深度图。
2.代码
# -*- 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
def plane_sweep_ncc(im_l,im_r,start,steps,wid):
""" 使用归一化的互相关计算视差图像 """
m,n = im_l.shape
# 保存不同求和值的数组
mean_l = zeros((m,n))
mean_r = zeros((m,n)