|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1概述 * u3 N9 {' }7 x6 x, `6 k" h: U
$ m" ?& c) `/ |) a7 S 在图像处理中,卷积、窗口运算是非常基础且常用的操作。这些基于图像滑动窗口的运算非常适合在FPGA中进行流水线实时高效处理,也是FPGA图像算法实现的一个热点。其中,最基础的工作就是在FPGA中设计一个滑动窗口模块。# n* Z* s4 h, x
设计一个完备的滑动窗口模块首先要解决以下3个问题:7 p7 t: w6 B k: f
0 D/ s7 {) c {
图像行缓存机制
+ o0 T( u% I8 Z" N: J# B& b
+ d5 n* h' G0 _# `行、场等同步信号的延迟/ x8 a/ I# l$ g" S7 Z( f
0 n8 r3 ^3 ?" @; g- j图像边界的扩展
8 A3 s* E* x% B) k n& \$ J1 p
1 X! E B1 f, _. c7 r2 图像行缓存机制* D& B; [" Z% T) L8 i
/ P. L: e5 J$ J6 B( } 有2种实现方案:; l6 F- n" x7 X9 u/ D/ ^
4 j' |7 x3 O; g8 H% }, d, ^
(1)使用FIFO或RAM按行缓存图像。- }9 @4 M( c3 j1 [% s$ q+ [
# a6 m! R/ e1 d8 ] 网上很多的博客和教程都是采用这种方案。例如,生成3×3的窗口需要缓存2行图像,消耗2个FIFO/RAM,FIFO/RAM最终都是消耗FPGA的块存储资源,消耗量与缓存行数成正比。每个FIFO/RAM都需要通过逻辑单独控制读写。FIFO/RAM都可在FPGA开发软件中例化IP核实现。
- C) F, H$ P" u5 v5 L2 K5 k$ h
* z3 [1 ^( z4 Z2 t (2)使用单个RAM缓存所有行2 w) z/ V+ _4 O8 e$ y
4 C5 O0 D7 B, |
例如,3×3的窗口通过1个RAM缓存2行图像。这种方案有2个优点。! L' f C+ V; i, \1 v. Q
# G, Y4 S' C& ?4 ]# _' M _
首先,可以简化逻辑设计,因为无论需要缓存多少行图像,FPGA都只需要操作1个RAM的读写。) \ y3 }/ J' y/ V* |' c
$ a, S/ U8 P5 M P0 N
另外,充分利用FPGA块存储器位宽和深度的可变性。当位宽和总缓存量在单个块存储器的范围内,则仅使用1个块存储器就可以缓存多行图像,从而降低块存储器资源的消耗,尤其是当窗口尺寸较大时效果明显。; j$ _6 |2 k/ m W' X
, q% L$ r. f# V* r/ O# n0 a 例如,Xilinx 7系列FPGA的块存储器block ram可配置为1K×36bit的模式,可以缓存4行像素深度为8bit,宽为1024的图像,实现5×5滑动窗口的行缓存。2个1K×36bit模式的block ram就可以最多缓存9行8bit×1024的图像,以此类推。) u+ |% n' Y( C
1 U* O5 x x$ h! o, q9 i# b! [* l 所以,推荐使用这种方案。" B' w1 E/ Q& k! \) o
9 T% `; |- W" i1 T" z8 Z
3 行、场等同步信号的延迟) L- [ @1 f- E5 `7 V9 O+ @
& Z# K! o3 l7 s$ U
由于滑动窗口行缓存机制的存在,滑动窗口的输出相对于图像的输入存在一部分固定行数的延时,其对应的行、场同步信号也需要与之保持一致的延时。例如,3×3滑动窗口的输出至少会延时1行图像的时间,5×5窗口输出至少延时2行图像,以此类推,至少延时(窗口尺寸-1)/2行图像。
- r' Y. _. U; O! R9 Q) C) J; X, q* ]6 \ Z
同步信号的延时方法通常有2种。
; v/ s0 B8 n% z N7 ?4 k (1)与行缓存方式类似,通过FIFO或RAM将输入的同步信号整体延时。
. M8 ]0 y ^6 z
. l! u- C1 W; l; _ 这种方案的优点在于,输入和输出同步信号可以保持完全一致。缺点是需要消耗额外的FPGA块存储资源。. Z9 k# M2 I' Q: a7 G
+ V+ ^. \! N) G% Y0 K. ~# v& D8 P (2)通过逻辑生成延时的同步信号。4 V: m1 T8 D& e1 |" I- u& e# g# T
5 S5 Q" J* j5 k! S: ~2 I4 P: j 这样不需要消耗FPGA块存储资源,但是需要设计单独的逻辑,而且也无法保证输出和输入同步信号完全一致。0 S& }$ l/ Q" S
5 e/ |% h! ]3 \( F9 }
对于大多数应用场景,输入和输出同步信号不一致并不影响数据流和处理结果,对于FPGA而言块存储器资源比逻辑资源更稀缺。因此,实际应用中第2种方法更为常用。如果对同步信号时序有严格要求,那只能采用第1种方案。
. s- R; X) H8 L$ H) @
( s: K& j( m, d5 D5 B) L4 图像边界的扩展
7 H. f& g0 Z1 u( X4 ^5 y. a* d. f& y' u9 s5 ?1 X
4.1 边界扩展原理 p" f) a8 n6 \/ Q1 A0 [
) V2 i* D" e' I5 K9 z- e 图像卷积或窗口运算,在涉及图像4周边界点位置的滑动窗口会出现部分像素点缺失,需要进行特殊处理。常用的策略包括忽略,补固定值,边界复制,边界镜像等等。1 x" d3 w0 T6 Q( M9 R. ]& d
/ U$ v0 p2 r. \/ o0 z. Q+ O7 Z (1)忽略) h8 A0 y& w' ]7 c V5 i. Z4 L
5 b9 t7 D7 @" o. j- c3 V0 r 就是不对滑动窗口中缺失的像素点进行处理,直接用来进行计算,由于缺失像素点对应的FPGA触发器可能为任意值,所以边界像素点区域的运算结果会受到影响。但对于小窗口来说,影响较小,不容易察觉,可以采用。
7 V7 E$ S8 W) z. [: n4 U' u, x2 f; x0 B% x- G2 E- e
(2)补固定值1 f, T& v( ?7 B( G7 J
5 M" ^& D% I- u/ Z: s1 t1 S% ]9 _
同样会直接影响边界像素点区域的运算结果。但对于小窗口或者某些特定场景来说,也可以采用。 s H9 \. H) S/ o6 }
! i- v! C! r. @ (3)边界复制. j* ~7 S) S- C Q1 f# T* M
3 s; w: }/ V0 Q, L" \4 M7 M
就是直接复制4个边界的像素点到缺失的位置,对应的行列位置缺多少个就复制多少次。这是最常用的一种方法,matlab和opencv里也经常被使用。这种方式对边界点的计算结果影响很小。4 O9 y4 `. `0 z n3 f
6 d6 T8 e( q: I9 o8 u1 Q
(4)边界镜像- g) m$ k" F' f W
6 d, t5 _$ y; W1 c) n& U7 F! \( }
就是以边界为对称轴,以镜像的方式复制边界区域的像素点。这种方式同样对边界点的计算结果影响很小,在matlab和opencv里也会被使用。
2 h' W* @/ G( z
* |8 y. k( N2 t' J/ V+ Z4.2 FPGA实现图像边界扩展0 D; n: g# |. k' P: A+ M' i/ t
9 D& `1 @2 J$ @
在FPGA中进行边界像素点扩展有2种方式。3 g1 V2 L8 p3 ~9 G: r# T
) \3 g4 x. t5 J/ Z8 V- S1 v (1)动态扩展。
* q: `+ ^9 V" d6 F# _1 R7 D) \ }8 \! R
就是当窗口在边界滑动时,动态补全缺失的像素点,整个操作是在原图上直接进行的。这种方法有个明显的缺点,当窗口比较大时,动态补全部分会使用很多组合逻辑,资源消耗量大,且不利于时序收敛,一般不推荐使用这种方法。
" t6 f( T/ S q1 J) D% y$ q" D) K6 s/ C- T1 {7 ]
(2)先扩展后滑动。
I: u7 t+ o9 j7 p+ V' j% U+ Y
" H( a, O0 j4 z2 P 就是先对图像进行边界扩展,然后在扩展后的图像上进行滑动窗口输出。边界扩展需要在图像进行行缓存时完成。这种方式在滑动窗口生成时无需对边界像素点作判断和处理,不需要消耗逻辑资源。缺点是,边界扩展会增大输入图像的尺寸,同时改变输入行、场同步信号的时序关系,行间和帧间的消隐期被压缩。如果窗口尺寸较大或输入图像消隐时间较短,导致扩展的列数超过行间消隐时间,或图像下方扩展的行数超过了帧间消隐时间,则无法使用这种方案。但是在绝大多数场景下,第这种方案完全可用。
! I M4 ?6 O" O, k$ B( a; m
0 z; O4 q* i% P 从FPGA实现角度和窗口运算结果而言,边界复制是最佳的选择。既能保证运算结果,又便于在FPGA中实现。边界镜像方法由于镜像复制机制设计更为复杂,会消耗更多的FPGA资源,因此不作为首选。- u! l* C7 L% D/ B8 L
$ ^/ K2 Z( |/ K; u5 C
5 进阶设计2 G; F# ]! y8 y9 {6 {
! J1 r: P# G, W! N) {
滑动窗口模块在FPGA图像算法实现中会被经常使用,若将其设计成一个通用模块,则可以有效提高代码编写效率。设计成通用模块时可以考虑以下几个功能的实现。
7 X9 N8 R% {! t: E+ s$ ^% \4 z4 U
+ q8 `: @5 z7 f像素bit位宽可配置" k& q" ], _; D! o- `
4 n$ ~9 x: C- c [$ F2 ]& ~" V) T窗口大小可配置,且长宽尺寸可不同
& X: ` Z7 s1 m" Q& z5 W6 g. F( A& T9 x( a0 w1 [2 v
输入图像尺寸可动态改变; x, G. [! ~1 R1 ^
" _. U- R& b4 u9 t
行缓存所消耗的存储资源量可配置
$ {+ P# t# z1 V0 ?5 n$ s& z
- x) K' c% S$ y: V8 E4 o支持单时钟周期多个相邻像素点并行输入输出,且并行像素点数可配置) s [5 i: R6 \2 n
6 V. w4 w/ m( h' y8 G5 E |
|