|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
" `0 F' C' O7 k$ c, [1 M$ e) w$ y至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.2 z0 ]( b6 e3 Q% c2 e1 a7 O
1 [2 |; G. |7 W: L舉個4進4出的例子:! Q& k1 l h2 W k5 T
input [word length] a[4];( O9 c/ X; K+ [# `" X, k( L
reg [word length] b[4], c[4];9 {7 F8 X+ u, y
第一次排序
( V, z# T/ }4 ]2 p) ab[0]=min(a[0], a[1]);
4 c7 ~8 T& f* u) A7 n8 H0 o+ g, l- ib[1]=max(a[0], a[1]);
* v8 `* t: U% y& E( |b[2]=min(a[2], a[3]);
( ?( ?& @' V+ G) E. g# Q/ I: Cb[3]=max(a[2], a[3]);
3 L9 z' D) ~1 L& u第二次排序
# J/ y- p) h" S: ^ n: p/ X, ic[0]=min(b[0], b[2]); //real minmum {, a5 g* D; D( c
c[1]=max(b[0], b[2]);2 E" N. ]" F$ o. x& C) X" D
c[2]=min(b[1], b[3]);4 N7 y: W5 N/ u& I* r- d6 y
c[3]=max(b[1], b[3]);//real maximum
. C- T* a$ ^: `, r- o第三次修正項
$ @; C# w3 P: ~8 v! [7 t( s0 Ud[0]=c[0]; //real minmum' g" G# F, D7 P1 f" V1 b
d[1]=min(c[1], c[2]);
: J4 L1 k( k! X4 C% _d[2]=max(c[1], c[2]);8 e9 k% d/ i, S' _/ S7 R
d[3]=c[3];//real maximum7 [" y: x/ A; s
//d[0]~d[3]就是依序小到大的答案
5 m$ Q/ y7 p. B- n( Q6 `
' C: n9 Z. o' n- `8 |這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)1 `3 i+ s6 S/ V5 n; M( X, g+ f
& }4 n# F. y. p# N
實做的考量; C# }2 G: p9 P/ g
1. 實做上min()跟max()應該是一起做的
0 F7 T/ M$ r. J7 M; z# d if(a>b): g* t1 `8 h' `, k
min = b;
& S1 [; N! G6 i; m max = a;/ N% P3 ?2 ] \: | V2 d
else) E1 D5 f. Y$ \4 z4 X5 R9 e
min = a;/ C: p- b9 X7 @
max = b;* s( D( ~- Q3 n6 t
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
9 U0 p& g& r* Y0 ], R0 b. p6 D3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.5 }4 A9 G3 ]; s6 v# l, ^& |
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|