PatchMatch小详解
最近发了两片patch match的,其实自己也是有一些一知半解的,找了一篇不知道谁的大论文看了看,又回顾了一下,下面贴我的笔记。
The PatchMatch Algorithm
patchmatch一开始被应用于结构化的图片编辑。
- 是一个随机性的算法。
 - 致力于找到近似的最近领匹配。
 
patchmatch的假设:
- 邻近的像素有一样的模型参数\(p\in R^n\)
 - 有一个cost function可以计算给定一个\(p\)的代价
 
PatchMatch三大步:
- 随机初始化
 - 传播
 - 随机搜索
 
PatchMatch for Motion Estimation
因为有些像素可能会被遮挡,我们需要舍弃他们的估计。有一种方法叫forward-backward consistency check.
这个移动也不能是无限大的,在这个论文里如果大于400像素我们就舍弃。
Motion Models
有各种translation motion model.
- The Translational Motion Model
 
\[
\begin{aligned} x_{2} &=x_{1}+b_{1} \\ y_{2} &=y_{1}+b_{2} \end{aligned}
\]
- The Affine Motion Model
 
\[
\begin{aligned} x_{2} &=a_{1} x_{1}+a_{2} y_{1}+b_{1} \\ y_{2} &=a_{3} x_{1}+a_{4} y_{1}+b_{2} \end{aligned}
\]
- The Projective Motion Model
 
也就是个Homography.
\[
\omega \left( \begin{array}{c}{x_{2}} \\ {y_{2}} \\ {1}\end{array}\right)=\left( \begin{array}{lll}{h_{1}} & {h_{2}} & {h_{3}} \\ {h_{4}} & {h_{5}} & {h_{6}} \\ {h_{7}} & {h_{8}} & {h_{9}}\end{array}\right) \left( \begin{array}{l}{x_{1}} \\ {y_{1}} \\ {1}\end{array}\right)
\]
也可以简化一下:
\[
\begin{aligned} x_{2} &=\frac{h_{1} x_{1}+h_{2} y_{1}+h_{3}}{h_{7} x_{1}+h_{8} y_{1}+h_{9}} \\ y_{2} &=\frac{h_{4} x_{1}+h_{5} y_{1}+h_{6}}{h_{7} x_{1}+h_{8} y_{1}+h_{9}} \end{aligned}
\]
- The Quadratic Motion Model
 
\[
\begin{array}{l}{x_{2}-x_{1}=a_{1}+a_{2} x_{1}+a_{3} y_{1}+a_{7} x_{1}^{2}+a_{8} x_{1} y_{1}} \\ {y_{2}-y_{1}=a_{4}+a_{5} x_{1}+a_{6} y_{1}+a_{7} x_{1} y_{1}+a_{8} y_{1}^{2}}\end{array}
\]
PatchMatch for Stereo Reconstruction
有几个模型,比如:eipipolar constraint model, projective planar model, the slanted plane model.
Pipeline
有4个步骤:
- camera calibration
 
相机标定是拿内外参,也就是内参和相机位姿都要知道。
- image rectification
 
简化下一步骤,因为只需要在横坐标上搜索。
disparity estimation (aka stereo matching)
depth reconstruction
有了相机内外参和dispairty,深度很容易估计。

\[Z=\frac{f \cdot b}{x_{1}-x_{2}}, Y=\frac{y_{1} \cdot Z}{f}, X=\frac{x_{1} \cdot Z}{f}\]
这里\(b\)是baseline, disparity \(d=x_1-x_2\),所以\((X, Y, Z)\)都和disparity成倒数。
Models for Stereo Matching
- The Epipolar Constraint Model
 
\[
\tilde{\mathbf{x}}_{2}^{\top} \mathbf{F} \tilde{\mathbf{x}}_{1}=0
\]
当只有x轴上的移动,也就是在rectified image的时候,\(F\)会退化成如下:
\[
\mathbf{F}=\left[ \begin{array}{ccc}{0} & {0} & {0} \\ {0} & {0} & {-1} \\ {0} & {1} & {0}\end{array}\right]
\]
这样的话,\(y_2=y_1\)。
- The Projective Planar Model
 
\[
\begin{aligned} x_{2} &=\frac{h_{1} x_{1}+h_{2} y_{1}+h_{3}}{h_{4} x_{1}+h_{5} y_{1}+h_{6}} \\ y_{2} &=y_{1} \end{aligned}
\]
- The Slanted Plane Model
 
