|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
# v4 }' z4 w5 a2 O) o8 ^1 w2 c至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
" t6 n; v( J) v: y9 O$ ^( G" G; R: `6 [- ]& E0 R
舉個4進4出的例子:
7 E- z! ?0 Q4 g$ h- b: ninput [word length] a[4];
/ F" i% i, q" b: s# l" t- Greg [word length] b[4], c[4];4 h b8 Q5 O: V
第一次排序
% D! S& j d1 P+ S9 F' A {- d/ xb[0]=min(a[0], a[1]);' v: B+ u6 Z* u4 O
b[1]=max(a[0], a[1]);" J3 y2 H4 c# G9 q" O* y
b[2]=min(a[2], a[3]);5 W' C* j# c/ d6 ?$ N, G& i
b[3]=max(a[2], a[3]);* O4 D" `* [, d8 y( c* I! h
第二次排序
! n1 X2 c$ r& ic[0]=min(b[0], b[2]); //real minmum) G; Z/ s# i$ s- u+ o# y7 v& {6 |5 d
c[1]=max(b[0], b[2]);2 P7 i# m5 j7 Y& n8 [- V
c[2]=min(b[1], b[3]); n* |3 }% J# {9 h/ K3 z6 N& a+ ^
c[3]=max(b[1], b[3]);//real maximum
1 e- |& j. Y- Y5 y# H% m5 ?' ?第三次修正項) k* U& t6 V. d d# h: F
d[0]=c[0]; //real minmum( `* s0 Z+ o' }- }& @( k
d[1]=min(c[1], c[2]);
) B' D# F6 E1 _$ od[2]=max(c[1], c[2]);
% O0 J" z4 Z* L4 H3 jd[3]=c[3];//real maximum. i/ c2 i" C3 k0 f4 X8 T
//d[0]~d[3]就是依序小到大的答案
6 W) z/ t' ~, ~; B. q# Y$ c2 ?
( a1 d/ n: Y& n$ s這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)4 I/ d" Z4 b: R% n" `4 Z1 w' X' y
! E# _4 L- I9 }) `實做的考量4 s+ [/ X8 M# Z' ~
1. 實做上min()跟max()應該是一起做的
: Y0 C0 c O: o! l6 \* K if(a>b)
( p- p" ]; s: W6 Q8 ^ min = b;' X) _( |4 v! r0 M7 D
max = a;6 ?* F0 U. A! H; r5 i
else/ u5 x: d2 D3 r9 a# o- \2 r
min = a;# F4 N8 i1 A% V! u- ]# T+ o# J7 ?6 |
max = b;
+ x* c' G* N1 G; D: I: s* }0 a; n2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.# {- R- ^7 l! J9 R8 a4 t( ^ |' q
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.5 E6 {4 P3 m% P- M$ D$ q6 Y- w% \
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|