|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案6 r2 t, H" L V, i
至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
7 t# L; E7 h& ~& [) q4 F$ P
- A$ ^7 y+ q5 f, p& z! ~- _舉個4進4出的例子:
+ ]. h7 k" }- [! T; o* [) \2 Pinput [word length] a[4];+ i+ h- a" A+ p9 r# f+ s* {/ k
reg [word length] b[4], c[4];0 V' l$ B7 u) D
第一次排序
, y& c$ ~" u% u6 v& _( r/ [ Qb[0]=min(a[0], a[1]);
5 M. M" w2 Q0 Ob[1]=max(a[0], a[1]);
: z! A( d& E/ S; n$ C. d' Zb[2]=min(a[2], a[3]);
3 b! |, d7 V& o5 Y4 @! ^9 pb[3]=max(a[2], a[3]);
5 f/ V. h3 p+ S- @第二次排序
8 F6 y0 f- p) e+ e2 lc[0]=min(b[0], b[2]); //real minmum- c- b' l7 ?. i. W$ a
c[1]=max(b[0], b[2]);
+ w; G3 a9 w7 w! P4 ], Ac[2]=min(b[1], b[3]);
6 i7 E8 C! q& Q/ w3 H$ Nc[3]=max(b[1], b[3]);//real maximum
" p& ^ \1 D- K1 U第三次修正項
, Q9 K# g9 Q" B: ~1 z1 S% h, Bd[0]=c[0]; //real minmum
4 f& q/ ?* @% p) ], b' bd[1]=min(c[1], c[2]);
i/ h: k% K" ?: sd[2]=max(c[1], c[2]);
, U: q$ K. H, c& \' [. k! m$ Bd[3]=c[3];//real maximum) A6 s* k6 Z% s% `" o t7 L
//d[0]~d[3]就是依序小到大的答案
: }9 M$ E5 ^. M% S2 ^' `. c2 I6 \/ A& A/ g, O2 Z; F
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
% g5 f c2 u/ N( ]
+ e4 @7 `& b# {: V實做的考量
. ]9 |* n4 l+ c1. 實做上min()跟max()應該是一起做的: F3 ~* U$ @; e9 E4 R, B
if(a>b)- W1 \; \$ B0 _: t2 n, N
min = b;' A' f7 E! g& G% i- s
max = a; J, ^& w" H4 k2 F3 ]1 I# X
else+ F7 D; }" ^( j9 {! s
min = a;
: M+ s, O8 q; n: x5 w U8 R9 T! d max = b;
& E7 D2 V+ K" ?' {4 I2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.; v/ ^' e* w2 r* _! P, g) T8 h: h; ?
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
+ d1 N. V5 R: ~% t5 VP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|