文章目录

  • 1、原理
  • 2、实验
    • 2.1 图像源
    • 2.2 实现
      • 2.2.1 代码
      • 2.2.2 运行结果
    • 2.3 参数wid改变时
  • 3、小结(只分析NCC法)
  • 4、问题及解决方法

1、原理

左图为图像I1{I_1}I1​,右图为图像I2{I_2}I2​。图像I1{I_1}I1​中蓝色方框表示待匹配像素坐标为(px,py)({p_x},{p_y})(px​,py​),图像I2{I_2}I2​中蓝色方框表示待匹配像素坐标为(px,py)({p_x},{p_y})(px​,py​),绿色方框表示待匹配像素坐标为(px+d,py)({p_x+d},{p_y})(px​+d,py​)。

那么定义:
ncc(I1,I2)=∑x(I1(x)−u1)(I2(x)−u2)∑x(I1(x)−u1)2∑x(I2(x)−u2)2ncc({I_1},{I_2}) = \frac{{\sum\nolimits_x {({I_1}(x) - {u_1})({I_2}(x) - {u_2})} }}{{\sqrt {\sum\nolimits_x {{{({I_1}(x) - {u_1})}^2}\sum\nolimits_x {{{({I_2}(x) - {u_2})}^2}} } } }}ncc(I1​,I2​)=∑x​(I1​(x)−u1​)2∑x​(I2​(x)−u2​)2​∑x​(I1​(x)−u1​)(I2​(x)−u2​)​
其中:u1{u_1}u1​、u2{u_2}u2​分别表示图像I1{I_1}I1​、I2{I_2}I2​的均值,x为图像内部所有的像素点。

u1{u_1}u1​、u2{u_2}u2​的作用:减去均值相当于减去曝光参数的差异,防止曝光参数不一样导致的一幅图像整体偏暗,一幅图像整体偏亮的情况。

若ncc = -1,则表示两个匹配窗口完全不相关;相反,若ncc = 1时,表示两个匹配窗口相关程度非常高。

2、实验

2.1 图像源

根据书上给的链接:图像下载
这里用的图像是:Cones->cones-ppm-2.zip中的im2.ppm和im6.ppm

2.2 实现

2.2.1 代码

以书上代码为基础,自己再进行部分修改。

# -*- coding: utf-8
from PIL import Image
from scipy import ndimage
import scipy.misc
import numpy as np
np.seterr(divide='ignore', invalid='ignore')
import matplotlib.pyplot as pltdef plane_sweep_ncc(im_l,im_r,start,steps,wid):""" 使用归一化的互相关计算视差图像该函数返回每个像素的最佳视差"""m, n = im_l.shape# 保存不同求和值的数组mean_l = np.zeros((m, n))mean_r = np.zeros((m, n))s = np.zeros((m, n))s_l = np.zeros((m, n))s_r = np.zeros((m, n))# 保存深度平面的数组dmaps = np.zeros((m, n, steps))# 计算图像块的平均值ndimage.filters.uniform_filter(im_l, wid, mean_l)ndimage.filters.uniform_filter(im_r, wid, mean_r)# 归一化图像norm_l = im_l - mean_lnorm_r = im_r - mean_r# 尝试不同的视差for displ in range(steps):# 将左边图像移动到右边,计算加和ndimage.filters.uniform_filter(np.roll(norm_l, -displ - start) * norm_r, wid, s)  # 和归一化ndimage.filters.uniform_filter(np.roll(norm_l, -displ - start) * np.roll(norm_l, -displ - start), wid, s_l)ndimage.filters.uniform_filter(norm_r * norm_r, wid, s_r)  # 和反归一化# 保存 ncc 的分数dmaps[:, :, displ] = s / np.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 = np.zeros((m, n))mean_r = np.zeros((m, n))s = np.zeros((m, n))s_l = np.zeros((m, n))s_r = np.zeros((m, n))# 保存深度平面的数组dmaps = np.zeros((m, n, steps))# 计算平均值ndimage.filters.gaussian_filter(im_l, wid, 0, mean_l)ndimage.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):# 将左边图像移动到右边,计算加和ndimage.filters.gaussian_filter(np.roll(norm_l, -displ - start) * norm_r, wid, 0, s) # 和归一化ndimage.filters.gaussian_filter(np.roll(norm_l, -displ - start) * np.roll(norm_l, -displ - start), wid, 0, s_l)ndimage.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 = np.array(Image.open('cones/im2.ppm').convert('L'), 'f')
im_r = np.array(Image.open('cones/im6.ppm').convert('L'), 'f')
# 开始偏移,并设置步长
steps = 12
start = 4
# ncc 的宽度
# wid1:标准的 NCC 扫平面法重建的视差图的窗口大小
# wid2:高斯版本的视差图的窗口大小
wid1 = 9
res1 = plane_sweep_ncc(im_l, im_r, start, steps, wid1)
wid2 = 3
res2 = plane_sweep_gauss(im_l, im_r, start, steps, wid2)
scipy.misc.imsave('depth1.png', res1)
scipy.misc.imsave('depth2.png', res2)# 输出
plt.figure()
plt.subplot(2, 2, 1)
f1 = plt.imread('cones/im2.ppm')
plt.imshow(f1)
plt.subplot(2, 2, 2)
f2 = plt.imread('cones/im6.ppm')
plt.imshow(f2)
plt.subplot(2, 2, 3)
plt.imshow(res1)
plt.subplot(2, 2, 4)
plt.imshow(res2)
plt.show()

