|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案& K- b1 h! ]: \
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了., u% }. z: b- S$ Y
( o) t: W" f$ q7 r- m1 N" D舉個4進4出的例子:7 I: L4 P5 I) v( r- D0 i
input [word length] a[4];
& }- P7 `: B- `% D9 ureg [word length] b[4], c[4];
. B2 u& T* E/ H8 ], i1 D第一次排序8 v0 v/ l5 g/ ]7 ?8 {
b[0]=min(a[0], a[1]);
9 C& N% d; f j' C4 q' N* ub[1]=max(a[0], a[1]);
* \5 F) t* d# X+ ]1 Hb[2]=min(a[2], a[3]);
' i+ O2 O; P( V- lb[3]=max(a[2], a[3]);
" W' {: ~4 x: Q8 ]/ s$ A L8 x6 o第二次排序
, P8 u- f, r/ w. @c[0]=min(b[0], b[2]); //real minmum
$ N6 {" B9 A8 x) T% \c[1]=max(b[0], b[2]);
! r( K" O# Q4 b, c' |- m/ [6 X+ mc[2]=min(b[1], b[3]);& y3 {7 o2 T- Z8 A* U
c[3]=max(b[1], b[3]);//real maximum, n4 y! |; ~5 G0 ^9 V* a
第三次修正項
0 r8 }) ^% m7 B' r2 ?d[0]=c[0]; //real minmum
/ V5 f! X7 x& l7 }. J! bd[1]=min(c[1], c[2]);
3 O9 T' F; X6 U6 o' R( {d[2]=max(c[1], c[2]);( d( M" c9 A4 O& Y
d[3]=c[3];//real maximum
+ @% G3 Y' q+ q3 \. }$ C- x P* N//d[0]~d[3]就是依序小到大的答案
; I9 i2 v- x1 i
1 M1 {% m+ F9 F/ S7 ^8 z) _這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要); }4 T# S a1 { u$ h- c7 z
5 M3 U3 L# p) }: t' t實做的考量) z* m! A4 P- _' F% c8 |- i
1. 實做上min()跟max()應該是一起做的
/ z# {* q8 s) B* W if(a>b)5 D. X: |7 k) i: U+ ]
min = b;
! b5 w9 C! ]& p! ^; m: u6 `! W max = a;2 C$ \ y B# {) r2 u5 P+ | m' j
else! t6 ^+ @2 H, W O# i7 G
min = a;5 I4 O5 B; f$ r) W2 W0 ^3 C
max = b;) q2 T+ q5 c* b/ N, I/ ^
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.3 r0 W, x; {6 F! ]
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.7 V- n& t* c, M; u# T- c
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|