【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换

本文主要是介绍【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理论恒叨系列

【理论恒叨】【立体匹配系列】经典SGM:(1)匹配代价计算之互信息(MI)
【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换
【理论恒叨】【立体匹配系列】经典SGM:(3)代价聚合(Cost Aggregation)
【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化

【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换

  上篇博客中,我们介绍了基于互信息的代价计算方法,由于基于互信息的匹配代价计算由于需要初始视差值,所以需要通过分层迭代的方式得到较为准确的匹配代价值,而且概率分布计算稍显复杂,这导致代价计算的效率并不高。学者Zabih和Woodfill 1 提出的基于Census变换法也被广泛用于匹配代价计算。Census变换是使用像素邻域内的局部灰度差异将像素灰度转换为比特串,思路非常简单,通过将邻域窗口(窗口大小为 n × m n×m n×m n n n m m m都为奇数)内的像素灰度值与窗口中心像素的灰度值进行比较,将比较得到的布尔值映射到一个比特串中,最后用比特串的值作为中心像素的Census变换值 C s C_s Cs,如公式1所示:

式1

其中, n ′ n' n m ′ m' m分别为不大于 n n n m m m的一半的最大整数, ⊕ ⊕ 为比特位的逐位连接运算, ξ ξ ξ运算则由公式2定义:

式2

基于Census变换的匹配代价计算方法是计算左右影像对应的两个像素的Census变换值的汉明(Hamming)距离,即

式3

  Hamming距离即两个比特串的对应位不相同的数量,计算方法为将两个比特串进行亦或运算,再统计亦或运算结果的比特位中不为1的个数。

  基于Census变换的匹配代价计算方法如图1所示,

图1 汉明距离示意图

  从图1可以看出,Census变换对整体的明暗变化并不敏感,因为是比较的相对灰度关系,所以即使左右影像亮度不一致,也能得到较好的匹配效果。

  Census相比互信息还具有并行度高的优点,因为Census变换值是局部窗口运算,所以每个像素可以独立运算,这个特性让其可以很好的设计多线程并行计算模型,无论是CPU并行还是GPU并行都能达到非常高的并行效率。

  在实际匹配过程中,简单的执行匹配代价计算并不能得到高质量的视差图,必须经过代价聚合步骤,聚合后的代价能够更准确地反应匹配相似度,下篇博客中,将为大家详解SGM的代价聚合步骤,查看请点击 >> link

附:
计算Census值及Hamming的代码:
Census值

uint8 gray_center= img_data[image_y *img_width + image_x];		// 中心像素值
// 遍历大小为2csh*2csw的窗口内邻域像素,逐一比较像素值与中心像素值的的大小,计算census值
uint32 census_value = 0u;
for (sint32 i = -csh; i <= csh; i++) {for (sint32 j = -csw; j <= csw; j++) {census_value <<= 1;uint8 gray = img_data[(image_y + i)*img_width + image_x + j];if (gray < gray_center) {census_value += 1;}}
}
census[image_y *img_width + image_x] = census_value;		// 中心像素的census值

Hamming距离

// unsigned to 32bit
//计算hamming距离
uint32 hamDist32(const uint32& x, const uint32& y)
{uint32 dist = 0, val = x ^ y;// Count the number of set bitswhile (val){++dist;val &= val - 1;}return dist;
}
码上教学系列

【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(1)框架与类设计
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(2)代价计算
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(3)代价聚合
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(4)代价聚合2
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(5)视差优化
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(6)视差填充
【恒叨立码】【码上实战】【立体匹配系列】经典SGM:(7)弱纹理优化

完整代码已发布于Github开源项目:Github/SemiGlobalMatching,欢迎免费下载

博主简介:
Ethan Li 李迎松
武汉大学 摄影测量与遥感专业博士

主方向立体匹配、三维重建

2019年获测绘科技进步一等奖(省部级)

爱三维,爱分享,爱开源
GitHub: https://github.com/ethan-li-coding
邮箱:ethan.li.whu@gmail.com

个人微信:

欢迎交流!

喜欢博主的文章不妨关注一下博主的博客,感谢!
博客主页:https://blog.csdn.net/rs_lys


  1. ZABIH R, WOODFILL J. Non-parametric local transforms for computing visual correspondence[M]. 1994: 151-158. ↩︎

这篇关于【理论恒叨】【立体匹配系列】经典SGM:(2)匹配代价计算之Census变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228849

相关文章

详解nginx 中location和 proxy_pass的匹配规则

《详解nginx中location和proxy_pass的匹配规则》location是Nginx中用来匹配客户端请求URI的指令,决定如何处理特定路径的请求,它定义了请求的路由规则,后续的配置(如... 目录location 的作用语法示例:location /www.chinasem.cntestproxy

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

关于Gateway路由匹配规则解读

《关于Gateway路由匹配规则解读》本文详细介绍了SpringCloudGateway的路由匹配规则,包括基本概念、常用属性、实际应用以及注意事项,路由匹配规则决定了请求如何被转发到目标服务,是Ga... 目录Gateway路由匹配规则一、基本概念二、常用属性三、实际应用四、注意事项总结Gateway路由

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin