|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
( m! w9 c& C* }, a8 P7 d至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
/ y g5 O1 p. o+ N0 m
5 u) i- [. C6 `- |舉個4進4出的例子:
+ J ]5 p& [* ~* V* O E2 y& rinput [word length] a[4];9 s3 K& h0 N! [" C7 i& W- |
reg [word length] b[4], c[4];2 Y" b# l, a7 W
第一次排序( l- a& z# P$ `/ a/ ]$ u) K( z
b[0]=min(a[0], a[1]);
4 B3 q: N5 Q. a" db[1]=max(a[0], a[1]);
; Z; o3 o# g3 a) fb[2]=min(a[2], a[3]);
- {0 g" O& g( H, n$ Ab[3]=max(a[2], a[3]);
! w2 c. v$ Y( u9 ?第二次排序) {) n, l& V$ p Z/ Y1 w
c[0]=min(b[0], b[2]); //real minmum
; D" g) v& F, c7 {c[1]=max(b[0], b[2]);3 ]% a6 H" }: n) U9 x
c[2]=min(b[1], b[3]);
5 t( h W* ?7 k3 P6 E9 G0 D/ \c[3]=max(b[1], b[3]);//real maximum+ i0 r' Q5 X8 z3 K' h
第三次修正項
* S/ S6 I" Q3 Z" r- I8 wd[0]=c[0]; //real minmum
" Z: W% g- M& @9 ^" w! r9 X" k: j- ad[1]=min(c[1], c[2]);* N( H p% n( r5 O& [' S5 L
d[2]=max(c[1], c[2]);# I8 T7 G4 d+ ^$ W, V/ ~
d[3]=c[3];//real maximum
# Z0 [0 l2 e& A8 m" k! Y5 h& D//d[0]~d[3]就是依序小到大的答案
) _9 L& s/ B( n: C% k# V) K2 }* y- t. a% x9 {2 ?1 k5 G; r4 A) L
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)4 p- x5 V4 d7 u# b1 o& T
. T4 m" V* x' G
實做的考量/ G: |; @- j+ U) \
1. 實做上min()跟max()應該是一起做的
: N( h5 W2 G* `' B if(a>b)8 b+ L. T2 k: v7 _* P$ c
min = b;: `: C, ]: e! T8 R6 O5 [/ C
max = a;
- D' L* Z$ v' ?8 G3 [3 r else% z, a, G3 A5 l7 q" a7 j) w" l7 Y
min = a;
' K8 \9 [0 u5 y" s% F, L% c. r max = b;2 ^2 G" G# u2 E7 s; D
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
- c/ b3 g7 p7 S3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.' r* S6 n; r9 d3 P5 P# D4 p
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|