|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案. X3 r# m. w7 H
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
$ _+ E5 n2 k7 I" L `4 H
9 {. H# ~9 o* y/ o- J& Y6 G舉個4進4出的例子:
5 P1 m f1 G- C5 |2 _input [word length] a[4];) h& u- }, {% Q& A& K1 D/ S
reg [word length] b[4], c[4];; ?+ c# [$ l) _0 n
第一次排序
% L; T" t0 s" `" E8 j# Fb[0]=min(a[0], a[1]);' q4 A: L' f! M6 D( j* C5 v2 m8 ~! v
b[1]=max(a[0], a[1]);. V) I x# D0 N
b[2]=min(a[2], a[3]);. _! M4 D5 `" ~7 F& ~
b[3]=max(a[2], a[3]);3 G+ R4 a4 {( v- S' H. d
第二次排序
3 L+ D8 ~9 M& A" @0 U" |! bc[0]=min(b[0], b[2]); //real minmum5 i2 k7 v! a7 i% J7 r8 x# H
c[1]=max(b[0], b[2]);
: d0 y) f$ H/ ]& U9 Bc[2]=min(b[1], b[3]);5 t8 E7 `" B' K: t
c[3]=max(b[1], b[3]);//real maximum
* m) h! \* ~/ W2 Y) H1 B+ [4 ^第三次修正項
( ^- I( Q" K0 `5 p/ ?+ X3 l6 sd[0]=c[0]; //real minmum7 m \/ X, r4 R4 l9 e+ K
d[1]=min(c[1], c[2]);
1 X" W7 ~5 k, b! a, bd[2]=max(c[1], c[2]);; A9 ?9 m+ q5 H, e% G
d[3]=c[3];//real maximum
1 w8 d, q* m' D3 Z' g; {+ X1 i//d[0]~d[3]就是依序小到大的答案
/ w6 E. B% @( R/ D0 S6 B3 e) V/ P( j n3 S, I
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)) x1 W% k d- Y
+ ~& M$ X( c# U+ J( b
實做的考量) a# ^: m3 I2 S* a: {& b; `3 k
1. 實做上min()跟max()應該是一起做的
% D3 |4 B$ S" i0 h- } if(a>b)
( l$ \+ T' s+ s, w min = b;
7 x/ k2 G/ X( ^7 V9 h2 | max = a;
) }% P( B: R4 T' {! g else O+ T: }' M" t0 X
min = a;
6 N! }& x w: Z max = b;
& ]2 I. X; j% L" C' Q0 h& F/ ]) }2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
2 a( y- E) L9 T3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項." T0 I1 g0 w: ]8 ]! Y- x
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|