|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
! d$ N- r* |* y4 s& L$ L至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
: D, Q4 _6 ^# W$ A/ O
& h' T Y# x, P3 ` K9 P. l舉個4進4出的例子:$ G( Y3 j7 K! R+ d4 P
input [word length] a[4];1 W- X6 ~) a6 S2 m7 c
reg [word length] b[4], c[4];2 Q1 a/ L* s0 B g3 c
第一次排序
- i7 Q' O! }# N) fb[0]=min(a[0], a[1]);
5 g3 S" y3 M% m' @ U# ~+ tb[1]=max(a[0], a[1]);* W, ?+ s9 B5 ^6 J& Z+ w. ^
b[2]=min(a[2], a[3]);0 I Q" y5 h* b% J8 c; E/ Q/ V) B
b[3]=max(a[2], a[3]);1 U" {. _. t5 v! K- d1 u
第二次排序' `6 |8 I2 S4 \9 z0 S
c[0]=min(b[0], b[2]); //real minmum) m, u. B% Y }: y
c[1]=max(b[0], b[2]);" H# P/ K. e, \3 ?# L5 s0 F
c[2]=min(b[1], b[3]);0 t5 u# J! l% _2 W
c[3]=max(b[1], b[3]);//real maximum& t" w6 p" G2 m( H
第三次修正項
7 _$ E* S. B) F8 id[0]=c[0]; //real minmum2 C6 t9 e o# t% X* D& {
d[1]=min(c[1], c[2]);
8 Q; P( {* X7 d- sd[2]=max(c[1], c[2]);, p0 {4 y8 `" G2 L' a
d[3]=c[3];//real maximum& |8 _ d1 h* d( t, ^, I9 y
//d[0]~d[3]就是依序小到大的答案
' O# p: ]0 z# G" m$ h, [0 l3 |3 \6 u/ R
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要), G' p2 x! Z; S! n
" N+ e% ]' q/ d; a9 X% S7 B實做的考量& I! _3 m) W+ E0 m/ B Q S2 e
1. 實做上min()跟max()應該是一起做的! n+ B- U6 H, l% u
if(a>b)
1 n$ r7 i0 Y: m9 X' l min = b;
; s( I x) [7 U1 G+ @" q q max = a;
" m7 `& w, Y' u6 O else
/ f/ G, @5 o0 C8 q) [3 n min = a;
1 A$ X _% J/ @) E; n% R& N max = b;- [: a* A+ l9 w& o! R0 Q
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
7 p; ~+ B8 p5 x" D3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項./ Y3 ^0 k- @: V) S
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|