计算机视觉中的动态规划与脉动阵列立体匹配
动态规划立体匹配
反向传播
在算法执行过程中,最终确定阶段是前向传播之后、反向传播之前的计算阶段。此阶段的目的是为反向传播选择一个起始点,该起始点必须是最终列中成本最小的节点。在三种参考系统中,起始点固定为三角形的最后一个点。对于左右参考系统,起始点是 𝜂(N - 1, 0),因为它们的指针矩阵配置相同;而中心参考系统可以从 𝜂(2N, 0) 或 𝜂(0, 0) 开始。
反向传播在最终确定状态完成后开始。从右参考系统的图像像素末端(左参考系统则相反)开始,依次读取指针数组中的指针,并将指针作为结果写入视差图。以下是用 Verilog HDL 表示的代码:
4:
begin: FINALIZATION
//DP finalization
state <= 5;
//go to the next state
pointer <= 0;
//starting pointer
count <= 0;
//reset counter
end
5:
begin: BACKWARD
//DP backward pass
‘ifdef LRC //LR reference
if (count <‘WIDTH)
begin
pointer <= queue[‘WIDTH - 1 - count][pointer];
//recursion
‘ifdef LEFT
res[id(0,count,0)] <= queue[‘WIDTH - 1 - count][pointer];
‘else
res[id(0,(‘WIDTH-count),-3)] <= queue[‘WIDTH-1-count][pointer];
‘endif
‘else
//center reference
if (count < 2*‘WIDTH + 1’b1)
begin
pointer <= queue[‘WIDTH*2 - count][pointer];
‘ifdef LEFT //center left reference
res[id(0,(‘WIDTH - ((count+pointer-1)>>1)),- 3)]
<= queue[2*‘WIDTH - count][pointer];
‘else //center right reference
pointer <= queue[‘WIDTH*2 - count][pointer];
res[id(0,(‘WIDTH - ((count-pointer-1)>>1)),- 3)]
<= queue[2*‘WIDTH - count][pointer];
‘endif
‘endif
count <= count + 1’b1;
end else begin
state <= 6;
//next state
count <= 0;
end
end
视差结果仅写入第一个通道,另外两个通道留作其他可能的算法使用。需要注意的是,存在从缓冲区空间到图像空间的坐标转换,提供了一个组合电路来监控变量并提供适当的坐标值。
组合电路
组合电路和函数在当前模拟时间内完成,主要包括三个部分:坐标转换、权重计算和局部成本计算。
-
坐标转换
:根据给定的缓冲区坐标计算数组索引,可通过 Verilog 函数轻松实现。
-
成本计算
:需要两个距离度量,即平滑度度量和局部距离度量。
- 平滑度度量定义为两个参数的绝对值:$\mu(k, j) \triangleq |k - j|$。
- 局部距离度量使用相同的绝对值度量:$\rho(i, j) \triangleq ||I_l^R(i) - I_r^R(j)|| + ||I_l^G(i) - I_r^G(j)|| + ||I_l^B(i) - I_r^B(j)||$。
以下是相关的 Verilog 代码:
//coordinates transformation: (row,column,channel) -> id
function [‘ADDR_BITS - 1:0] id;
input signed [9:0] row, column, channel;
begin
id = 3*(‘WIDTH*(((‘LINES-1)>>1)+ row) +column) + channel;
end
endfunction
//absolute distance measure with threshold
function [‘DATA_BITS - 1:0] weight;
//smoothness constraint
input [‘DATA_BITS - 1:0] a, b;
begin
weight = (((a > b)? (a-b) : (b - a)) < 5)?
((a > b)? (a-b) : (b - a)):
‘DMAX;
//threshold
end
endfunction
//image intensity distance measure
function [‘DATA_BITS - 1:0] distance;
//intensity distance
input [‘DATA_BITS - 1:0] a, b;
begin
distance = (a > b)? (a-b): (b - a);
//distance measure
end
endfunction
//corresponding points for the given disparity
‘ifdef LRC
‘ifdef LEFT
//left coordinate
assign xl = ‘WIDTH-1-i;
assign xr = ‘WIDTH-1-i-jj;
//right coordinate
‘else
//right coordinate
assign xl = i + jj;
//left coordinate
assign xr = i;
//right coordinate
‘endif
‘else
assign xl = (i + jj - 1)>>1;
//left coordinate
assign xr = (i - jj - 1)>> 1;
//right coordinate
‘endif
//local distance: four-neighborhood
assign ldistance =
distance(img1[id(0,xl,0)],img2[id(0,xr,0)]) //center pixel
+ distance(img1[id(0,xl,1)],img2[id(0,xr,1)])
+ distance(img1[id(0,xl,2)],img2[id(0,xr,2)])
//south neighborhood
+ ((‘LINES < 2)? 0:
(((distance(img1[id(1,xl,0)],img2[id(1,xr,0)])
//south neighbor
+ distance(img1[id(1,xl,1)],img2[id(1,xr,1)])
+ distance(img1[id(1,xl,2)],img2[id(1,xr,2)])
//north neighborhood
+ distance(img1[id(-1,xl,0)],img2[id(-1,xr,0)]) //north neighbor
+ distance(img1[id(-1,xl,1)],img2[id(-1,xr,1)])
+ distance(img1[id(-1,xl,2)],img2[id(-1,xr,2)])
//east neighborhood
+ (((xl < ‘WIDTH - 1) && (xr < ‘WIDTH - 1))?
//east neighbor
distance(img1[id(0,(xl+1),0)],img2[id(0,(xr+1),0)]) //boundary
+ distance(img1[id(0,(xl+1),1)],img2[id(0,(xr+1),1)])
+ distance(img1[id(0,(xl+1),2)],img2[id(0,(xr+1),2)]): 0)
//west neighborhood
+ (((xl > 0) && (xr > 0))?
//west neighbor
distance(img1[id(0,(xl-1),0)],img2[id(0,(xr-1),0)]) //boundary
+ distance(img1[id(0,(xl-1),1)],img2[id(0,(xr-1),1)])
+ distance(img1[id(0,(xl-1),2)],img2[id(0,(xr-1),2)]): 0))>>2)));
这个模板包含一个局部距离度量,使用四个邻域的四个像素以及中心像素。要开启邻域计算,缓冲区必须至少包含三行。超出边界的像素被赋予边界值,也可以采用镜像图像或其他类型的边界定义。此外,虽然邻域定义为四邻域系统,但可以扩展为更大的邻域系统。
模拟
对代码进行了模拟和综合测试。由于强调代码的可读性而非优化,出现了许多警告信号。在实际实现之前,必须通过尽可能纠正这些警告来清理和优化代码。
使用一对 225 × 188 的图像进行测试,这些测试图像可以测试动态规划(DP)机器的各种版本。参考模式包括左参考、右参考、中心右参考和中心左参考。中心参考有两种模式,取决于视差图投影的位置:左图像平面或右图像平面。在距离度量方面,有许多变化,特别是点操作和邻域操作的性能需要进行比较。
第一次测试是 DP 机器中的点操作。将视差级别 D 限制为 32,平滑度参数限制为 5,从匹配节点到遮挡节点的惩罚设置为 10。缓冲区仅包含一行图像,自动关闭局部邻域操作,仅保留点操作。原始视差图是单通道灰度图,为了更好地渲染,将视差图转换为三通道,进行直方图均衡化和颜色编码,结果是一个彩色图,每个级别用不同的颜色表示。
以下是模拟测试的相关信息表格:
| 测试类型 | 视差级别 D | 平滑度参数 | 匹配到遮挡节点惩罚 | 缓冲区图像行数 | 操作类型 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| 点操作测试 | 32 | 5 | 10 | 1 | 点操作 |
脉动阵列立体匹配
搜索空间
对于一对极线 $(I_l(\cdot, y), I_r(\cdot, y))$,立体匹配的目的是在左右参考系统的空间 ${(x, d)|x \in [0, N - 1], d \in [0, D - 1]}$ 以及中心参考系统的空间 ${(x, d)|x \in [0, 2N - 2], d \in [0, D - 1]}$ 中找到视差。三个参考系统的可测量区域是梯形,是矩形区域内的子集。
三个参考系统中梯形内部的区域定义如下:
- 右参考:$R_r = {(x_r, d)|x_r \in [0, N - 1], d \leq \min{D - 1, N - 1 - x_r}}$
- 左参考:$R_l = {(x_l, d)|x_l \in [0, N - 1], d \leq \min{D - 1, x_l}}$
- 中心参考:$R_c = {(x_c, d)|x_c \in [0, 2N - 2], d \leq \min{D - 1, x_c, N - 1 - x_c}, x_c + d = \text{even}}$
在中心参考中,只有满足 $x_c + d = \text{even}$ 的节点才能投影到两个图像上,在计算视差时,将此方程作为搜索区域的约束条件。
脉动变换
考虑一个数组 ${PE(d)|d \in [0, D - 1]}$,其中处理元素仅在相邻元素之间连接。线性卷积和视差计算本质上是相同的概念,视差是两个图像之间空间关系的结果,如果图像以流的形式提供,空间关系就变成了时间关系,这种转换可以通过倾斜垂直扫描线来实现。
下面是推导脉动阵列的 mermaid 流程图:
graph LR
A[简单电路] --> B[拓扑和时序变换]
B --> C[脉动阵列]
以右参考系统为例,一种简单的电路形式是将右图像广播到所有节点,左图像以流水线方式移入节点。在这个电路中,左图像按原始顺序进入阵列,右图像延迟 $D - 1$ 个时钟进入,以确保两个流正确同步。每个节点只需计算两个输入数据流以进行视差计算,节点 $PE(d)$ 执行以下操作:
$I_l^o(d) \leftarrow I_l^i(d)$
$y(d) \leftarrow T(I_r^i (d), I_l^i(d))$,$\forall d \in [0, D - 1]$
这种结构由于广播效率较低,需要修改电路拓扑使其连接规则且局部连接。修改后的节点函数增加了一个额外的虚拟输入和输出端口,将输入数据传递到输出。
电路拓扑规则后,仍然存在长组合路径,需要使用流水线技术,通过交错(在脉动术语中称为 k - 慢)增加寄存器数量,虽然电路速度减慢,但交错数据可以用于其他用途。
脉动阵列立体匹配(续)
基本电路类型
通过上述的脉动变换,最终得到了八种基本电路,可分为两种类型:
-
前向 - 后向(FB)
:两个信号流方向相反。
-
后向 - 后向(BB)
:两个信号流方向相同。
这些电路的多样性源于数据方向、首尾以及左右参考的二元性或自由度。
电路设计与工作原理
分别设计了 FB 和 BB 电路作为代表性电路。电路的主要组件包括执行实际计算的脉动阵列和驱动阵列的控制单元。这两个系统在公共系统时钟的同步下完美工作,除了起始信号外,无需任何握手消息,从而实现了非常快速的处理。
以下是对 FB 和 BB 电路设计与工作原理的详细说明表格:
| 电路类型 | 信号流方向 | 主要组件 | 工作特点 |
| ---- | ---- | ---- | ---- |
| FB | 相反 | 脉动阵列、控制单元 | 在公共时钟同步下工作,无需握手消息,处理速度快 |
| BB | 相同 | 脉动阵列、控制单元 | 在公共时钟同步下工作,无需握手消息,处理速度快 |
代码实现与分析
在 Verilog HDL 中实现这些电路时,关键在于理解节点的行为和数据的流动。以下是对节点行为的代码分析:
// 节点 PE(d) 的操作
Il
o(d) ←Il
i(d);
y(d) ←T(Ir
i (d), Il
i(d));
∀d ∈[0, D −1];
在这个代码中,
Il
o(d)
接收
Il
i(d)
的数据,而
y(d)
是通过对
Ir
i (d)
和
Il
i(d)
进行
T(⋅)
操作得到的中间结果。这个操作
T(⋅)
代表了前向传播的具体计算。
性能优化与改进
为了提高电路的性能,可以从多个方面进行优化:
-
拓扑结构优化
:通过调整电路的连接方式,减少长组合路径,提高数据处理的并行性。例如,将广播结构改为局部连接结构,减少信号传输的延迟。
-
流水线技术
:如前面提到的交错技术,虽然会使电路速度减慢,但可以增加寄存器数量,提高电路的稳定性和可扩展性。同时,交错的数据可以用于其他计算,提高资源的利用率。
-
距离度量改进
:可以采用更复杂的距离度量方法,如 Pott’s 模型、边缘和特征等,而不仅仅依赖于简单的强度值。这样可以提高视差计算的准确性。
以下是性能优化的步骤列表:
1. 分析当前电路的拓扑结构,找出长组合路径和瓶颈点。
2. 根据分析结果,调整电路连接方式,实现局部连接。
3. 应用流水线技术,增加寄存器数量,确保数据的正确同步。
4. 选择合适的距离度量方法,提高视差计算的准确性。
不同参考系统的应用
在实际应用中,不同的参考系统(左参考、右参考、中心参考)具有不同的特点和适用场景。
-
左参考和右参考
:适用于需要明确左右图像对应关系的场景,例如在机器人导航中,需要根据左右图像的视差来判断障碍物的位置。
-
中心参考
:具有两种模式,根据视差图投影的位置(左图像平面或右图像平面)而定。适用于需要综合考虑左右图像信息的场景,例如在三维重建中,可以通过中心参考系统更准确地计算物体的深度信息。
以下是不同参考系统的应用场景表格:
| 参考系统 | 特点 | 适用场景 |
| ---- | ---- | ---- |
| 左参考 | 明确左图像对应关系 | 机器人导航判断障碍物位置 |
| 右参考 | 明确右图像对应关系 | 机器人导航判断障碍物位置 |
| 中心参考(左投影) | 综合左右信息,投影到左图像平面 | 三维重建计算物体深度信息 |
| 中心参考(右投影) | 综合左右信息,投影到右图像平面 | 三维重建计算物体深度信息 |
总结
通过对动态规划立体匹配和脉动阵列立体匹配的研究,我们了解了它们的原理、实现方法和性能优化策略。动态规划立体匹配通过反向传播和组合电路计算视差,而脉动阵列立体匹配则通过脉动变换得到高效的基本电路。在实际应用中,可以根据具体需求选择合适的参考系统和优化方法,以提高立体匹配的性能和准确性。
以下是整个流程的 mermaid 流程图总结:
graph LR
A[动态规划立体匹配] --> B[反向传播]
B --> C[组合电路]
C --> D[模拟测试]
A --> E[脉动阵列立体匹配]
E --> F[搜索空间确定]
F --> G[脉动变换]
G --> H[基本电路设计]
H --> I[性能优化]
I --> J[不同参考系统应用]
希望这些内容能够帮助你更好地理解计算机视觉中的立体匹配技术,并在实际应用中发挥作用。在实际开发中,可以根据具体的需求和场景,进一步优化和改进这些方法,以实现更高效、准确的立体匹配。
超级会员免费看
16

被折叠的 条评论
为什么被折叠?



