|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
& s0 l7 d, |6 Z/ D% q" a# F至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.6 z g4 c4 b5 n
- `/ R+ I% h- i; g& l3 X
舉個4進4出的例子:
' H6 C9 p5 [7 M- L9 xinput [word length] a[4];' ^' ?1 |$ |1 [
reg [word length] b[4], c[4];! Q. k3 t9 } \4 K8 g* ^ D
第一次排序
]- ?/ c7 g" L8 R' ] Nb[0]=min(a[0], a[1]);
" E3 V0 F9 h. W4 Wb[1]=max(a[0], a[1]);
9 M- h# C- x& n1 l7 K# {, i$ Cb[2]=min(a[2], a[3]);% n# g/ @* @/ z# D1 S
b[3]=max(a[2], a[3]);
; X/ e& C8 D1 E/ N5 ^第二次排序
; z) ] v. k: n* @c[0]=min(b[0], b[2]); //real minmum
! w8 ^! b i' ?% \9 xc[1]=max(b[0], b[2]);. T6 B" `' B; Y% ?: D, U, I8 E% V( E
c[2]=min(b[1], b[3]);
2 M6 }" ^4 w) x: j* ic[3]=max(b[1], b[3]);//real maximum) X& \' ^+ o& G+ ~% }) d
第三次修正項
0 [4 i9 d6 k& P/ |4 P8 S+ s4 Vd[0]=c[0]; //real minmum2 z' q6 m: u! y7 s* P( m# m; Q- k) G) p
d[1]=min(c[1], c[2]);4 S8 ^$ m L( m( x2 H' \$ |
d[2]=max(c[1], c[2]);
' ^; O- F# s. c- `" O5 Ad[3]=c[3];//real maximum
- m: ^/ R5 L: @3 z, l. s: J+ Z//d[0]~d[3]就是依序小到大的答案
( Z) ]" w+ M5 o2 U$ f$ j- U6 O% b- B3 z
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
& g2 R6 |$ ]( f( Y! ?, J6 l* }' N
/ l" m' b7 b' A; S p6 U5 g9 {實做的考量1 H: P1 l6 V9 d
1. 實做上min()跟max()應該是一起做的. J0 B) V' i/ e% f& ^
if(a>b)
, i9 H8 Y% i- t ~4 E. z min = b;6 \9 w. i* f, V1 v" n
max = a;" _, l d" H: \$ n: f
else
% c& e( d6 D0 Q min = a;
- Q5 e/ x, n& W# Q8 h7 K max = b;
" s" r$ w' G: A: a2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性." ] Q/ a& X& L# l+ d i
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
' S' G3 A: |1 I8 O* d+ J/ rP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|