|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
2 ^& O. x t1 j1 x至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.0 K& V. Q" ^! U, t( z
- |. E" f% t+ h; ?! z$ C5 ?& L% h3 y
舉個4進4出的例子:
4 S n+ Z! w4 Y# Rinput [word length] a[4];& {( U) _1 M6 ]4 P: J
reg [word length] b[4], c[4];
w. o* t! R n# W1 x第一次排序 [. ]2 H4 g0 n' h
b[0]=min(a[0], a[1]);, b7 X& I" @6 v% Q: J, Z
b[1]=max(a[0], a[1]);6 J. Q/ l3 A8 Q f& c9 C2 ]
b[2]=min(a[2], a[3]);% A+ ?& s+ Z8 u) O& d3 B6 c& w) h
b[3]=max(a[2], a[3]);' R9 B$ _- e# T) a
第二次排序. j M* o# l4 x7 `
c[0]=min(b[0], b[2]); //real minmum( ~$ X | Y' o9 L% B" E
c[1]=max(b[0], b[2]);/ [3 f7 h- K7 t ?
c[2]=min(b[1], b[3]);
/ D. t: M0 J/ I, j: Y" Sc[3]=max(b[1], b[3]);//real maximum# q" D; E- h* y) z
第三次修正項
/ o8 x9 ]: C8 R4 Z2 ~d[0]=c[0]; //real minmum
+ V0 K( {7 |+ X! f+ ~" d0 }d[1]=min(c[1], c[2]);
% \( |8 ?$ ]' \" b2 ]. f5 hd[2]=max(c[1], c[2]);4 a- s' z0 h2 y' S. C! o! |3 B
d[3]=c[3];//real maximum
/ Z* W* y/ I; q6 N( O C' b, N//d[0]~d[3]就是依序小到大的答案
Y0 \. ~2 V w( H$ t7 T2 p$ [0 R7 T
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)3 t( z( a8 M; ~. P' K2 l' g
+ s) F. \/ E) T+ f實做的考量
! W0 m7 U" m: m1. 實做上min()跟max()應該是一起做的# }8 Q, O7 c; L; N( D( Q2 y9 {
if(a>b)& A3 A. t* e8 W
min = b;4 d/ j. f3 T& a) m' y! y
max = a;5 y7 ?! b+ v5 w* J2 a
else* h, m8 b$ w; Q9 E+ Y
min = a;
$ n6 @( @; a6 e max = b;
Y/ W" q/ T1 J2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.: p r2 X1 _6 v p+ M# ^ _
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
4 \! n- L! m- l$ }% [" |P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|