|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案7 p+ G/ H2 R7 B: w
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
* {: }. O* U+ X- ]6 R" S/ d1 I4 `5 B' W$ Z' |7 H/ o
舉個4進4出的例子:
) D1 y0 R; U) ^/ D) \0 ?input [word length] a[4];) z4 }5 H I/ n& L
reg [word length] b[4], c[4];
% d" O1 C0 h2 Y% @9 u; g" X9 \第一次排序
" P; h1 a* n0 q# y; P& w: e8 Qb[0]=min(a[0], a[1]);5 Y8 s U1 b$ [5 \) E" ?
b[1]=max(a[0], a[1]);( g$ J, z' `. m# K$ F
b[2]=min(a[2], a[3]);. h/ t/ J* T$ D+ q; b
b[3]=max(a[2], a[3]);
/ [2 |$ V; J4 E第二次排序$ J8 Y0 N7 N7 i" E. K
c[0]=min(b[0], b[2]); //real minmum, `9 ~0 f' u" A: ~+ T
c[1]=max(b[0], b[2]);: b+ A ~4 @3 h# L+ a
c[2]=min(b[1], b[3]);
) b4 D* d% r+ sc[3]=max(b[1], b[3]);//real maximum L! x c+ F& Q3 S3 N2 u
第三次修正項 l( f5 \. G# a- _; I3 c
d[0]=c[0]; //real minmum2 X! w2 Q/ L* n* h; l) v
d[1]=min(c[1], c[2]);
: ?3 B+ b# o+ _+ g7 c6 K: t: ud[2]=max(c[1], c[2]);
6 J1 j. @. a( F3 u; ~6 `d[3]=c[3];//real maximum& m( f; S+ e6 e( o& i
//d[0]~d[3]就是依序小到大的答案
: X5 u9 k2 ^3 d7 q
- z0 D& t- u9 c. C* s這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)8 _7 O4 }: V' C& N5 W
) t9 S9 V# ^ M5 K3 h實做的考量" K" V U" q! s L
1. 實做上min()跟max()應該是一起做的
# q! Q+ z' p) X9 M- ~$ a if(a>b)
0 C# q8 D7 M1 _2 K( |' W min = b;! g: ^# I" m4 b
max = a;" M; K% ? j6 o, g4 O" P
else
_* |2 g/ \0 V2 y+ p min = a;. x4 s2 m- e8 P/ `* D
max = b;8 X W% o# z7 A0 E
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.. G3 v$ d7 T4 ^; e" O" p
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
# j: h5 `( S5 z' ^ `, [P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|