|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
& A! b0 {# P. S% y4 Q至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
( m" I7 H6 G, X) Y# Q
; h7 V0 q, x1 o/ X4 r& K1 G舉個4進4出的例子:
f0 l7 ]1 i8 N6 pinput [word length] a[4];$ E; J: [% N9 ]# f
reg [word length] b[4], c[4];
( M/ o R8 H+ f* i0 S- \' X3 n# L第一次排序% u6 P9 q+ u/ W: |* c3 H' z- R
b[0]=min(a[0], a[1]);: i+ H" y. j7 I2 K- R8 E' N
b[1]=max(a[0], a[1]);
, n& C; S' Q6 h6 ~$ A, H: [0 h. ub[2]=min(a[2], a[3]);+ f. y2 j* c& V: U9 x0 [- H
b[3]=max(a[2], a[3]);6 }/ t/ Y2 {& n
第二次排序7 W! D# u, o' R0 a3 r
c[0]=min(b[0], b[2]); //real minmum: @" x8 M0 n5 u2 p+ L- _
c[1]=max(b[0], b[2]);) N; s& Z: ~3 B
c[2]=min(b[1], b[3]);) R% c0 V. M% R: w$ k; H) p
c[3]=max(b[1], b[3]);//real maximum
# s2 ~( T/ X2 O9 W3 X# Z! g1 i; E第三次修正項 {& r. J4 a1 w8 D" H# ?
d[0]=c[0]; //real minmum
: U8 g; a7 z- P; l7 ~d[1]=min(c[1], c[2]);1 l0 Q A0 d$ m5 v) |* H" a
d[2]=max(c[1], c[2]);
1 L( H1 f9 ~4 o- a# Fd[3]=c[3];//real maximum$ ?4 }4 M, E6 \) F. [
//d[0]~d[3]就是依序小到大的答案7 H) z4 L n6 v# i0 ]5 F8 u9 G
9 m( R( a9 y5 B4 X這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
4 h- c D7 c1 {% O) N; j$ b& B3 T7 H" g- C4 a3 }# g) _
實做的考量: }) Z- ~/ {" ?
1. 實做上min()跟max()應該是一起做的
( `9 {0 o* R7 O7 g! F if(a>b), V6 b: G- D# n Z1 m E
min = b;* J9 Y* c0 @7 O! M6 U
max = a;/ x6 u( R7 Z' f- _1 o3 S6 O1 V
else2 \* q/ U3 Y6 F7 S0 N: d
min = a;# e$ M3 t, j' W& e" @
max = b;
# }" w; J9 p" M* h- [5 ^* x2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.# m# {, V) c4 K' Z+ \+ A. ^7 `
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.# ~' s1 p8 B4 F9 z% e8 ]8 O! B
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|