|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
- ~: l, q ~/ ?至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
& q# ^4 Y1 o# t% B) w/ m) G9 G3 w2 U* m; o
舉個4進4出的例子:" w! e2 @* f* E( {
input [word length] a[4];+ `1 d- ]% h- c8 R- ]5 [' c
reg [word length] b[4], c[4];& \7 o3 {. T4 X {6 | T: J
第一次排序3 p( f S9 @$ k" d6 m
b[0]=min(a[0], a[1]);2 g$ s9 V$ U9 O
b[1]=max(a[0], a[1]);
- K7 `1 v& ~; s" |& U, Z. b- qb[2]=min(a[2], a[3]);
5 ^% m6 B' t) K0 W/ [b[3]=max(a[2], a[3]);
" G4 r2 A5 B2 R2 R第二次排序
" }+ b5 l7 c1 ]/ r2 I# \c[0]=min(b[0], b[2]); //real minmum
1 a+ V( `6 }3 N; B3 x! s/ jc[1]=max(b[0], b[2]);3 X0 [& F# D9 k/ J
c[2]=min(b[1], b[3]);
9 y% F2 ]# m0 S( _c[3]=max(b[1], b[3]);//real maximum& t1 A! E6 X5 l$ A, G
第三次修正項) @$ I$ q* x6 U: i! ~) q8 ^
d[0]=c[0]; //real minmum
' f( ~7 I) T5 _( s8 N' o- Wd[1]=min(c[1], c[2]);! b3 |! }9 u V- n! E
d[2]=max(c[1], c[2]);
6 I3 C s$ I) D+ od[3]=c[3];//real maximum% x& C- Q& W5 j% h& ]4 Z
//d[0]~d[3]就是依序小到大的答案0 q! L+ n8 L* O
. a p' e G8 r8 `( E這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)6 l" q9 W% @0 p s
9 @3 l- R& |1 Q! \1 A) d實做的考量
' T5 a5 y" d5 e, ?1. 實做上min()跟max()應該是一起做的
: i9 `9 V; v" g$ H1 X4 I. a/ [ if(a>b)
' G% q; j+ X9 U3 F9 G2 g min = b;
/ p* E3 y3 M. i4 |8 y0 t5 c max = a;
1 e' F' T3 ?8 G5 Y else
4 ^) e; W4 ^/ V min = a;
& w( _) h; c) [7 _. f' y6 E max = b;; a! X8 R1 a, f3 Q4 P) [
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
( H9 m5 F& @, S; R) f V% D( Y3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
/ o; y* u9 ^2 B* d) ^P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|