|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
4 U2 Z) s& [+ |! r" j* i9 I5 ]至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.
+ n/ n, M" ?( v; F3 z9 M+ E+ U p6 b, ?5 I9 {4 z* x* L0 E. s
舉個4進4出的例子:
: N8 [' d+ E7 ? k3 q8 x% Iinput [word length] a[4];
6 X& a1 w7 {6 I% G4 g* n" ^reg [word length] b[4], c[4];/ ~: V2 u! p i5 t! k( k
第一次排序
/ ~8 j2 Y; ~% o9 i( [b[0]=min(a[0], a[1]);% p* L1 u" N) {7 P" g, h, h5 `9 i6 z
b[1]=max(a[0], a[1]);
, V5 t' {! I( S* h/ @b[2]=min(a[2], a[3]);" k. A5 D2 q" O! ]" n
b[3]=max(a[2], a[3]);
+ h% P/ k K& C2 a" w第二次排序+ N7 Y: @) F( ~: d& \, r
c[0]=min(b[0], b[2]); //real minmum/ @, k7 W( \9 G% G
c[1]=max(b[0], b[2]);
! Q8 A9 D* O8 lc[2]=min(b[1], b[3]);
6 O5 J$ v7 x. K1 A8 R3 B; Zc[3]=max(b[1], b[3]);//real maximum) o0 Q6 ^) H8 X0 I
第三次修正項
$ U: n8 ^: x. C1 x7 R: bd[0]=c[0]; //real minmum
7 r! P+ |7 M* \8 ^% E1 A7 u3 Id[1]=min(c[1], c[2]);0 s# C! i. @7 ^3 N; `
d[2]=max(c[1], c[2]);
* s$ U E9 P" K* w, od[3]=c[3];//real maximum
0 G5 V `- [' Z& b+ j//d[0]~d[3]就是依序小到大的答案9 D) O2 H) @# _) x e7 L+ U7 N* P
& z! e# e. n; S- P5 ?
這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
- S3 ^& U H; N/ w& C6 x z
; @" A5 m. ^) ~$ a實做的考量
# u8 W/ I4 t$ w/ P- a( Q1. 實做上min()跟max()應該是一起做的
& q- r, z- h5 Z) N8 k& ^ if(a>b)! ^/ `7 [, T0 ?& O
min = b;
/ k+ U" H) h$ d* V" Z max = a;
7 K, Y6 I1 Z1 m4 [! e9 G else% d; B) x0 Z) b- o
min = a;
/ a8 j' q4 A1 q max = b;: k' K& i; t8 \# c0 B3 H: P/ p
2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
7 F: B4 H' \! W. Y* D3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.6 t5 ^' i9 d1 Q/ X
P.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|