2.2.2 运行结果


发现运行结果中的两张视差图很奇怪,经同学提醒,是图片的原因。将图片换为下面两张:

再次运行,得到结果如下:
分析:上面一行图像所示为图像对(1.pbm和2.pbm),左下方图像是标准的 NCC 扫平面法重建的视差图,右下方是高斯版本的视差图。可以看到,与标准版本相比,高斯版本具有较少的噪声,但缺少很多细节信息。

2.3 参数wid改变时

在wid不同取值时,为了方便比较运行结果的不同我们将代码进行部分修改。
修改的部分代码:

plt.figure()
wid = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 输出标准的 NCC 扫平面法重建的视差图
for i in range(len(wid)):plt.subplot(3, 3, i+1)res1 = plane_sweep_ncc(im_l, im_r, start, steps, wid[i])plt.imshow(res1)
# 输出高斯版本的视差图
plt.figure()
for i in range(len(wid)):plt.subplot(3, 3, i + 1)res2 = plane_sweep_gauss(im_l, im_r, start, steps, wid[i])plt.imshow(res2)
plt.show()

运行结果:

(1)标准的 NCC 扫平面法重建的视差图

(2)高斯版本的视差图

分析:运行结果(1)、(2)中分别由九张图片构成,其窗口wid大小依次为1~9。

3、小结(只分析NCC法)

以下总结不包括wid=1的情况。

(1)

同个窗口大小,红色区域与黑色区域相比,亮度较高。可推测:同窗口大小,越靠近相机的物体越亮。

(2)


这九张图片窗口大小依次递增,可观察到:窗口越小,噪音越多,但细节信息更为丰富;窗口越大,细节信息更少,但轮廓更为明显。

4、问题及解决方法

问题1:

解决方法:将图片类型由jpg转为bmp或者pgm或者pbm。如果图片是由上面给的链接中下载得到的,则不会有此错误。
问题2:

解决方法:将sqrt()函数从numpy库中调用,而非从math库中调用。
问题3:

解决方法:在代码开头添加下面两行代码即可。

import numpy as np
np.seterr(divide=‘ignore’, invalid=‘ignore’)