这个模型假设\((x, y, d)\)和一个法向量\((n_x, n_y, n_z)\)在一个3D平面上,这里\(d\)表示视差。一个穿过点\(\left(x_{1}, y_{1}, d_{1}\right)\)的平面方程如下:
\[
n_{x}\left(x-x_{1}\right)+n_{y}\left(y-y_{1}\right)+n_{z}\left(d-d_{1}\right)=0
\]
这个公式其实挺容易理解的,从这个点发射的向量如果和法向量乘积是0,那就在这个平面上。
那么根据上式,视差的表达式也可以很容易推导出来:
\[
d=\frac{n_{x} x_{1}+n_{y} y_{1}+n_{z} d_{1}}{n_{z}}-\frac{n_{x}}{n_{z}} x-\frac{n_{y}}{n_{z}} y
\]
代价函数 Cost Function
公式:
\[
\begin{aligned} \mathcal{C}\left(\mathbf{p} ; x_{1}, y_{1}\right)=\sum_{\delta_{x}=-m}^{m} \sum_{\delta_{y}=-m}^{m}\left(\mathcal{W}\left(f\left(x_{1}, y_{1}\right), f\left(x_{1}+\delta_{x}, y_{1}+\delta_{y}\right)\right)\right.\\ \cdot & \rho\left(f\left(x_{1}+\delta_{x}, y_{1}+\delta_{y}\right), g\left(x_{1}+\delta_{x}-\mathcal{D}\left(\mathbf{p} ; x_{1}+\delta_{x}, y_{1}+\delta_{y}\right), y_{1}+\delta_{y}\right)\right) ) \end{aligned}
\]
和公式:
\[
\begin{aligned} \mathcal{C}\left(\mathbf{p} ; x_{2}, y_{2}\right)=\sum_{\delta_{x}=-m}^{m} \sum_{\delta_{y}=-m}^{m}\left(\mathcal{W}\left(g\left(x_{2}, y_{2}\right), g\left(x_{2}+\delta_{x}, y_{2}+\delta_{y}\right)\right)\right.\\ & \cdot \rho\left(g\left(x_{2}+\delta_{x}, y_{2}+\delta_{y}\right), f\left(x_{2}+\delta_{x}+\mathcal{D}\left(\mathbf{p} ; x_{2}+\delta_{x}, y_{2}+\delta_{y}\right), y_{2}+\delta_{y}\right)\right) ) \end{aligned}
\]
这里\(m\)是patch的大小,而\(\mathcal{W}\)是一个权重函数:
\[
\mathcal{W}\left(f(x, y), f\left(x^{\prime}, y^{\prime}\right)\right)=\exp \left(-\frac{\left\|f(x, y)-f\left(x^{\prime}, y^{\prime}\right)\right\|_{1}}{\gamma}\right)
\]
而\(\rho(.)\)函数计算像素\(f(x,y)\)和它的投影点\(g(x-d,y)\)的不相似度:
\[
\begin{aligned} \rho(f(x, y), g(x-d, y))=&(1-\beta) \cdot \min \left(\|f(x, y)-g(x-d, y)\|_{1}, \tau_{c o l}\right) \\ &+\beta \cdot \min \left(\|\nabla f(x, y)-\nabla g(x-d, y)\|_{1}, \tau_{g r a d}\right) \end{aligned}
\]
这里\(\beta\)就是衡量两个不同项的权重参数,\(\nabla\)是计算梯度的负号。第一项是在RGB空间里的差异,这里第二项计算的是灰度梯度的绝对值差异。
View Propagation
除了spatial propagation(假设邻近的像素有相似的模型参数),有一个人还加了另一个假设,认为说对应点的邻近也有相似的模型参数。
Post-Processing
有三个步骤: 外点剔除,invalid pixels handling和weighted median filter。
- Outlier Removal: 用forward-backward consistency check来移除被遮挡的点。
 - Invalid Pixels Handling: 在移除了遮挡的点以后,我们在这个像素的左右各找一个最近的点,然后根据邻近点的参数计算视差,然后选一个小的视差来作为它的模型参数。
 - Weighted Median Filter: 是最后作为refinement的一步,这个只会对在forward-backward consistency check失败的点来操作。
 
PatchMatch小详解的更多相关文章
- Android 之窗口小部件详解--App Widget
		
Android 之窗口小部件详解--App Widget 版本号 说明 作者 日期 1.0 添加App Widge介绍和示例 Sky Wang 2013/06/27 1 App ...
 - 小甲鱼PE详解之基址重定位详解(PE详解10)
		
