|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
$ }/ o7 p. v( o: C至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了." X- l6 A4 w. N
, ?: d2 o$ {# u5 N
舉個4進4出的例子:. q7 q$ ?) q, G- N: Z0 ^
input [word length] a[4];. g7 c o4 z) V& o
reg [word length] b[4], c[4];7 t s: E6 u C, Q. {' Z r
第一次排序
$ U4 [8 E8 O5 K. T( |, T: ob[0]=min(a[0], a[1]);
& ?( @ h6 z, e2 w% w5 Rb[1]=max(a[0], a[1]);5 {& }% H- f- w$ o) O* U
b[2]=min(a[2], a[3]);
7 x, d4 i2 K& Db[3]=max(a[2], a[3]);
) J6 q, o* [3 H# Z+ s `3 q第二次排序
# ~4 Z. ^' `7 m- Z jc[0]=min(b[0], b[2]); //real minmum( C+ W5 h, k+ f
c[1]=max(b[0], b[2]);
. y% E) G- ?3 V+ I0 t3 hc[2]=min(b[1], b[3]);
0 E/ a) m9 M# x' T" \# A: x6 Cc[3]=max(b[1], b[3]);//real maximum
5 m6 U6 A2 M) n6 }; {( b7 S5 C第三次修正項6 W2 S- y; U7 L; L# V* J! u7 }8 Z
d[0]=c[0]; //real minmum
# D0 ] N; l2 ^. w$ V& Z" Zd[1]=min(c[1], c[2]);
. Q' N o* g6 i8 c8 g" ?* [, `2 jd[2]=max(c[1], c[2]);9 S1 Y( _+ m" ]) G8 I8 @
d[3]=c[3];//real maximum; @2 O8 x0 o5 Y( n4 P; V7 L* L; M
//d[0]~d[3]就是依序小到大的答案
( u! i3 I# T* S! `2 r3 ^; l. c% n% }6 O; ?* i' P% i
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)4 b; L+ P1 ?; e) X9 S' B5 Q
9 L! U! O8 Z/ I( Y0 e. p9 _
實做的考量
( ]$ C1 z5 A# N( v& K8 l1. 實做上min()跟max()應該是一起做的
. y" ?" p% m# M if(a>b), x: f7 D5 j2 E' _6 @
min = b;
: k7 M3 D o9 z9 ?' n max = a;7 b/ {0 y. A; @4 r9 [. c
else
1 v( `5 s% f, x5 x min = a;7 U9 Y- u! y7 y
max = b;& i3 @% k. ]' G) L+ ]
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.% D2 r& c+ z; D
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
0 v& }3 h: l0 J# V( q; A) @( L$ GP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|