归一化相关系数NCC
文章目录
- 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相关推荐
- 模板匹配—归一化相关系数匹配算法
python代码: 1 import numpy as np2 import cv23 4 def EM(pModel, width, height):5 sum = np.double(0.0)6 ...
- 归一化互相关(NCC)计算视差图
文章目录 一.NCC 1.1 NCC原理 1.2 实现步骤 二.代码实现 2.1 相关代码 2.2 运行结果 2.2.1 修改窗口大小的影响 2.2.1.1 窗口大小win=3时 2.2.1.2 窗口 ...
- matlab归一化相关系数,归一化相关系数
对两幅图像进行相似度的衡量,除了用眼睛观察的方法外,我们可以更加精确地用数据来客观的评估归一化,归一化的相关系数(NC)提供了度量工具.其计算公式如下: MATLAB代码如下所示: function ...
- normalized correlation 归一化相关系数
这个系数和欧式距离.皮尔逊相关系数等类似,度量了统计学中两个随机变量(随机变量)的相关距离. 1 定义 我们来看一下它的定义式: 2 应用 2.1 衡量图片相关度 NCC是一种基于统计学计算两组样本数 ...
- 立体匹配|Stereo Matching
文章目录 背景概念 对极几何 视觉模型 基本流程 匹配代价计算 代价聚合 视差计算 视差优化 References 立体匹配也称 视差估计. 双目深度估计 输入:一对在统一时刻捕捉的,经过 极线校正 ...
- python 立体匹配_双目立体匹配步骤详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源: https://blog.csdn.net/rs_lys/ ...
- 医学影像配准 NCC Loss
医学影像配准 NCC Loss 1.归一化交叉相关Normalization cross correlation (NCC) 2.图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解 2.1 互 ...
- 图像处理之积分图应用三(基于NCC快速相似度匹配算法)
from:https://blog.csdn.net/jia20003/article/details/53021614 图像处理之积分图应用三(基于NCC快速相似度匹配算法) 基于Normalize ...
- 【计算机视觉】NCC匹配算法
NCC匹配算法 1.NCC匹配实验原理 1.1 NCC的基础概念 1.2 NCC算法的基本原理 1.3 相关的数学知识 1.4 双目立体匹配流程 1.4 NCC的特点 2.NCC算法实现视差图匹配实验 ...
最新文章
- android上line-height的问题
- SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)...
- matlab 转换 tfrecord,训练数据集与TFRecord互相转换的两种方式
- acer p245 linux换win7,宏碁Acer笔记本预装Win8改Win7设置教程
- 万亿市场下,电商代运营还需另求“第二曲线”
- ReentrantLock锁
- Android访问网络系列之--访问图片
- NG客制项目下的I18n国际化标准方案
- CSS彻底研究(3) - 浮动,定位
- 课程学习评价系统设计与实现
- 上海悠悠python培训视频教程
- 文献综述格式及写作技巧
- 从0开发游戏引擎之引擎Win32平台的Platform类实现
- windows搭建RN环境
- Office-页码全为0的原因及解决方法
- linux 设置自动退出时间,linux配置超时不操作自动退出登录TMOUT
- matlab中duration是什么意思,C++ duration(STL duration)模板用法详解
- 手机短信删除了怎么恢复?简单方法推荐
- “稳”字当头 | 陆金所控股持续聚焦小微信贷,深耕财富管理,一季度业绩稳健增长
- 现代OpenGL学习笔记二:第一个三角形
热门文章
- IDEA怎么开两个编辑窗口
- HTTP请求一张图片,转为流返回
- 在Javascript 中的Base64加密,支持中文加密及emoji表情的unicode编码的base64加密
- 携程显示连接不到服务器,携程:网络故障由员工错误操作导致
- 彻底了解DVD:从入门到精通(二)[转]
- MySql数据查重、去重的实现
- java基础之TreeMap
- EEPROM, NAND FLASH, NOR FLASH
- 人力资源数据分析师前景_人力资源数据分析师——大数据下的精英岗位
- 理解vue-admin-template模板,连接后端改造登陆功能