|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
2 S) K% H* r. x! Q& q至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
6 w$ \' ]) u$ x5 i! |4 D
& ^- N, y& {8 \! W% n! s% t舉個4進4出的例子:
9 x, O" l3 ]0 o5 [/ v' u) ?input [word length] a[4];5 e' M( F1 j% z- C# h' y2 F2 o
reg [word length] b[4], c[4];1 _ q# W& V) p* G% q) W
第一次排序$ I1 E0 H% s# x8 ^* l D8 {9 _
b[0]=min(a[0], a[1]);' ~0 K: N" W" V* L# `# _+ C
b[1]=max(a[0], a[1]);
: m( @5 t2 J9 r- J1 ]$ ub[2]=min(a[2], a[3]);; w5 M {& Q& w& h4 o+ f: q! q: [
b[3]=max(a[2], a[3]);
7 V0 |* X6 K8 a7 ?' O; g第二次排序4 d5 ~* ^% l/ E# |
c[0]=min(b[0], b[2]); //real minmum( L; u! \& D a$ Z/ y' q
c[1]=max(b[0], b[2]);) _# C; v# i6 L' H7 C
c[2]=min(b[1], b[3]);
. Z6 O. |+ B% y5 S9 C$ Gc[3]=max(b[1], b[3]);//real maximum
4 \6 a0 ^0 \' [: A第三次修正項
; q4 b" x$ ^7 J h! H+ qd[0]=c[0]; //real minmum
' s$ O% u2 p) ]# Y2 V5 {d[1]=min(c[1], c[2]);
9 |/ T% \( Z0 V9 Wd[2]=max(c[1], c[2]);6 G: V- ?. x O$ a6 b( z0 \
d[3]=c[3];//real maximum! E; I1 x; b5 o1 [9 `- A1 `- C
//d[0]~d[3]就是依序小到大的答案, C1 ^, H+ d# E
9 k1 w+ V( m Y3 C這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)' q; T, a# U# h3 {! M1 x9 n
6 `: A% [% h/ g& H$ J4 M9 k實做的考量/ Y d6 d6 D- v& K
1. 實做上min()跟max()應該是一起做的; d+ U) T) X8 @1 ]
if(a>b)
3 R' o+ V6 e7 ?& P9 `# s* f min = b;
* |+ K$ c$ J/ [8 m1 V- i max = a;
" b2 `- X) p% \$ Q" `& C else# @$ @6 D, O- g" l$ J
min = a;
) k! R# y0 A3 Y- _* p& b6 _2 ? max = b;4 g0 z4 W! \0 \: J1 T& n2 Z& ]: Z
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.$ M7 t3 E7 F' F/ P
3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項., e7 m; L5 Z: p! W
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|