|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
$ Y4 W3 c& C; E% J* U1 A至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
; v/ ]% c# N8 o% B+ P
' V1 x8 F f1 k' f, J舉個4進4出的例子:! m5 [" ]' Z; I" M
input [word length] a[4];
+ B! s) W0 L9 v% r4 i6 o8 B$ Ereg [word length] b[4], c[4];1 b6 N, g& R. [" F9 q1 X
第一次排序& ^& n! }" a! s0 w
b[0]=min(a[0], a[1]);
# C$ N! ~8 U0 Ub[1]=max(a[0], a[1]);; z0 a* H7 R/ c& s* n0 @
b[2]=min(a[2], a[3]);7 }/ _) ]/ Z3 V1 p: Q% q5 E
b[3]=max(a[2], a[3]);
5 P6 [9 ?" F- X: e0 y第二次排序: f, s c4 H9 o! W# g0 O
c[0]=min(b[0], b[2]); //real minmum- X9 R2 v4 }0 P- ~" w
c[1]=max(b[0], b[2]);
* B* q: Z6 l* R/ k8 U, J1 Dc[2]=min(b[1], b[3]);
1 o8 z0 k9 a1 o: X3 l6 G, t7 Ic[3]=max(b[1], b[3]);//real maximum
/ Q. C/ a4 e) K1 Z0 n第三次修正項: e& J& Q# h* ?* b C
d[0]=c[0]; //real minmum+ j0 n4 n9 t2 Z: H& L
d[1]=min(c[1], c[2]);
7 t/ j9 e- }4 Yd[2]=max(c[1], c[2]);' x* A' X. h% H1 C
d[3]=c[3];//real maximum
+ Z1 L1 v0 Y! U* ]//d[0]~d[3]就是依序小到大的答案
( \. \8 Y' o9 T# L* T* Y; A; u" N! j0 N, a
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
+ e# C4 t/ S# U. V
0 i. V/ y1 N& m, r3 s實做的考量
) d0 E: f/ ~, I. U3 u+ ^1. 實做上min()跟max()應該是一起做的
, B W. N N' z if(a>b)* i' y9 C7 n c& F" c& R
min = b;
# P5 q0 w4 {/ M8 q b0 J- t, X max = a;
* e: ?8 b0 r& Z- | else- r7 f g& S( b0 x$ y* J0 ?' v' r" k
min = a;) U4 {% L( S5 `. q# j4 d) |3 U
max = b;
+ X3 b$ M7 T4 B9 L2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
s$ ^, @2 n" n3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
8 {+ L; Y% S! ?0 i; @. eP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|