|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案/ i4 l. M2 k! ?+ Z- G6 m1 N
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.% I C( N8 |2 i; A/ r0 h& d% K3 r
, v4 \5 m( M$ B( f: e: k v
舉個4進4出的例子:
% T; d* e% g; A3 Minput [word length] a[4];
( @9 }+ N+ s3 g) M6 T$ v- Q1 ireg [word length] b[4], c[4];
) M, w' i( T+ T U9 r: P第一次排序
7 \5 g! N7 u' M5 Cb[0]=min(a[0], a[1]);# O G$ [+ ], [) G
b[1]=max(a[0], a[1]);
' y6 Y! N6 Z( Q1 |( `b[2]=min(a[2], a[3]);- h) X5 y V1 v n5 G/ y' F
b[3]=max(a[2], a[3]);
$ F1 f, X$ M1 a- Q第二次排序
! V1 F ^% X& P6 Bc[0]=min(b[0], b[2]); //real minmum& {5 [3 @# D) E
c[1]=max(b[0], b[2]);
/ }: I4 f6 x0 P+ |2 m7 M0 Ec[2]=min(b[1], b[3]);$ A( z( M' R3 e/ v
c[3]=max(b[1], b[3]);//real maximum
+ |1 @ R7 m- A' C: H& u第三次修正項/ D$ z7 F4 N: ~. X1 x. M
d[0]=c[0]; //real minmum
. j2 j+ R5 ]& P8 q! _ zd[1]=min(c[1], c[2]);6 W3 t3 N# `1 a. x) p( ~' M
d[2]=max(c[1], c[2]);# b. G; ~! D# ~8 R9 d/ e; P
d[3]=c[3];//real maximum' q% }4 c" `. n( _4 _6 ?
//d[0]~d[3]就是依序小到大的答案
8 V0 ^+ ^' u' b9 s* Y5 u( Y9 O3 ]/ [0 K& \
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)) H O& _+ W6 A; l
& P$ c6 J( y7 Q) D1 y! _# v# A實做的考量
+ L& U' o! K3 Q1. 實做上min()跟max()應該是一起做的 n5 e+ Y! h0 x- R% @
if(a>b)
, {7 c1 b! U. j- v# p2 ^3 o3 B min = b;; ?8 L; ~- Y4 h& b
max = a;) Z+ ?5 f; r' O4 F+ i# ~' o
else
8 m) P3 D9 `1 A" |9 g9 j/ l min = a;
( x7 j7 ~6 D4 E; s% l max = b;
5 A K( Z3 [+ r+ m2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性./ V. ], @, s/ K! D
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
# l/ r) R& ?; U, t1 W; p8 WP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|