|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
4 O" Q' K3 R" i- `( j至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
5 K/ F, g7 S6 U6 ?: ?3 t' s, }9 x# S& H
舉個4進4出的例子:# i2 |+ y) B* U- i$ W6 Q3 V
input [word length] a[4];
' k, ?0 y1 L0 j* _" r- Dreg [word length] b[4], c[4];
" }, L8 n- [2 z) c+ V, B9 D第一次排序
- G7 Q& X ?/ a ib[0]=min(a[0], a[1]);8 I+ b" c/ \$ X9 `# }% s7 G
b[1]=max(a[0], a[1]);
9 H Q1 L n- ~% Z# y- R8 rb[2]=min(a[2], a[3]);
. p: g* d: L6 D, |1 I% Ob[3]=max(a[2], a[3]);7 u* t. U+ o5 W
第二次排序
2 b7 w/ C6 a# Y3 x* [) ^4 w8 E1 bc[0]=min(b[0], b[2]); //real minmum
9 A) i& f8 P0 B: w9 R6 Z# rc[1]=max(b[0], b[2]);$ m" s) l0 r( z
c[2]=min(b[1], b[3]);
, T1 o# d" Z+ A4 h$ {) V' N& Dc[3]=max(b[1], b[3]);//real maximum
* S3 W$ s6 M& T4 A第三次修正項
% A5 D$ ~- H/ i1 G Xd[0]=c[0]; //real minmum
. }/ Q- o& Z: J6 ~/ dd[1]=min(c[1], c[2]);
* b" n. u) N" L9 @/ P, {d[2]=max(c[1], c[2]);4 Y6 @) @& [3 v, E1 O" E1 I
d[3]=c[3];//real maximum# i* s8 X& T+ {- G3 J6 c
//d[0]~d[3]就是依序小到大的答案* s. o# F9 H# y
8 b" V, {: t! r9 D f; b( ]! b% Z
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)9 u {8 ^ W* n
/ O- c; h: g: @- S8 h0 Z3 Z) J9 B
實做的考量
0 P. f0 d; ]7 ]7 ~& E6 E( h! T% S1. 實做上min()跟max()應該是一起做的3 L( [ ^# v# v1 g' T; K# x* D# t
if(a>b)
5 o: x( f, U+ Q; a- Z min = b;
9 V# I) z0 f7 Q/ r max = a;
; M1 X) L- k7 u; r( ~% N else
. n1 U4 W1 c- j, S0 O min = a;
0 N9 d. A: X/ g" i! N max = b;
* U* `4 Y6 _, ^/ `! k2 G" `) D2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.7 f' r% C$ p. }/ V5 H) _8 c
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
8 K$ |# o: Z2 K, o6 q& o3 l2 c& LP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|