|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案2 }! u; G4 z+ c7 W
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
& O0 v' a' {3 ~1 J
0 j: D' ?+ J7 `舉個4進4出的例子:1 s) u j- g! q, _
input [word length] a[4];
5 [1 c7 G! _5 ^# K2 yreg [word length] b[4], c[4];
5 O& z3 n+ `! e) |, K/ ~第一次排序
6 v* u! l* [5 eb[0]=min(a[0], a[1]);
& _9 n! u+ M$ Y5 f% m( [5 q5 Yb[1]=max(a[0], a[1]);: ~! M0 ]5 k# @/ J
b[2]=min(a[2], a[3]);# J. q2 P0 ` ?' C* {( w
b[3]=max(a[2], a[3]);- y# J2 B( W E% i2 e" S- S
第二次排序3 ^# {2 X* ?" [
c[0]=min(b[0], b[2]); //real minmum
' N7 X9 i# F+ X2 uc[1]=max(b[0], b[2]);
9 g" q/ d0 [6 Ac[2]=min(b[1], b[3]);% Z3 y4 U# w9 L: A
c[3]=max(b[1], b[3]);//real maximum h( p$ B/ U3 h# p; G, D
第三次修正項2 W6 Z$ D! O$ z9 O
d[0]=c[0]; //real minmum
- @1 H" D$ T Y$ Y: Sd[1]=min(c[1], c[2]);
) T$ ^9 o# }: S( wd[2]=max(c[1], c[2]);6 f" z: s/ A% l: Y3 M7 a* s$ g" y
d[3]=c[3];//real maximum
3 b, \* W% ~9 _0 h' P9 Z//d[0]~d[3]就是依序小到大的答案 k2 `, ?6 z4 g2 l$ }* W+ F
$ o( b7 d1 V% j4 \& y6 w8 V
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
- H7 {7 s( }% b1 ^+ b
! H! r& v; b7 d. W: G d( _0 X實做的考量
& _9 `% S! X- k/ b) D% T: B6 C1. 實做上min()跟max()應該是一起做的
4 c, ]- a9 ^, E& E if(a>b); J$ f! i) D0 ?9 n; c2 J9 g$ ?
min = b;. m! z7 v# j) ]5 X
max = a;: S0 B/ U* v/ `! d& { c! J
else
1 T+ @8 Q( Z4 p0 R- f/ h/ X min = a;
& o* o3 \ K( m1 A5 _6 `0 x1 w max = b;4 ]' f& ^+ y0 _3 Y+ w9 O
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.; b9 z5 m3 {7 j; X
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.( ]% ?; U7 ?5 A9 Y! O$ y
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|