|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案; ?, y0 {2 f; m) m2 q" P' [
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.: w6 A x8 W+ j: z0 D
) S. v: i8 m+ U, T舉個4進4出的例子:
5 N& e$ H! R, V" ~input [word length] a[4];
$ R4 }/ |9 l# c* Wreg [word length] b[4], c[4];, ]. r5 B. A1 a# j
第一次排序
+ E* M. t- M Z3 t+ ~b[0]=min(a[0], a[1]);% f1 Z8 C& g d4 h v
b[1]=max(a[0], a[1]);/ j4 t6 | [) Q6 C* x
b[2]=min(a[2], a[3]);
3 R7 N) ?+ q4 L i: w5 Bb[3]=max(a[2], a[3]);' {' s9 f0 y: `; f1 n" M
第二次排序
0 `/ m' B5 P2 L2 f' N9 o+ ]c[0]=min(b[0], b[2]); //real minmum
. B8 v( X6 Z# X7 M# Q( ~5 P+ n( Ac[1]=max(b[0], b[2]);
; @: u1 H' k3 U+ gc[2]=min(b[1], b[3]);
# W( O4 z# J. l% ]c[3]=max(b[1], b[3]);//real maximum
( L3 N; T) o5 o- Q第三次修正項
7 n, T: j' k3 C/ Gd[0]=c[0]; //real minmum
) S6 I, \% f, R, G5 R5 _, Qd[1]=min(c[1], c[2]);
0 `3 ?' `' }9 j% ud[2]=max(c[1], c[2]);
& ]& J: _- o$ Q. i7 J8 ud[3]=c[3];//real maximum5 B) |1 I6 H0 `; H+ o
//d[0]~d[3]就是依序小到大的答案
) a; A8 o* i/ { |3 Z4 f O E; ^8 h. S# z. g N
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)& E$ ^- C/ q* _6 U
9 `, S2 ^/ L) W; a6 K實做的考量/ e: H6 p6 t; [" ]
1. 實做上min()跟max()應該是一起做的" W, h+ C2 ~% N2 }" j' z) t! M) ^. }
if(a>b)
& \ L* y7 ^( F min = b;
- r* e$ ]: m: `, L2 C& T max = a;
! ~" y2 Q, n7 `) B2 m: p# ~ else$ P+ L/ Z m; U- b5 R, w
min = a;
) Q# Z& \2 F7 G6 Q5 G Q max = b;
& i! [" I. k6 ~& g, l2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
9 M. u$ ]* E* Y; V$ _3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
, e% W2 I2 L: {0 h' WP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|