归一化互相关(NCC)计算视差图
文章目录
- 一、NCC
- 1.1 NCC原理
- 1.2 实现步骤
- 二、代码实现
- 2.1 相关代码
- 2.2 运行结果
- 2.2.1 修改窗口大小的影响
- 2.2.1.1 窗口大小win=3时
- 2.2.1.2 窗口大小win=5时
- 2.2.2.3 窗口大小win=7时
- 2.2.1.4 窗口大小win=9时
- 2.2.1.5 窗口大小win=11时
- 2.2.2 小结
- 2.2.3 修改步长大小的影响
- 2.2.3.1 步长(step)为12时
- 2.2.3.2 步长(step)为40时
- 2.2.4 小结
一、NCC
1.1 NCC原理
- NCC是用来描述两个目标的相关程度的,也就是说可以用来刻画目标间的相似性。一般NCC也会被用来进行图像匹配,即在一个图像中搜索与一小块已知区域的NCC最高的区域作为对应匹配,然后对准整幅图像。
- 计算公式:
1.2 实现步骤
(1)采集图像:通过标定好的双目相机采集图像,当然也可以用两个单目相机来组合成双目相机。
(2)极线校正:校正的目的是使两帧图像极线处于水平方向,或者说是使两帧图像的光心处于同一水平线上。通过校正极线可以方便后续的NCC操作。
(3)特征匹配:右视图中与左视图待测像素同一水平线上相关性最高的即为最优匹配。完成匹配后,我们需要记录其视差d即待测像素水平方向xl与匹配像素水平方向xr之间的差值d=xr−xl,最终可以得到一个与原始图像尺寸相同的视差图D。
(4)深度恢复:通过上述匹配结果得到的视差图D,可以利用相似三角形反推出以左视图为参考系的深度图。计算原理如下图所示:
二、代码实现
2.1 相关代码
# -*- 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))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'C:\image\im3.png').convert('L'), 'f')
im_r = array(Image.open(r'C:\image\im4.png').convert('L'),'f')
# 开始偏移,并设置步长
steps = 40
start = 4
# ncc 的宽度
wid = 9
res = plane_sweep_ncc(im_l,im_r,start,steps,wid)
import scipy.misc
scipy.misc.imsave('depth.png',res)
show()
- 用到的图片:
2.2 运行结果
2.2.1 修改窗口大小的影响
2.2.1.1 窗口大小win=3时
2.2.1.2 窗口大小win=5时
2.2.2.3 窗口大小win=7时
2.2.1.4 窗口大小win=9时
2.2.1.5 窗口大小win=11时
2.2.2 小结
1、匹配窗口较小时会出现很多不连续的点,误匹配较多;而窗口较大时,图像边缘特征变得很模糊。在该实验中我们关注较多的是深度图中目标的位置特征,而对其边缘特征要求不是很精确,所以9x9的窗口已经可以满足要求。
2、从不同窗口大小运行得到的结果对比可以得出:当窗口越小,得到的视差图中的细节越多但存在的噪声也越多。然而随着窗口逐渐变大,所得到的视差图稳健性越高,细节越少。
3、对比在图像中轮廓明显和不明显的物品:在窗口较小时,对图像中平滑的物体的位置处理较粗糙,视差图中该种物体的位置有较多亮点且分辨不出大致形状,比如说图像中左边部分的两种画。但轮廓较明显的物体的边缘部分,比如说图像中的桌子以及玩偶,它们的形状轮廓有大致的体现。
2.2.3 修改步长大小的影响
2.2.3.1 步长(step)为12时
2.2.3.2 步长(step)为40时
2.2.4 小结
从上述两幅视差图对比可知道,当步长越大时,视差图中的细节表现得越少但稳健性较高;当步长越小时,视差图中的细节较多且明显但稳健性低
归一化互相关(NCC)计算视差图相关推荐
- 立体图像——NCC匹配方法计算视差图
文章目录 一.什么是立体图像 二.以窗口代价计算视差的原理 三.归一化互相关(NCC)算法匹配原理 四.实验 1.实验要求 2.实验代码 3.实验结果 五.实验小结 一.什么是立体图像 一个多视图成像 ...
- 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 不 ...
- python 深度 视差 计算_NCC视差匹配计算视差图(python)
目录 一.视差计算原理 1.1 NCC视差匹配方法 1.2 双目立体匹配 二.实验内容 2.1 不同窗口对匹配结果的影响 2.2 分析 三.实验代码 四.总结 一.视差计算原理 1.1 NCC视差匹配 ...
- 计算机视觉——计算视差
一.实验原理 1.1 双目视差与深度距离关系推导详解 相机成像的模型如下图所示: P为空间中的点,P1和P2是点P在左右像平面上的成像点,f是焦距,OR和OT是左右相机的光心.由下图可见左右两个相机的 ...
- 双目测距 视差图(不完善)
博主INBC 删掉点云之后 效果 # -*- coding: utf-8 -*- import cv2 import numpy as np import stereoconfig_040_2 # 导 ...
- 双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,)
二郎也比较忙,在某大场工作,有时候没有时间回复. 如果希望二郎尽快帮忙,可以将代码,数据和问题发给二郎,谢谢大家理解. glwang20@mails.jlu.edu.cn 不过还是希望大家自己要好好研 ...
- 双目立体匹配——归一化互相关(NCC)
归一化相关性,normalization cross-correlation,因此简称NCC,下文中笔者将用NCC来代替这冗长的名称. NCC,顾名思义,就是用于归一化待匹配目标之间的相关程度,注意这 ...
- 图像匹配—NCC算法,即归一化互相关匹配
一.NCC的基础概念 NCC(normalized cross correlation)算法,归一化互相关匹配法,是基于图像灰度信息的匹配方法. 二.NCC算法定义为: 三.代码(利用NCC的密集匹配 ...
最新文章
- 报错引发的版本对应——tensorflow+keras+python版本对应(全)
- ubuntu 安装sun-java5-jdk
- ITK:线性强度变换
- 5分钟搞定AlertManager接入短信、语音等10+种通知渠道
- 最简单的php导出excel文件方法
- python调用按键精灵插件_按键精灵 插件命令 重中之重务必要记住怎么操作
- SAP 财务本地化-账结法
- python 时间曲线相似度计算_时间序列相似性度量综述
- 《东周列国志》第十二回 卫宣公筑台纳媳 高渠弥乘间易君
- python正则表达式爬取链家租房信息
- BNN网络量化与8bit量化之间关系
- thinkpadE430c加装固态硬盘小记
- 重拾Java基础知识:网络编程
- CommandLineRunner
- 定制linux 安装光盘
- canvas制作印章
- java抽象类实例化_抽象类能实例化吗
- 我的大学(学习-上)
- Linux: fPIC与 pie 区别
- MSP430C语言编程技巧,如何提高MSP430 C语言编程效率