今天有一个朋友发短消息问我说“老师,为什么PE的格式要讲的这么这么细,这可不是一般的系哦”.其实之所以将PE结构放在解密系列继基础篇之后讲并且尽可能细致的讲,不是因为小甲鱼没事找事做,主要原因是因为P ...
 - 小甲鱼PE详解之输入表(导出表)详解(PE详解09)
		
小甲鱼PE详解之输出表(导出表)详解(PE详解09) 当PE 文件被执行的时候,Windows 加载器将文件装入内存并将导入表(Export Table) 登记的动态链接库(一般是DLL 格式)文件一 ...
 - 小甲鱼PE详解之区块描述、对齐值以及RVA详解(PE详解06)
		
各种区块的描述: 很多朋友喜欢听小甲鱼的PE详解,因为他们觉得课堂上老师讲解的都是略略带过,绕得大家云里雾里~刚好小甲鱼文采也没课堂上的教授讲的那么好,只能以比较通俗的话语来给大家描述~ 通常,区块中 ...
 - Spark小课堂Week6 启动日志详解
		
Spark小课堂Week6 启动日志详解 作为分布式系统,Spark程序是非常难以使用传统方法来进行调试的,所以我们主要的武器是日志,今天会对启动日志进行一下详解. 日志详解 今天主要遍历下Strea ...
 - Android 之窗口小部件详解(三)  部分转载
		
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
 - 微信小程序开发之详解生命周期方法
		
生命周期是指一个小程序从创建到销毁的一系列过程 在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面 先来看一张小程序项目结构 从上图可以看出,根目录下面有包含了app.js ...
 - [原创] 分享我们自己搭建的微信小程序开发框架——wframe及设计思想详解
		
wframe不是控件库,也不是UI库,她是一个微信小程序面向对象编程框架,代码只有几百行.她的主要功能是规范小程序项目的文件结构.规范应用程序初始化.规范页面加载及授权管理的框架,当然,wframe也 ...
 - 详解微信小程序开发(项目从零开始)
		
一.序 微信小程序,估计大家都不陌生,现在应用场景特别多.今天就系统的介绍一下小程序开发.注意,这里只从项目代码上做解析,不涉及小程序如何申请.打包.发布的东西.(这些跟着微信官方文档的流程走就好). ...
 
随机推荐
- VS报错,Metadata file 'xxx.dll' could not be found
			
错误提示“Metadata file 'xxx.dll' could not be found”步骤如下:1.右键单击解决方案,然后单击“属性”.2.单击左侧的配置.3.确保选中了它找不到的项目的“生 ...
 - C#反射_两合并更新实体
			
#region 更新实体模型 /// <summary> /// 更新实体模型 /// </summary> /// <typeparam name="T&qu ...
 - 《Netty 权威指南(第2 版)》目录
			
图书简介:<Netty 权威指南(第2 版)>是异步非阻塞通信领域的经典之作,基于最新版本的Netty 5.0 编写,是国内很难得一见的深入介绍Netty 原理和架构的书籍,也是作者多年实 ...
 - PIE SDK栅格矢量化算法
			
1.算法功能简介 栅格数据矢量化较为复杂,如果由一幅扫描的数字化地图来建立矢量数据库,则需要经过数字图象处理,如边缘增强.细化.二值化.特征提取及模式识别才能获得矢量数据.人们通常将多色地图分色后逐个 ...
 - lift提升图
			
Lift图衡量的是,与不利用模型相比,模型的预测能力“变好”了多少,lift(提升指数)越大,模型的运行效果越好. TP:划一个阈值后的正样本. P:总体的正样本. 在模型评估中,我们常用到增益/提升 ...
 - vue 强制刷新 demo 神器
			
this.$forceUpdate() /*关键句,强制更新dom*/
 - tkiner将字典用在单选上
			
from tkinter import * def printSelection(): print(cities[int(var.get())]) lab.config(text="你选择了 ...
 - error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
			
出现如下错误: error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 解决办法:
 - javascript之DOM(一节点类型Node)
			
DOM(Document Object Model)是针对HTML和XML文档的一个API.DOM描述的是一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分.起源于DHML,现为W3C的推 ...
 - Python--RE--?
			
?在re中默认匹配前一个字符0次或者1次 比如: aal? 默认匹配aal,或者aa 即整体匹配前一个字符串,但是可以舍弃最近的一个字符或者不舍弃 re模块 常用正则表达式符号 '.' 默认匹配 ...