|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
+ R: Y4 Q- L! K- Q3 H% }至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
( T8 Z7 u& U( ]- ?2 ?
; p4 G6 t/ X) e' @8 F! G2 a舉個4進4出的例子:/ c+ _; c& Z+ A3 I" [' G
input [word length] a[4];/ k* Y/ }5 c+ f) R7 w/ }' \- O1 L6 B
reg [word length] b[4], c[4];
( H4 G' s$ E7 q2 J: a1 M( J: |7 D4 }第一次排序6 Y- Z, U8 x, [4 A# {
b[0]=min(a[0], a[1]);5 d! \) v, o( h, `0 u) v
b[1]=max(a[0], a[1]);
7 k& M! L6 N+ M7 _" O7 t1 `b[2]=min(a[2], a[3]); M# {3 B/ Z4 h+ ?+ K) A/ p
b[3]=max(a[2], a[3]);
/ j7 E, \. `/ L- Z, x8 Y第二次排序9 k0 s" o1 u( K' H( s1 y
c[0]=min(b[0], b[2]); //real minmum: Y" p1 H1 ?3 ]9 e5 Z5 F
c[1]=max(b[0], b[2]);: t% m! R- z( Y
c[2]=min(b[1], b[3]);
7 u! t b- `% K7 O% S9 uc[3]=max(b[1], b[3]);//real maximum
. ~6 x" Z" N0 D7 D7 o第三次修正項* {2 G" E. Y& o0 {) `( ?- A7 N
d[0]=c[0]; //real minmum
5 l: u& G3 X+ U, N6 Z$ m* od[1]=min(c[1], c[2]);
; H" }9 O, `# x) x7 ~0 I4 kd[2]=max(c[1], c[2]);
+ `" j6 [9 l0 Y- Vd[3]=c[3];//real maximum
8 E% N$ G) \ ~3 S( U* N//d[0]~d[3]就是依序小到大的答案7 i; C5 f' c# S- t$ M
2 `, K* @* w& D( ~$ g% }" E
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)4 I3 D2 Y: K) N: a& K
7 u1 H& R. {) G: {# l- v
實做的考量
( F! j; U# }1 S- }9 u3 n7 u: L1. 實做上min()跟max()應該是一起做的
6 S i9 X, ?; A6 Y3 l3 B if(a>b)
) w$ W* x* ]0 Z+ R min = b;/ u# T- ?6 E& p% _. l
max = a;( N3 B% l5 l( b s
else6 O. a( {+ X. d7 n" ?
min = a;# t& N0 K( l1 f& ^' {7 `
max = b;9 W+ \3 I% L2 \5 _+ n& A
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
8 f/ ^8 R/ F& Y v1 B3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
7 d" u1 T8 z1 O: X) }- [P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|