|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
9 w) s9 \8 ]: ?% ~至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
- m: b4 V5 {) d' v) ~: l# D/ x A, x' X! T a* u3 }: b
舉個4進4出的例子:; Y( c, K8 i+ M% [ k
input [word length] a[4];
( |4 \6 V8 p, f# v2 Z5 I4 Freg [word length] b[4], c[4];/ Y9 }# l. z1 }6 U
第一次排序" o; e- O5 D. {$ l# E' ], F- `
b[0]=min(a[0], a[1]);
`% Q" A0 i% Z3 Q. x3 _0 a: \# zb[1]=max(a[0], a[1]);/ t/ Q; S2 S0 u3 t
b[2]=min(a[2], a[3]);* o. S4 y- V2 n6 ?
b[3]=max(a[2], a[3]);
5 D, i; d* e; L1 r4 m. C/ L$ [第二次排序
0 ?& G$ K8 n- p) lc[0]=min(b[0], b[2]); //real minmum J6 s1 i; A' ?3 ^ O
c[1]=max(b[0], b[2]);7 y" t& F6 ~* S( F& n
c[2]=min(b[1], b[3]);4 t, @0 ?% a- `% ]3 v6 y
c[3]=max(b[1], b[3]);//real maximum; F- a4 Z3 m" C" j8 w
第三次修正項9 R* Y/ I, S; B8 W- ?4 P+ y
d[0]=c[0]; //real minmum3 O2 E8 ]* a! x" |7 {' D
d[1]=min(c[1], c[2]);
' w# y5 `6 R5 }0 v7 i( sd[2]=max(c[1], c[2]);% \1 y$ D4 L- G) h( C' T
d[3]=c[3];//real maximum
$ t2 R9 _4 z( @: h; u//d[0]~d[3]就是依序小到大的答案
' j3 U( J+ V, s, k3 V- r5 G( ~8 ~, o& V- t, Q; o
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)( O2 D0 }0 p& h
. R. a! r% j8 d2 u% G1 S4 F' o實做的考量
9 W) B3 U" `. m' S9 N: U; B9 x. |1. 實做上min()跟max()應該是一起做的
& o1 Z" c! K7 q! G+ z& K if(a>b)7 k( J3 D6 `. T* f, G
min = b;! \+ W( G- l7 x0 `6 n, _6 S
max = a;. a+ i: Q+ T! b3 k$ j9 @7 `0 V
else/ r3 c$ V) g/ I
min = a;" p4 E$ z$ a! b3 [
max = b;
' y" S$ K" N h4 ~' F' Y2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.( A; X% [2 J6 J% y* o/ C6 W
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.8 E* [4 Z/ ^; k! G. t
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|