|
對於3x3的median filter你可以考慮22排序(這是我之前自己用的方法), 只要多排幾次就有答案
- e T6 ~% O' z9 w' ~5 m3 e% N至於real time本來就不是問題, 除非你要在FPGA跑超過300MHz以上的clock rate (就算要跑更高速也是可以的, 只要從演算法著手修改就行了), 用ASIC的話速度就不是重點了.3 L9 V$ Y R1 d" |7 G/ [( h
' B- Z$ D8 v5 }! j% o+ c8 o6 o
舉個4進4出的例子:1 J5 h+ Q. ^- B
input [word length] a[4];- U1 e6 Y1 V* C+ \
reg [word length] b[4], c[4];1 n$ d$ q; H5 O& o$ X8 `
第一次排序
/ n' \: I+ R( n8 _' S& [b[0]=min(a[0], a[1]);
8 I. J; J4 n" D& z& R7 y: Q5 e( |b[1]=max(a[0], a[1]);
, {, D+ P/ e! d3 M/ eb[2]=min(a[2], a[3]);1 j: y7 z8 b# X
b[3]=max(a[2], a[3]);
1 a4 D3 L/ ?' k* e第二次排序
: h& D( i8 q: f8 e* y2 m5 U# Wc[0]=min(b[0], b[2]); //real minmum5 t# \: Y0 s+ Z3 s; v
c[1]=max(b[0], b[2]);2 D! s+ M k4 C
c[2]=min(b[1], b[3]);
% V& k, A) s- e' }' gc[3]=max(b[1], b[3]);//real maximum
. [, I3 H8 t" u" s! \, t6 A第三次修正項
5 t1 L5 e4 S9 P" U$ H3 Sd[0]=c[0]; //real minmum$ |4 T5 y0 C2 j2 ?" q5 W) ~
d[1]=min(c[1], c[2]);
; m& M, t$ i$ A* Q+ i+ Hd[2]=max(c[1], c[2]);
+ {) J# ]' H% ^( R/ w& y) Z! i' S/ td[3]=c[3];//real maximum. S7 z8 ?: J$ |3 U ]9 J9 c& u+ Q
//d[0]~d[3]就是依序小到大的答案
6 W: u+ g W+ z
7 U/ K# o" b7 j這個方法對你只有拋磚引玉的效果 (照做當然也會成功), 對於median filter, 建議你修改一下這個方法, 並且省略很多不需要的運算 (因為你只需要留下中間值, 其他的值並不需要)
/ G' L' }5 t" V7 `
3 S+ |$ N7 g8 T3 J實做的考量6 h# v" o# [8 c, }0 I; X
1. 實做上min()跟max()應該是一起做的
" H- n/ E6 F! N' p1 } if(a>b)) y% u6 Q5 [" h4 I7 T4 o t
min = b;9 P1 G3 p6 J7 C4 ?$ f3 o9 y
max = a;3 \2 E% h* }. b# @
else4 P6 S* _/ B, D4 X; d/ H
min = a;
+ Z4 b2 S* @9 Z/ b" Y max = b;
5 E( {$ W. R) F* G( k2. 另外實做時, 考慮硬體的複雜度及執行的速度, 適度的修改一定有其必要性.
8 ^, O8 g0 I6 Y! }+ {1 ]3. 如果要做adaptive median filter的話, 除了中間值以外要多留下幾個項.
. U" ^" I; G6 a" W) j1 u0 T1 eP.S. 用我的方法寫conference paper記得要掛我名字哦...XD |
|