|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
8 n0 k" r- o: @( I+ x+ C8 Y至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
+ e8 r. F" S# ~
3 r0 N( ^; D8 q- x, i9 F+ N: X3 T舉個4進4出的例子:% ^% y E; ^& \, F
input [word length] a[4];
9 l+ E- o3 r0 ureg [word length] b[4], c[4];0 O3 `" P( j8 X8 M
第一次排序& X m8 R7 _& Y& c0 f4 U
b[0]=min(a[0], a[1]);" o/ c" H4 Q: c! t1 D7 g
b[1]=max(a[0], a[1]);
# \ i" V1 j" f2 Lb[2]=min(a[2], a[3]);
k$ h; b! F/ b3 w. a1 F+ d Db[3]=max(a[2], a[3]);
7 c0 y0 k3 J! o6 y# d第二次排序
$ Q! A9 z m% _2 zc[0]=min(b[0], b[2]); //real minmum" L ?: d5 H/ r8 e- e
c[1]=max(b[0], b[2]);& I9 |0 b! \* f7 g
c[2]=min(b[1], b[3]);5 v) T. G% g: U5 ?4 J
c[3]=max(b[1], b[3]);//real maximum
+ G i0 s5 r0 j6 E' u8 f2 n第三次修正項# T# q8 Q H* R5 K" L9 @/ F( ?
d[0]=c[0]; //real minmum
. f( W& A4 \& `$ s1 fd[1]=min(c[1], c[2]);
& c' j; e+ F3 o8 Xd[2]=max(c[1], c[2]);! T" `9 j) K3 a# o, I% n9 a, ]
d[3]=c[3];//real maximum: W* }% t w' ^; P6 b
//d[0]~d[3]就是依序小到大的答案
" W- S& l6 v4 v1 `4 E7 S, a0 E/ v, [1 R
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)0 _2 E! B' K" X8 ?/ x: u
9 [1 V! P' L* ?) p3 L實做的考量
5 j3 l" n) F. `6 k) L1. 實做上min()跟max()應該是一起做的
! t4 w. P. R" _* I1 S if(a>b)) B: r( j. M- w6 X; P
min = b;; G' X& V) }, Z7 j8 g0 k& a
max = a;- d9 e" b+ A2 b# w( G8 b/ F8 N
else
) o# z" v2 ]1 Q4 | min = a;& _3 L" H# }. J* m& d" c) `
max = b;
' k/ F4 W' z$ y/ }# I2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
7 s$ \5 @* i3 q5 m2 I0 a3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
5 t( ?! \3 G' Y: d ^P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|