归一化相关系数NCC相关推荐

  1. 模板匹配—归一化相关系数匹配算法

    python代码: 1 import numpy as np2 import cv23 4 def EM(pModel, width, height):5 sum = np.double(0.0)6 ...

  2. 归一化互相关(NCC)计算视差图

    文章目录 一.NCC 1.1 NCC原理 1.2 实现步骤 二.代码实现 2.1 相关代码 2.2 运行结果 2.2.1 修改窗口大小的影响 2.2.1.1 窗口大小win=3时 2.2.1.2 窗口 ...

  3. matlab归一化相关系数,归一化相关系数

    对两幅图像进行相似度的衡量,除了用眼睛观察的方法外,我们可以更加精确地用数据来客观的评估归一化,归一化的相关系数(NC)提供了度量工具.其计算公式如下: MATLAB代码如下所示: function ...

  4. normalized correlation 归一化相关系数

    这个系数和欧式距离.皮尔逊相关系数等类似,度量了统计学中两个随机变量(随机变量)的相关距离. 1 定义 我们来看一下它的定义式: 2 应用 2.1 衡量图片相关度 NCC是一种基于统计学计算两组样本数 ...

  5. 立体匹配|Stereo Matching

    文章目录 背景概念 对极几何 视觉模型 基本流程 匹配代价计算 代价聚合 视差计算 视差优化 References 立体匹配也称 视差估计. 双目深度估计 输入:一对在统一时刻捕捉的,经过 极线校正 ...

  6. python 立体匹配_双目立体匹配步骤详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源: https://blog.csdn.net/rs_lys/ ...

  7. 医学影像配准 NCC Loss

    医学影像配准 NCC Loss 1.归一化交叉相关Normalization cross correlation (NCC) 2.图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解 2.1 互 ...

  8. 图像处理之积分图应用三(基于NCC快速相似度匹配算法)

    from:https://blog.csdn.net/jia20003/article/details/53021614 图像处理之积分图应用三(基于NCC快速相似度匹配算法) 基于Normalize ...

  9. 【计算机视觉】NCC匹配算法

    NCC匹配算法 1.NCC匹配实验原理 1.1 NCC的基础概念 1.2 NCC算法的基本原理 1.3 相关的数学知识 1.4 双目立体匹配流程 1.4 NCC的特点 2.NCC算法实现视差图匹配实验 ...

最新文章

  1. android上line-height的问题
  2. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)...
  3. matlab 转换 tfrecord,训练数据集与TFRecord互相转换的两种方式
  4. acer p245 linux换win7,宏碁Acer笔记本预装Win8改Win7设置教程
  5. 万亿市场下,电商代运营还需另求“第二曲线”
  6. ReentrantLock锁
  7. Android访问网络系列之--访问图片
  8. NG客制项目下的I18n国际化标准方案
  9. CSS彻底研究(3) - 浮动,定位
  10. 课程学习评价系统设计与实现
  11. 上海悠悠python培训视频教程
  12. 文献综述格式及写作技巧
  13. 从0开发游戏引擎之引擎Win32平台的Platform类实现
  14. windows搭建RN环境
  15. Office-页码全为0的原因及解决方法
  16. linux 设置自动退出时间,linux配置超时不操作自动退出登录TMOUT
  17. matlab中duration是什么意思,C++ duration(STL duration)模板用法详解
  18. 手机短信删除了怎么恢复?简单方法推荐
  19. “稳”字当头 | 陆金所控股持续聚焦小微信贷,深耕财富管理,一季度业绩稳健增长
  20. 现代OpenGL学习笔记二:第一个三角形

热门文章

  1. IDEA怎么开两个编辑窗口
  2. HTTP请求一张图片,转为流返回
  3. 在Javascript 中的Base64加密,支持中文加密及emoji表情的unicode编码的base64加密
  4. 携程显示连接不到服务器,携程:网络故障由员工错误操作导致
  5. 彻底了解DVD:从入门到精通(二)[转]
  6. MySql数据查重、去重的实现
  7. java基础之TreeMap
  8. EEPROM, NAND FLASH, NOR FLASH
  9. 人力资源数据分析师前景_人力资源数据分析师——大数据下的精英岗位
  10. 理解vue-admin-template模板,连接后端改造登陆功能