立体图像——NCC匹配方法计算视差图
文章目录
- 一、什么是立体图像
- 二、以窗口代价计算视差的原理
- 三、归一化互相关(NCC)算法匹配原理
- 四、实验
- 1.实验要求
- 2.实验代码
- 3.实验结果
- 五、实验小结
一、什么是立体图像
一个多视图成像的特殊例子是立体视觉(或者立体成像),即使用两台只有水平(向一侧)偏移的照相机观测同一场景。当照相机的位置如上设置,两幅图像具有相同的图像平面,图像的行是垂直对齐的,那么称图像对是经过矫正的。该设置在机器人学中很常见,常被称为立体平台。
通过将图像扭曲到公共的平面上,使外极线位于图像行上,任何立体照相机设置都能得到矫正(我们通常构建立体平台来产生经过矫正的图像对)。假设两幅图像经过了矫正,那么对应点的寻找限制在图像的同一行上。一旦找到对应点,由于深度是和偏移成正比的,那么深度(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,wid):""" 使用归一化的互相关计算视差图像 """m,n = im_l.shape# 保存不同求和值的数组mean_l = zeros((m,n))mean_r = zeros((m,n))s = zeros((m,n))s_l = zeros((m,n))s_r = zeros((m,n))# 保存深度平面的数组dmaps = zeros((m,n,steps))# 计算图像块的平均值filters.uniform_filter(im_l,wid,mean_l)filters.uniform_filter(im_r,wid,mean_r)# 归一化图像norm_l = im_l - mean_lnorm_r = im_r - mean_r# 尝试不同的视差for displ in range(steps):# 将左边图像移动到右边,计算加和filters.uniform_filter(np.roll(norm_l, -displ - start) * norm_r, wid, s) # 和归一化filters.uniform_filter(np.roll(norm_l, -displ - start) * np.roll(norm_l, -displ - start), wid, s_l)filters.uniform_filter(norm_r*norm_r,wid,s_r) # 和反归一化# 保存 ncc 的分数dmaps[:,:,displ] = s / sqrt(s_l * s_r)# 为每个像素选取最佳深度return np.argmax(dmaps, axis=2)def plane_sweep_gauss(im_l,im_r,start,steps,wid):""" 使用带有高斯加权周边的归一化互相关计算视差图像 """m,n = im_l.shape# 保存不同加和的数组mean_l = zeros((m,n))mean_r = zeros((m,n))s = zeros((m,n))s_l = zeros((m,n))s_r = zeros((m,n))# 保存深度平面的数组dmaps = zeros((m,n,steps))# 计算平均值filters.gaussian_filter(im_l,wid,0,mean_l)filters.gaussian_filter(im_r,wid,0,mean_r)# 归一化图像norm_l = im_l - mean_lnorm_r = im_r - mean_r# 尝试不同的视差for displ in range(steps):# 将左边图像移动到右边,计算加和filters.gaussian_filter(np.roll(norm_l, -displ - start) * norm_r, wid, 0, s) # 和归一化filters.gaussian_filter(np.roll(norm_l, -displ - start) * np.roll(norm_l, -displ - start), wid, 0, s_l)filters.gaussian_filter(norm_r*norm_r,wid,0,s_r) # 和反归一化# 保存 ncc 的分数dmaps[:,:,displ] = s / np.sqrt(s_l * s_r)# 为每个像素选取最佳深度return np.argmax(dmaps, axis=2)im_l = array(Image.open(r'D:/computervisionpicture/left.jpg').convert('L'), 'f')
im_r = array(Image.open(r'D:/computervisionpicture/right.jpg').convert('L'),'f')
# 开始偏移,并设置步长
steps = 12
start = 4
# ncc 的宽度
wid = 12
res = plane_sweep_ncc(im_l,im_r,start,steps,wid)
import scipy.misc
scipy.misc.imsave('D:/computervisionpicture/depth.jpg',res)
show()
3.实验结果
实验用的图片:
实验结果(不同窗口值下的结果):
窗口值为2时
窗口值为3时
窗口值为6时
窗口值为9时
窗口值为12时
把图片尺寸改大一点,增加图片精度后的结果:
窗口值为12时
窗口值为9时
窗口值为6时
窗口值为3时
窗口值为2时
小结:
①自己的图片拍的是比较平面化,左右视差不明显,所以整体特征没有清晰地展现出来
②视差图特别复杂,是因为光线明亮变化区域很大,匹配的时候出现了许多错误匹配
③当窗口值为2或3比较小时,视差图模糊,是因为窗口值太小,里面的像素点也就越少,这样就会使匹配不准确,造成较大误差
④当窗口值为6或9时,视差图变得清晰,窗口变大,里面的数据变多,匹配点也会更加精确
⑤当窗口值为12时,结果图像又会丢失一些边缘化信息,这是因为窗口过大,虽然里面的像素点会更多,但是相邻两个匹配点的窗口的中的值会出现重复,导致丢失了一些原本的信息。
五、实验小结
①小尺寸的窗口:精度更高、细节更丰富,匹配代价低,在弱纹理区域比较容易出现错误匹配但是对噪声特别敏感;
②大尺寸的窗口:精度不高、细节不够,匹配代价过高,在复杂的纹理区域容易出现错误匹配,但是对噪声比较鲁棒
③改变图片尺寸,增大图片精度,在一定程度上有利于窗口匹配,得到的视差图也会相对更清晰,所以图片大小要适宜。
④不同尺寸的滑动窗口对深度图计算结果的影响,虽然基于滑动窗口的匹配方法可以计算得到深度图,但是这种方法匹配效果并不好,而且由于要逐点进行滑动窗口匹配,计算效率也很低。
⑤NCC算法由于计算量偏大,所以运行起来还是比较耗时间的。
立体图像——NCC匹配方法计算视差图相关推荐
- 2019-9-29 opencv摄像机标定与三维重构4-Depth Map from Stereo Images立体图像中的深度图(视差图)
官网参见https://docs.opencv.org/3.4.1/dd/d53/tutorial_py_depthmap.html 上一节中,我们学习了极线约束的概念和相关术语.主要包含:如果我们有 ...
- python计算机视觉编程——立体图像之计算视差图
计算视差图 一.立体图像 1.1概念 1.2关于图像配准算法 二.立体重建之计算视差图 2.1归一化及算法概念 2.2匹配流程 三.实验测试 3.1实验要求 3.2实验代码 3.3实验结果分析 3.4 ...
- 计算机视觉——计算视差图
计算视差图 1. 立体视差 2. 极线矫正 3. 归一化互相关(NCC) 4 . 计算视差图的步骤 5. 实验过程 5.1 实验代码 5.2 实验结果及分析 5.2.1 视差图计算结果 5.2.2 不 ...
- ITK:从二进制图像中的对象计算距离图
ITK:从二进制图像中的对象计算距离图 内容提要 C++实现代码 内容提要 从二进制图像中的对象计算距离图 C++实现代码 #include "itkImage.h" #inclu ...
- python 深度 视差 计算_NCC视差匹配计算视差图(python)
目录 一.视差计算原理 1.1 NCC视差匹配方法 1.2 双目立体匹配 二.实验内容 2.1 不同窗口对匹配结果的影响 2.2 分析 三.实验代码 四.总结 一.视差计算原理 1.1 NCC视差匹配 ...
- 归一化互相关(NCC)计算视差图
文章目录 一.NCC 1.1 NCC原理 1.2 实现步骤 二.代码实现 2.1 相关代码 2.2 运行结果 2.2.1 修改窗口大小的影响 2.2.1.1 窗口大小win=3时 2.2.1.2 窗口 ...
- 从两幅图像的匹配点计算焦距f
从网络中找到两种计算焦距的方法 1.两幅图像的单应矩阵H计算焦距f(取自<全景图拼接>opencv代码) //从两幅图像的单应矩阵H计算焦距f. void focalsFromHomogr ...
- 计算机视觉——立体图像
文章目录 立体图像 一.计算视差图 二.双目立体匹配 三.NCC算法实验 3.1实验要求 3.2实验准备 3.3实验代码 3.4实验结果及分析 四.实验总结 立体图像 一个多视图成像的特殊例子是立体视 ...
- matlab获取视差图,Matlab生成视差图
[实例简介] 双目视觉,根据块匹配方法的视差图生成.依据Matlab生成视差图. Dbasic= zeros(size(leftI),'single') disparity range 15; Sel ...
最新文章
- Day7 面向对象和类的介绍
- rust(28)-具名结构体
- 减少到处衍生的实体类
- 20220202--CTF刷题MISC方向--第7题--编码
- Git之回退已经提交到远程仓库的代码(已经push的代码)
- 获取文件夹下的文件名并存入txt中
- 1024电商项目的邮箱验证码与图形验证码功能模块
- 画流程图activiti流程图_干货!小白也能一天画100张高逼格流程图
- Mutex和上厕所居然有这么多异曲同工之妙
- HDFS基本原理及数据存取实战
- 经典浪漫的爱情英语妙语
- FarPoint表格数字框中小数点位数的设置
- 如何用Lucene实现实时搜索--Tripod
- java 最简单一个家庭支付收入项目(实用于刚入门的小伙伴)
- 2018年通信工程师中级传输与接入无线专业实务真题
- 坐标变换(1)—向量和坐标系
- 9.2 iptables主机防火墙
- unity导入Standard Assets出现错误
- delphi7及控件安装
- 09 模型的增删查改《ThinkPHP6 入门到电商实战》
热门文章
- 那些前端的特效(装哈哈神器)
- python对股票的基本面进行分析_基本面分析python
- linux下管道命令,linux之管道命令
- 清华源和torch源
- 计算机应用基础搜题答案,2017计算机应用基础试题及答案
- Windows 批量删除文件简单方法
- QMS-云质-质量管理软件-西门子MES里面有质量模块,为什么还要收购质量软件-IBS?
- userdel: user xxx is currently used by process xxx 已解决
- Endnote 参考文献输出格式GB/T 7714的Style定义写法
- 米筐开源量化框架 RQalpha 安装使用