|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案7 y8 K0 D$ W1 x0 z
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
5 ]7 z, z0 ]0 T7 s# ~" f( W7 R0 u# z" H! r8 W' j
舉個4進4出的例子:5 j6 P8 h# A4 p( E% s
input [word length] a[4];
4 Y* _$ e1 g5 A yreg [word length] b[4], c[4];
0 I# u6 m( q# a8 M$ }1 d9 ~第一次排序$ ]# V: J! F7 K# T+ F- D
b[0]=min(a[0], a[1]);
- x! Q$ F; o8 a& N6 Y4 O6 ~6 xb[1]=max(a[0], a[1]);
3 s& N: O, v7 @( b" pb[2]=min(a[2], a[3]);: Y4 `$ b0 c* R$ N
b[3]=max(a[2], a[3]);
2 ~# h0 z. h4 y. K; L4 A第二次排序; J4 A% }! g9 H
c[0]=min(b[0], b[2]); //real minmum
* s& {4 F4 n* z7 N3 K, o) Hc[1]=max(b[0], b[2]);
' w* ^' f* Z0 v9 H2 mc[2]=min(b[1], b[3]);, S: K! x) Z6 Q' P
c[3]=max(b[1], b[3]);//real maximum
9 B2 u. F7 _3 L7 M& l& E: O第三次修正項- l( S' `/ Q/ n# N! U0 K
d[0]=c[0]; //real minmum
- j, f: }$ ~! S4 o: o. Bd[1]=min(c[1], c[2]);
1 E% V& a6 a+ z& ~( M8 ud[2]=max(c[1], c[2]);1 C3 [ D0 i9 W' H5 S7 f2 A% c- T; L
d[3]=c[3];//real maximum
$ O$ I% ^* d! L/ N//d[0]~d[3]就是依序小到大的答案% _: d; `/ R6 O
0 h" d" Z0 o% Z/ Y8 S; i% D這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
; [ E7 i% a ]9 H5 T: D7 f. q/ P) z
實做的考量
+ d5 r3 }5 x {- ?0 J1 e+ `1. 實做上min()跟max()應該是一起做的
- S' v& X: T4 b1 A0 ^# U if(a>b)2 O; u( `4 \1 k: z; u f- k; _
min = b;
) `( o$ W! C5 u: g. E) L9 u5 _ max = a;+ D6 g# |7 M" U3 S. {) ]3 P
else5 `2 c7 q5 ~+ }
min = a;+ M" x- Q6 }2 _6 ^$ E5 T
max = b;
8 Y" Z2 c$ R; d2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.6 _4 u0 N/ t% P* ^& z. g
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.$ l' o3 W$ L3 n5 F: M
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|