|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
( b$ x2 g# J; d: i) V- P至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
1 c. u. R% y+ k5 Z$ U3 p) ~) ~$ q6 Z5 P
舉個4進4出的例子:
' v8 E* n$ r2 Y2 X7 dinput [word length] a[4];) d7 u' g$ x; I- E
reg [word length] b[4], c[4];. M& p8 d; i! |1 Y
第一次排序
/ q+ z& K J* f$ t4 r' S. pb[0]=min(a[0], a[1]);: [7 |( K. e$ B( j9 p# k5 L" n
b[1]=max(a[0], a[1]);
Z2 l" r1 W: u* P- Jb[2]=min(a[2], a[3]);6 v& h% S6 N3 w9 P4 k
b[3]=max(a[2], a[3]);
3 E" [- u' g) {第二次排序) Q3 f7 ~: H. G8 U: Y
c[0]=min(b[0], b[2]); //real minmum
/ n9 I6 l; S/ H) z, {& ^; J* ec[1]=max(b[0], b[2]);
, d: M' i" t, ^* }& x6 qc[2]=min(b[1], b[3]);8 K7 C" S9 W* o# Z7 i+ o
c[3]=max(b[1], b[3]);//real maximum- z/ S' |. w, v* s
第三次修正項
/ ?& L8 v# _) O- X/ _6 T, b9 g3 dd[0]=c[0]; //real minmum
( t% T/ F; s/ o* }; ^5 @5 F* od[1]=min(c[1], c[2]);5 K( m7 n& j% T/ V) K f
d[2]=max(c[1], c[2]);' }! a4 S8 Z" \
d[3]=c[3];//real maximum+ e7 C9 ~7 p, u
//d[0]~d[3]就是依序小到大的答案
' i! k7 A/ J6 W9 |4 o: k
% C. I; C& i; {% q( ~這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)- w! F& R) S/ G. \
: M0 u) w, O* t# e
實做的考量$ F7 ]3 S) ~5 s( i, @
1. 實做上min()跟max()應該是一起做的
1 u4 y1 \8 R, I" @2 g! E& g. v if(a>b)1 `! s" U5 u7 D2 s
min = b;
6 P9 a: l4 T! B& W- r9 F max = a;3 n( N/ l- ]' Y# J* A
else
3 l/ S. T4 o4 M2 i min = a;
3 v5 ?; Y8 J- Y0 I i& ?# ?& C max = b;
@, [$ s' m$ u' Q2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
( x( ^+ l* O. Q5 T9 p8 y, ?1 g3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
$ Z2 n- q' A4 H3 J+ CP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|