|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
0 ^. [9 }/ D! V# U/ y' l至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.- S' P' V) g( S$ U
7 m! C: K# o8 j/ l) I: A |舉個4進4出的例子:; W; ?8 ?0 e& O+ _6 A, I0 i( ^
input [word length] a[4];
# K" l2 x5 `, k: Breg [word length] b[4], c[4];
* O& p) [8 d) i o9 l第一次排序, a, N& v9 ?- _3 u, [
b[0]=min(a[0], a[1]);5 i Z0 l( k% K" B
b[1]=max(a[0], a[1]);
; ^* \6 K" i8 lb[2]=min(a[2], a[3]);
# C7 M) z3 d7 f3 E; A. R! F5 J+ hb[3]=max(a[2], a[3]);2 `6 K0 c5 c/ @3 m! D
第二次排序
* V$ k$ A% M, d* w4 S: U4 F+ uc[0]=min(b[0], b[2]); //real minmum7 R' b1 r; @5 x( W# b7 B0 Q
c[1]=max(b[0], b[2]);$ \: x1 K' W D4 F# C0 |% @6 D
c[2]=min(b[1], b[3]);8 J9 R1 y+ j5 e( @
c[3]=max(b[1], b[3]);//real maximum4 n, R1 S8 |- `
第三次修正項
/ v1 R4 e# E/ M+ @3 h+ F' X3 y: q$ hd[0]=c[0]; //real minmum ?' l& T* o/ K" ^: u
d[1]=min(c[1], c[2]);
) @ S6 z/ w0 S! h3 M" Fd[2]=max(c[1], c[2]);
. I# {8 l5 g0 V7 V1 Z1 `d[3]=c[3];//real maximum
& i n& r, E4 c/ m# V: [# X. l//d[0]~d[3]就是依序小到大的答案
/ C6 Y3 Y7 T8 S/ l
5 p6 X7 N- t$ ?這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
1 x: F9 m* j- V) J2 O; j o3 i" @3 y6 Z: P$ {! r
實做的考量
1 Y1 G- _9 E6 t O; `% r1. 實做上min()跟max()應該是一起做的
* \! | q$ W+ v if(a>b)
7 Z5 S; ?# @; Y min = b;
/ H/ B& {3 @2 x+ S9 w# g max = a;' e7 \( @- @# o0 Q
else
9 |, Y3 O8 g/ T! d6 P min = a;1 R, G& V& C: \4 z8 b+ l
max = b;: L6 p9 J! h: w0 K0 n* h2 f
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.6 p' o/ `( ]/ Q( G) ]9 [
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
' I$ p8 m! o3 {# oP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|